]>
git.immae.eu Git - perso/Immae/Projets/Ruby/Monitor.git/blob - monitor.rb
249e2a3c7d63cfb93f1f66ff0a5ff8a043ad176d
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
158 @buffer.yield(@win.getmaxy-2
,@curr_offset) { |l
,type
|
160 if(type
== 1) then @win.attron(Ncurses
.COLOR_PAIR(1)) end
161 print_line(@win,l
,hscroll
=@hscroll)
162 if(type
== 1) then @win.attroff(Ncurses
.COLOR_PAIR(1)) end
165 if(@buffer.has_before
?)
166 @win.move(2,@win.getmaxx-1
)
167 @win.attron(Ncurses
::A_REVERSE)
169 @win.attroff(Ncurses
::A_REVERSE)
171 if(@buffer.has_after
?)
172 @win.move(@win.getmaxy-2
,@win.getmaxx-1
)
173 @win.attron(Ncurses
::A_REVERSE)
175 @win.attroff(Ncurses
::A_REVERSE)
182 @buffer.push(@proc.readline_nonblock
)
185 rescue IO
::WaitReadable
189 def update(force
=false)
190 if(@params['Type'] == 'continuous')
193 if(@params['Type'] == 'oneshot')
194 if(force
or (Time
.now
- @last_update > @params['Periodic'].to_i
))
203 if(@params['Type'] == 'oneshot')
205 Open3
.popen3(@params["Command"]) { |i
,o
,e
,t
|
206 while ((not o
.eof
?) or (not e
.eof
?))
207 rs
= IO
.select([o
,e
],nil)[0]
208 r
= (rs
[0].eof
?)? rs
[1] : rs
[0]
210 if r
.fileno
== o
.fileno
211 @buffer.push(r
.readline
)
212 elsif r
.fileno
== e
.fileno
213 @buffer.push(r
.readline
,type
=1)
217 elsif(@params['Type'] == 'continuous')
218 @proc = IO
.popen(@params["Command"])
239 @buff.each
do |string
|
240 if string
.length
> maxlen
241 maxlen
= string
.length
247 def push(string
,type
=0)
248 if(string
.chomp
.empty
?) then string
= " " end
249 string
.split( /\r?\n/ ).each
do |line
|
250 @buff[@current] = line
251 @buff_type[@current] = type
253 @current = (1+
@current) % @size
255 @current = 1+
@current
257 if(@current == 0) then @wrap = true end
260 def yield(size
,offset
=0,&block
)
261 if(size
< 0) then size
= 0 end
262 range
= Range
.new(0,@current-1).to_a
264 range
= Range
.new(@current,@size-1).to_a + range
266 range
= range
.last(size+offset
)[0,size
]
267 @before = (size+offset
< @buff.length
)
268 @after = (offset !
= 0 and size
< @buff.length
)
271 yield [@buff[i
],@buff_type[i
]]
274 return range
.collect
{|r
| [@buff[r
],@buff_type[r
]]}
291 inifile
= IniFile
.load('monitorrc')
295 def print_line(win
, str
, hscroll
=0)
297 str
[0,5].match(/\033\[3(.)m/) { |c
| #Line starts with an escape sequence. We handle that `a la xterm`
298 Ncurses
.init_pair(10, c
[1].to_i
, Ncurses
::COLOR_BLACK)
299 win
.attron(Ncurses
.COLOR_PAIR(10))
301 str
= str
[5,str
.length
]
303 str
= str
.gsub("\011"," ")
304 #Any other control char is ignored and escaped
305 str
= str
.gsub(/[[:cntrl:]]/) { |m
|
309 strcut
= str
[hscroll
,str
.length
]
310 if(strcut
.nil? or strcut
.empty
?)
317 winlen
= win
.getmaxx-win
.getcurx-1
319 win
.addstr(str +
" "*(winlen-strlen
))
321 win
.addstr(str
[0,winlen-1
]+
"…")
324 win
.attroff(Ncurses
.COLOR_PAIR(10))
328 def make_bufwins(inifile
)
330 inifile
.each_section
do |section
|
331 bufwin
= Buff_Win
.new(Ncurses
.COLS()-Ncurses
.COLS()/4,
339 def update_buffers(bufwins
)
340 bufwins
.each
do |bufwin
|
345 def redraw_all(list
,bufwins
,curr_bufwin
)
346 bufwins
.each
do |bufwin
|
347 bufwin
.move_resize(Ncurses
.COLS()-Ncurses
.COLS()/4,Ncurses.COLS()/4)
349 list
.resize(Ncurses
.LINES(), Ncurses
.COLS()/4)
353 curr_bufwin
.refresh()
359 Ncurses
.cbreak
# provide unbuffered input
360 Ncurses
.noecho
# turn off input echoing
361 #Ncurses.nonl # turn off newline translation
362 #Ncurses.stdscr.intrflush(false) # turn off flush-on-interrupt
363 Ncurses
.stdscr
.keypad(true) # turn on keypad mode
364 Ncurses
.init_pair(1, Ncurses
::COLOR_RED, Ncurses
::COLOR_BLACK)
365 Ncurses
.init_pair(10, Ncurses
::COLOR_WHITE, Ncurses
::COLOR_BLACK)
370 list
= List_Win
.new(inifile
)
371 bufwins
= make_bufwins(inifile
)
373 cur_bufwin
= bufwins
[entry
]
374 cur_bufwin
.show_win()
376 while(ch
= list
.getch()) do
379 entry
= (entry +
1) % bufwins
.length
380 cur_bufwin
= bufwins
[entry
]
381 cur_bufwin
.show_win()
382 list
.print_list(entry
=entry
)
384 entry
= (entry
-1) % bufwins
.length
385 cur_bufwin
= bufwins
[entry
]
386 cur_bufwin
.show_win()
387 list
.print_list(entry
=entry
)
389 redraw_all(list
,bufwins
,cur_bufwin
)
391 cur_bufwin
.update(force
=true)
392 when Ncurses
::KEY_RESIZE
393 redraw_all(list
,bufwins
,cur_bufwin
)
394 when Ncurses
::KEY_LEFT
395 cur_bufwin
.hscroll(scroll
=-1)
396 when Ncurses
::KEY_RIGHT
397 cur_bufwin
.hscroll(scroll
=1)
398 when Ncurses
::KEY_DOWN
399 cur_bufwin
.scroll(scroll
=-1)
401 cur_bufwin
.scroll(scroll
=1)
402 when Ncurses
::KEY_NPAGE
403 cur_bufwin
.scroll(scroll
=0,goto
=nil,fact
=-0.75)
404 when Ncurses
::KEY_PPAGE
405 cur_bufwin
.scroll(scroll
=0,goto
=nil,fact
=0.75)
406 when Ncurses
::KEY_HOME
407 cur_bufwin
.scroll(scroll
=0,goto
=1.0)
408 when Ncurses
::KEY_END
409 cur_bufwin
.scroll(scroll
=0,goto
=0.0)
411 update_buffers(bufwins
)
412 cur_bufwin
.show_win()