]>
git.immae.eu Git - perso/Immae/Projets/Ruby/Monitor.git/blob - monitor.rb
11 buffer
<< read_nonblock(1) while buffer
[-1] !
= "\n"
13 rescue IO
::WaitReadable => blocking
14 if (not buffer
.empty
?)
22 def initialize(inifile
)
24 @win = Ncurses
::WINDOW.new(0, Ncurses
.COLS()/4, 0, 0)
48 def print_list(entry
=nil)
53 @params.each_section
do |section
|
55 @win.attron(Ncurses
::A_REVERSE)
58 print_line(@win,@params[section
]['Name'])
60 @win.attroff(Ncurses
::A_REVERSE)
72 def initialize(winsize
,winpos
,params
)
74 @win = Ncurses
::WINDOW.new(0, winsize
, 0, winpos
)
75 @panel = Ncurses
::Panel::PANEL.new(@win)
76 if(@params['Type'] == 'oneshot')
77 @buffer = Buffer
.new(0)
79 @buffer = Buffer
.new(@params['Buffer'].to_i
)
90 def move_resize(winsize
,winpos
)
91 newwin
= Ncurses
::WINDOW.new(0, winsize
, 0, winpos
)
92 Ncurses
::Panel.replace_panel(@panel, newwin
)
98 @last_update = Time
.now
99 @date = @last_update.strftime("%F %R:%S")
103 @win.border(*([0]*8))
108 @win.addnstr(@params['Name'],@win.getmaxx-
@date.length-10
)
109 @win.move(0,@win.getmaxx-
@date.length-2
)
120 Ncurses
::Panel.top_panel(@panel)
121 Ncurses
::Panel.update_panels
124 def hscroll(scroll
=0)
129 if(@hscroll > @buffer.maxlen()-@win.getmaxx+
3)
130 @hscroll = @buffer.maxlen()-@win.getmaxx+
3
135 def scroll(scroll
=0,goto
=nil,fact
=nil)
137 scroll
= (fact
* @win.getmaxy
.to_f
).to_i
138 elsif (not goto
.nil?)
139 @curr_offset = (goto
* @buffer.size()).to_i
142 #@curr_offset -= @win.getmaxy/2
143 @curr_offset +
= scroll
147 if(@curr_offset > @buffer.size()-@win.getmaxy+
2)
148 @curr_offset = @buffer.size()-@win.getmaxy+
2
157 @buffer.yield(@win.getmaxy-2
,@curr_offset) { |l
,type
|
159 if(type
== 1) then @win.attron(Ncurses
.COLOR_PAIR(1)) end
160 print_line(@win,l
,hscroll
=@hscroll)
161 if(type
== 1) then @win.attroff(Ncurses
.COLOR_PAIR(1)) end
164 if(@buffer.has_before
?)
165 @win.move(2,@win.getmaxx-1
)
166 @win.attron(Ncurses
::A_REVERSE)
168 @win.attroff(Ncurses
::A_REVERSE)
170 if(@buffer.has_after
?)
171 @win.move(@win.getmaxy-2
,@win.getmaxx-1
)
172 @win.attron(Ncurses
::A_REVERSE)
174 @win.attroff(Ncurses
::A_REVERSE)
181 @buffer.push(@proc.readline_nonblock
)
184 rescue IO
::WaitReadable
189 if(@params['Type'] == 'continuous')
192 if(@params['Type'] == 'oneshot')
193 if(Time
.now
- @last_update > @params['Periodic'].to_i
)
202 if(@params['Type'] == 'oneshot')
204 Open3
.popen3(@params["Command"]) { |i
,o
,e
,t
|
205 while ((not o
.eof
?) or (not e
.eof
?))
206 rs
= IO
.select([o
,e
],nil)[0]
207 r
= (rs
[0].eof
?)? rs
[1] : rs
[0]
209 if r
.fileno
== o
.fileno
210 @buffer.push(r
.readline
)
211 elsif r
.fileno
== e
.fileno
212 @buffer.push(r
.readline
,type
=1)
216 elsif(@params['Type'] == 'continuous')
217 @proc = IO
.popen(@params["Command"])
238 @buff.each
do |string
|
239 if string
.length
> maxlen
240 maxlen
= string
.length
246 def push(string
,type
=0)
247 if(string
.chomp
.empty
?) then string
= " " end
248 string
.split( /\r?\n/ ).each
do |line
|
249 @buff[@current] = line
250 @buff_type[@current] = type
252 @current = (1+
@current) % @size
254 @current = 1+
@current
256 if(@current == 0) then @wrap = true end
259 def yield(size
,offset
=0,&block
)
260 range
= Range
.new(0,@current-1).to_a
262 range
= Range
.new(@current,@size-1).to_a + range
264 range
= range
.last(size+offset
)[0,size
]
265 @before = (size+offset
< @buff.length
)
266 @after = (offset !
= 0 and size
< @buff.length
)
269 yield [@buff[i
],@buff_type[i
]]
272 return range
.collect
{|r
| [@buff[r
],@buff_type[r
]]}
289 inifile
= IniFile
.load('monitorrc')
293 def print_line(win
, str
, hscroll
=0)
295 strcut
= str
[hscroll
,str
.length
]
296 if(strcut
.nil? or strcut
.empty
?)
303 winlen
= win
.getmaxx-win
.getcurx-1
305 win
.addstr(str +
" "*(winlen-strlen
))
307 win
.addstr(str
[0,winlen-1
]+
"…")
311 def make_bufwins(inifile
)
313 inifile
.each_section
do |section
|
314 bufwin
= Buff_Win
.new(Ncurses
.COLS()-Ncurses
.COLS()/4,
322 def update_buffers(bufwins
)
323 bufwins
.each
do |bufwin
|
328 def redraw_all(list
,bufwins
,curr_bufwin
)
329 bufwins
.each
do |bufwin
|
330 bufwin
.move_resize(Ncurses
.COLS()-Ncurses
.COLS()/4,Ncurses.COLS()/4)
332 list
.resize(Ncurses
.LINES(), Ncurses
.COLS()/4)
336 curr_bufwin
.refresh()
342 Ncurses
.cbreak
# provide unbuffered input
343 Ncurses
.noecho
# turn off input echoing
344 #Ncurses.nonl # turn off newline translation
345 #Ncurses.stdscr.intrflush(false) # turn off flush-on-interrupt
346 Ncurses
.stdscr
.keypad(true) # turn on keypad mode
347 Ncurses
.init_pair(1, Ncurses
::COLOR_RED, Ncurses
::COLOR_BLACK)
352 list
= List_Win
.new(inifile
)
353 bufwins
= make_bufwins(inifile
)
355 cur_bufwin
= bufwins
[entry
]
356 cur_bufwin
.show_win()
358 while(ch
= list
.getch()) do
361 entry
= (entry +
1) % bufwins
.length
362 cur_bufwin
= bufwins
[entry
]
363 cur_bufwin
.show_win()
364 list
.print_list(entry
=entry
)
366 entry
= (entry
-1) % bufwins
.length
367 cur_bufwin
= bufwins
[entry
]
368 cur_bufwin
.show_win()
369 list
.print_list(entry
=entry
)
371 redraw_all(list
,bufwins
,cur_bufwin
)
372 when Ncurses
::KEY_RESIZE
373 redraw_all(list
,bufwins
,cur_bufwin
)
374 when Ncurses
::KEY_LEFT
375 cur_bufwin
.hscroll(scroll
=-1)
376 when Ncurses
::KEY_RIGHT
377 cur_bufwin
.hscroll(scroll
=1)
378 when Ncurses
::KEY_DOWN
379 cur_bufwin
.scroll(scroll
=-1)
381 cur_bufwin
.scroll(scroll
=1)
382 when Ncurses
::KEY_NPAGE
383 cur_bufwin
.scroll(scroll
=0,goto
=nil,fact
=-0.75)
384 when Ncurses
::KEY_PPAGE
385 cur_bufwin
.scroll(scroll
=0,goto
=nil,fact
=0.75)
386 when Ncurses
::KEY_HOME
387 cur_bufwin
.scroll(scroll
=0,goto
=1.0)
388 when Ncurses
::KEY_END
389 cur_bufwin
.scroll(scroll
=0,goto
=0.0)
391 update_buffers(bufwins
)
392 cur_bufwin
.show_win()