X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FRuby%2FMonitor.git;a=blobdiff_plain;f=monitor.rb;h=f61ce9b8d534361191d46d7ae40222c2d6df934d;hp=09f9e59cf8bb109f157d6fa5fe4fbb65fb5d4ea8;hb=7a1b77020cc139cc9240cd2c7ed2ae8990613d66;hpb=cfddfd90ca8df888683529fcf683958da0894b10 diff --git a/monitor.rb b/monitor.rb index 09f9e59..f61ce9b 100644 --- a/monitor.rb +++ b/monitor.rb @@ -6,6 +6,8 @@ require "inifile" require "open3" require 'optparse' require 'ostruct' +require_relative 'buffer' +require_relative 'windows' class IO def readline_nonblock @@ -40,276 +42,6 @@ class OptParse end end -class List_Win - def initialize(inifile) - @params = inifile - @win = Ncurses::WINDOW.new(0, Ncurses.COLS()/4, 0, 0) - @win.border(*([0]*8)) - @win.keypad(true) - @win.timeout(1000) - @win.refresh() - @entry = 0 - end - - def getch() - @win.getch() - end - def clear() - @win.clear() - end - def resize(x,y) - @win.resize(x,y) - end - def move(x,y) - @win.move(x,y) - end - def refresh() - @win.refresh() - end - - def print_list(entry=nil) - if(not entry.nil?) - @entry = entry - end - i = 0 - @params.each_section do |section| - if(@entry == i) - @win.attron(Ncurses::A_REVERSE) - end - @win.move(i+1,1) - print_line(@win,@params[section]['Name']) - if(@entry == i) - @win.attroff(Ncurses::A_REVERSE) - end - i = i+1 - end - @win.border(*([0]*8)) - @win.move(0,3) - @win.addstr("Menu") - @win.refresh() - end -end - -class Buff_Win - def initialize(winsize,winpos,params) - @params = params - @win = Ncurses::WINDOW.new(0, winsize, 0, winpos) - @panel = Ncurses::Panel::PANEL.new(@win) - if(@params['Type'] == 'oneshot') - @buffer = Buffer.new(0) - else - @buffer = Buffer.new(@params['Buffer'].to_i) - end - @proc = nil - @curr_offset = 0 - @hscroll = 0 - update_date() - - spawn_proc() - print_buffer() - end - - def move_resize(winsize,winpos) - newwin = Ncurses::WINDOW.new(0, winsize, 0, winpos) - Ncurses::Panel.replace_panel(@panel, newwin) - Ncurses.delwin(@win) - @win = newwin - print_buffer() - end - def update_date() - @last_update = Time.now - @date = @last_update.strftime("%F %R:%S") - end - - def win_border() - @win.border(*([0]*8)) - win_header() - end - def win_header() - @win.move(0,3) - @win.addnstr(@params['Name'],@win.getmaxx-@date.length-10) - @win.move(0,@win.getmaxx-@date.length-2) - @win.addstr(@date) - end - def refresh() - @win.refresh() - end - def clear() - @win.clear() - end - - def show_win() - Ncurses::Panel.top_panel(@panel) - Ncurses::Panel.update_panels - end - - def hscroll(scroll=0) - @hscroll += scroll - if(@hscroll < 0) - @hscroll = 0 - end - if(@hscroll > @buffer.maxlen()-@win.getmaxx+3) - @hscroll = @buffer.maxlen()-@win.getmaxx+3 - end - print_buffer() - refresh() - end - def scroll(scroll=0,goto=nil,fact=nil) - if (not fact.nil?) - scroll = (fact * @win.getmaxy.to_f).to_i - elsif (not goto.nil?) - @curr_offset = (goto * @buffer.size()).to_i - scroll = 0 - end - #@curr_offset -= @win.getmaxy/2 - @curr_offset += scroll - if(@curr_offset < 0) - @curr_offset = 0 - end - if(@curr_offset > @buffer.size()-@win.getmaxy+2) - @curr_offset = @buffer.size()-@win.getmaxy+2 - end - print_buffer() - refresh() - end - - def print_buffer() - #clear() - win_border() - j = 1 - @buffer.yield(@win.getmaxy-2,@curr_offset) { |l,type| - @win.move(j,1) - if(type == 1) then @win.attron(Ncurses.COLOR_PAIR(1)) end - print_line(@win,l,hscroll=@hscroll) - if(type == 1) then @win.attroff(Ncurses.COLOR_PAIR(1)) end - j = j+1 - } - if(@buffer.has_before?) - @win.move(2,@win.getmaxx-1) - @win.attron(Ncurses::A_REVERSE) - @win.addstr("↑") - @win.attroff(Ncurses::A_REVERSE) - end - if(@buffer.has_after?) - @win.move(@win.getmaxy-2,@win.getmaxx-1) - @win.attron(Ncurses::A_REVERSE) - @win.addstr("↓") - @win.attroff(Ncurses::A_REVERSE) - end - end - - def proc_readlines() - begin - while true - @buffer.push(@proc.readline_nonblock) - update_date() - end - rescue IO::WaitReadable - end - end - - def update(force=false) - if(@params['Type'] == 'continuous') - proc_readlines() - end - if(@params['Type'] == 'oneshot') - if(force or (Time.now - @last_update > @params['Periodic'].to_i)) - @buffer.clear() - spawn_proc() - clear() - end - end - print_buffer() - end - - def spawn_proc() - if(@params['Type'] == 'oneshot') - update_date() - Open3.popen3(@params["Command"]) { |i,o,e,t| - while ((not o.eof?) or (not e.eof?)) - rs = IO.select([o,e],nil)[0] - r = (rs[0].eof?)? rs[1] : rs[0] - - if r.fileno == o.fileno - @buffer.push(r.readline) - elsif r.fileno == e.fileno - @buffer.push(r.readline,type=1) - end - end - } - elsif(@params['Type'] == 'continuous') - @proc = IO.popen(@params["Command"]) - proc_readlines() - end - end -end - -class Buffer - def initialize(size) - @size = size - @buff = [] - @buff_type = [] - @current = 0 - @wrap = false - @before = false - @after = false - end - def size() - return @buff.length - end - def maxlen() - maxlen = 0 - @buff.each do |string| - if string.length > maxlen - maxlen = string.length - end - end - return maxlen - end - - def push(string,type=0) - if(string.chomp.empty?) then string = " " end - string.split( /\r?\n/ ).each do |line| - @buff[@current] = line - @buff_type[@current] = type - if(@size > 0) - @current = (1+@current) % @size - else - @current = 1+@current - end - if(@current == 0) then @wrap = true end - end - end - def yield(size,offset=0,&block) - if(size < 0) then size = 0 end - range = Range.new(0,@current-1).to_a - if(@wrap) - range = Range.new(@current,@size-1).to_a + range - end - range = range.last(size+offset)[0,size] - @before = (size+offset < @buff.length) - @after = (offset != 0 and size < @buff.length) - if(block) - range.each do |i| - yield [@buff[i],@buff_type[i]] - end - else - return range.collect{|r| [@buff[r],@buff_type[r]]} - end - end - def has_after?() - return @after - end - def has_before?() - return @before - end - def clear() - @current = 0 - @buff = [] - @buff_type = [] - end -end - def find_ini(option_inifile) if(not option_inifile.nil?) inifile = option_inifile