File: statusd_flashing.lua

package info (click to toggle)
notion 4.0.2%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 4,676 kB
  • sloc: ansic: 47,508; sh: 2,096; makefile: 603; perl: 270
file content (209 lines) | stat: -rw-r--r-- 8,149 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
-- Authors: Mario García H. <drosophila@nmental.com>
-- License: GPL, version 2
-- Last Changed: 2006-12-10
--
------------------------------------------------------------------------------------
--	
--	DESCRIPTION:
--	[ Multi Purpose Monitor for Ion3]
--	It detects if security logs, mboxes, maildirs, some files, etcetera were
--	changed. If they were changed in fact, shows a flashing (blinking) alarm with a
--	message text specified on settings (or default = !!).
--
--	If you specify your mail inbox it will do a flashing advise of new email.
--	If you specify a security log it will reflect your security warnings.
--	
--	You could specify whatever files or directories that do you want to monitor.
-->	All in Unix* like Oses is a file...
--
--	PLEASE READ THIS:
--    	  * This is another toy for Ion3.
--    	 ** It is not intended to replace or use Gamin, F.A.M. like libs.
--   	*** This is not a full whistles and sparkles power security monitor like Tripwire.
--     **** It is not a good idea to rely on this script to take care of sensible information.
--    ***** The level of recursion is only of one level for directories.
--   	    It only provides a very simple way to know if:
--
--  		-> Inode number was modified  or
--		-> Size has changed  or
--		-> User-group has changed  or
--		-> Access permisions have changed  or
--		-> Name changes (including file deletion and moving) then
--  		___________________________________________________________
--  		It flashes a specified message for 'certain specified time'
--	
--	PUPOSE:
--	To share a quick method for timers control and blinking patterns on Ion3 statusbars,
--	I mean, to fill statusbar(s) with annoying moving things. So don't use it ;]
--
-------	USAGE EXAMPLE : ------------------------------------------------------------
--	
--	If you don't know how to get this working please refer to Ion manual pages,
--	Ion home page or some other scripts. Then, write something like this on cfg_statusd.lua :
--	
--	mod_statusbar.create{
--		template = "whatever..  %flashing   ..whatever",   --> Modify this part.
--	},
--	
---->	And add somethig like this to:
--
--	mod_statusbar.launch_statusd{		
--		
--		flashing = {
--		files = {"/mnt/Feed_My_Dog", "~/Mail"} --> The intended purpose files (logs, mail)
--		log = ".ion3/flashing.log"	  	--> Some file in your $HOME[...] path.
--							    NOTE: $HOME is assumed by 'log'.
--							    Paths not in $HOME are invalid.
--		update_interval = 3000,		  	--> Time in milliseconds to update info.
--		flash_interval = 300, 		  	--> Speed of flashing pattern. (msecs.)
--			alarm_message = "!!",	  	--> Flashing Message (defaults are a good bet).
--			normal_message = "--",	  	--> Normal status message.
--			turn_off = 60,		  	--> This, avoids to show the annoying
--			  			    	    message for ever. The value represents
--		},				 	    cycles (10 * flash_interval msecs.)
--	}			
------------------------------------------------------------------------------------
--	
--	LICENSE: GPL2 Copyright(C)2006 Mario García H.
--	(See http://www.gnu.org/licenses/gpl.html to read complete license)
--
--	T.STAMP: Sun Dec 10 02:08:39 2006
--
--	DEPENDS: None at all.
--
--	INSECTS: You are the entomologist. You tell me.
--
-- 	NOTES ON USAGE:
--      - This script creates his own log of activity. You can choose a name and path on settings.
--      - If you remove the log, alarms will cease (rm -f *.log). Is not necessary to restart Ion.
--      - If you change the settings, the log will be auto-removed and re-written to reflect the changes
--        without false alarms.
--      - If, for some impossible circumstance, the status of some file or directory is normal again,
--        flashing will cease the annoying flashing thing by him self.
--      - If alarms are activated on certain time and you exit Ion current session, the
--        next session in Ion you will see the annoying thing on your screen... again.
--      - If you exit Ion and then you do changes to a file, the next time on Ion the alarms will do blinking.
--      - The minimum number for flashing interval (blink) is 300.
--	
--	CONTACT:
--	G.H. < drosophila (at) Nmental (dot) com>
--
------------------------------------------------------------------------------------

local defaults = {
	files = { "~/.ion3" },       --> If you like so much Ion, this is the better default.
				     --  If you change this setting, the log will be auto-updated!
	log = ".ion3/flashing.log",  --> Where do you like to log? Paths not in $HOME [...]
				     --  are invalid. If you change this file, please, remove
				     --	 your self the last file used. You are warned.
				     --	 NOTE: $HOME is assumed by 'log'.
	alarm_message = "!!",	     --> Put here the alarm message.
	normal_message = "--",	     --> Put here the normal status message.

	update_interval = 5*1000,    --> Check your files every X milliseconds.
	flash_interval = 400,        --> Blinking interval in milliseconds.
	turn_off = 500,		     --> Turn Off the alarm if it annoys you too much time:
				     --  (turn_off*flash_interval) milliseconds.
				     --> If you want permanent alarms: 3*999*999 is OK.
}
local settings = table.join(statusd.get_config("flashing"), defaults)

---SOME INSANE LOCALS :-------------------------------------------------------------

local flashing_timer
local is_ok = true
local flash = false
local home = os.getenv("HOME")
local message_lenght = string.len(settings.alarm_message)
local turn_off = settings.turn_off
settings.flash_interval = settings.flash_interval > 299 and settings.flash_interval or 300

---CONFIRM SOME INFO :--------------------------------------------------------------

local function confirm_someinfo()
	local keys = table.concat(settings.files, " * ")
	local log_file = home.."/"..settings.log
	
	local check_status = function()
		local check = io.popen("ls -liL --color=none "..table.concat(settings.files, " "))
		local status = check:read("*a"); check:close()
		return status
	end

	local new_log = function()
		local new = io.open(log_file, "w")
		if not new then
			return false
		else
			new:write(keys.."\n"..check_status())
			new:close()
			os.execute("chmod 400 "..log_file)
			new = io.open(log_file, "r")
			local log = new:read("*a"); new:close()
			return log
		end
	end
	
	local check_changes = function()
		local file = io.open(log_file, "r")
		if not file then
			return
		else
			local changes = file:read("*l"); file:close()
			return changes ~= keys and
			os.execute("rm -f "..log_file) or 1
		end
	end
	
	if not turn_off then
		turn_off = settings.turn_off 	--> Reinitialize turn_off if flash was done
		is_ok = true
		os.execute("rm -f "..log_file)
	end
	
	check_changes()	
	
	local file = io.open(log_file, "r")
	local log = file == nil and new_log() or file:read("*a")
	is_ok = keys.."\n"..check_status() == log
	return
end


---FLASHING PATERNS :---------------------------------------------------------------

local function flash_alarm()
	turn_off = turn_off > 0 and turn_off - 1 or false  --> Regresive shut down counter.
							   --  this is an extra ;>
	local show = function()
		statusd.inform("flashing", settings.alarm_message)
		statusd.inform("flashing_hint", "critical")
		return true
	end
	local hide = function()
		statusd.inform("flashing", string.rep(".", message_lenght))
		return false
	end
	flash = flash == false and show() or hide()  --> Do the real hide and show (flash)
	return
end


---FUNCTIONS CALLINGS :-------------------------------------------------------------

local function update_timer()
	confirm_someinfo() 		    --> A function checking something ... and changing between states
	if is_ok then			
		statusd.inform("flashing", settings.normal_message)
		statusd.inform("flashing_hint", "normal")
		flashing_timer:set(settings.update_interval, update_timer) --> Take different update_interval
	else
		flashing_timer:set(settings.flash_interval, update_timer)  --> Take different update_interval
		flash_alarm()
	end	
end
------------------------------------------------------------------------------------

flashing_timer = statusd.create_timer()
update_timer()