Voici le script qui monte 2 fichiers en RAM via la fonction file_ram
j'ai donc trouvé comment lire les fichiers via une fonction, je partage donc la solution
Je viens lire un fichier de notification alimenté par les scripts et en fonction des 2 fichiers des paramétrages je peux envoyer des infos à plusieurs membre de la famille
fichiers des notifications
notifications_script avec cette structure -> script;type;message
fichiers paramétrages
script_user.txt" avec cette structure -> y/n;script;user
user_notification.txt" avec cette structure -> user;channel;command
Code : Tout sélectionner
-- Authors ----------------------------------------------------------------
-- v1.0 pierrotori 20200909 Notification
local scriptName = 'NOTIFICATION'
local scriptVersion = '1.0'
local f_dry_run = 'Y' -- (Y) pour tester commandes sans activer sms
local f_notification = "N" -- (Y) Active les f_notifications, (N) les désactive
local SubSystem = domoticz.NSS_HTTP --[[ Systèmes de f_notification disponibles :
NSS_GOOGLE_CLOUD_MESSAGING NSS_HTTP NSS_KODI NSS_LOGITECH_MEDIASERVER NSS_NMA NSS_PROWL NSS_PUSHALOT NSS_PUSHBULLET NSS_PUSHOVER NSS_PUSHSAFER
Pour une notification sur plusieurs systèmes, séparez les systèmes par une virgule et entourez l'ensemble par des {}.
Exemple :{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}
--]]
local message = '.'
return {
active = true,
on = {
timer = { 'every minutes' }
},
logging = {
-- level = domoticz.LOG_INFO, -- Seulement un niveau peut être actif; commenter les autres
-- level = domoticz.LOG_ERROR,
level = domoticz.LOG_DEBUG,
-- level = domoticz.LOG_MODULE_EXEC_INFO,
marker = scriptName..' v'..scriptVersion
},
execute = function(dz)
local function file_ram(file_trt)
record_file = {} -- Table pour les lignes du fichier
local file = io.open(file_trt, "r") -- Ouvre le fichier en mode lecture
line = {} -- Table pour les lignes du fichier
for line in file:lines() do -- Pour chaque lignes
table.insert(record_file, line) -- On insère les lignes dans la table
end
return record_file
end -- function
local par1 = 0
local par2 = 0
local par3 = 0
--fichier et chemin pour sms
local dir_notif="/tmp/"
local notif_script="notification_script.txt"
local dir_file="/home/pi/domoticz/exploit_file/"
local script_user="script_user.txt"
local user_channel="user_channel.txt"
-- PROGRAM STARTS
dz.log('============== NOTIFICATION ==================', dz.LOG_INFO)
-- fichiers de parametrages
if dz.helpers.file_exists(dir_file..script_user) ~= nil then par1=1 end
if dz.helpers.file_exists(dir_file..user_channel) ~= nil then par2=1 end
-- si un existe pas alors pb
if par1==0 or par2==0 then
dz.log('Notification:Probleme de paramétrage', dz.LOG_DEBUG)
else
if dz.helpers.file_exists(dir_notif..'tmp.'..notif_script) ~= nil
then
-- reprise
dz.log('Reprise fichier notification', dz.LOG_DEBUG)
par3=1
else
if dz.helpers.file_exists(dir_notif..notif_script) ~= nil
then
-- on traite le fichier des messages
dz.helpers.file_move(dir_notif..notif_script, dir_notif..'tmp.'..notif_script)
par3=1
end
end
end
-- on traite les messages
if par3==1 then
-- on monte les fichiers parametrage en ram
-- parametrage script user
local record_script = {}
record_script = file_ram(dir_file..script_user)
-- parametrage user chanel
local record_user = {}
record_user = file_ram(dir_file..user_channel)
-- lecture fichier des notifications
local f_notif = io.open(dir_notif..'tmp.'..notif_script, "r") -- Ouvre le fichier en mode lecture
local r_notif = {} -- Table pour les lignes du fichier
local l_notif = {} -- Table pour les lignes du fichier
for l_notif in f_notif:lines() do -- Pour chaque lignes
-- dz.log('notification:'..l_notif, dz.LOG_DEBUG)
r_notif = dz.utils.stringSplit(l_notif,";")
j = 0
local r_script = {} -- Table pour les lignes du fichier
-- lecture fichier param script_user
for j,line_script in ipairs(record_script) do
if line_script:find(r_notif[1]) ~= nil then
-- recheche si user parametre pour script
r_script = dz.utils.stringSplit(line_script,";")
if r_script[1] == 'y' then
-- lecture fichier param user_channel
i = 0
local r_user = {} -- Table pour les lignes du fichier
for i,line_user in ipairs(record_user) do
--dz.log('script:'..r_notif[1]..' user:'..r_script[3], dz.LOG_DEBUG)
--dz.log(line_user, dz.LOG_DEBUG)
--dz.log(line_user:find(r_script[3]), dz.LOG_DEBUG)
if line_user:find(r_script[3]) ~= nil then
-- recherche channel pour user
r_user = dz.utils.stringSplit(line_user,";")
if f_dry_run == 'Y'
then
dz.log('script:'..r_notif[1], dz.LOG_DEBUG)
dz.log('user:'..r_script[3], dz.LOG_DEBUG)
dz.log('command:'..r_user[3], dz.LOG_DEBUG)
dz.log('message:'..r_notif[3], dz.LOG_DEBUG)
msg=dz.helpers.urlEncode(r_notif[3])
os.execute('curl -s -i -k "'..r_user[3]..msg..'"')
end
end
end
end
end
end
end
end
end -- execute
} -- return
Le script permet donc de traiter des messages en fonction d'un fichier alimenté par les scripts
La question est que lorsque que je génère un message dans le fichier des notifications,
comment je peux gérer l'accès au fichier si 2 scripts y accèdent en même Temps?