require "ncurses"
require "inifile"
require "open3"
+require 'optparse'
+require 'ostruct'
class IO
def readline_nonblock
end
end
+class OptParse
+ def parse(args)
+
+ options = OpenStruct.new()
+ options.inifile = nil
+
+ opt_parser = OptionParser.new() do |opts|
+
+ opts.banner = "Usage: monitor [options]"
+ opts.separator ""
+
+ opts.on( '-f', "-f ini_file", "chose a different initialization file") do |ini|
+ options.inifile = ini
+ end
+ end
+ opt_parser.parse!(args)
+ return options
+ end
+end
+
class List_Win
def initialize(inifile)
@params = inifile
end
def print_buffer()
+ #clear()
win_border()
j = 1
@buffer.yield(@win.getmaxy-2,@curr_offset) { |l,type|
end
end
- def update()
+ def update(force=false)
if(@params['Type'] == 'continuous')
proc_readlines()
end
if(@params['Type'] == 'oneshot')
- if(Time.now - @last_update > @params['Periodic'].to_i)
+ if(force or (Time.now - @last_update > @params['Periodic'].to_i))
@buffer.clear()
spawn_proc()
+ clear()
end
end
print_buffer()
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
end
-def read_ini()
- inifile = IniFile.load('monitorrc')
+def find_ini(option_inifile)
+ if(not option_inifile.nil?)
+ inifile = option_inifile
+ elsif(ENV.has_key?('MONITOR_RC'))
+ inifile = ENV['MONITOR_RC']
+ elsif(Process.uid == 0)
+ inifile = "/etc/monitor.rc"
+ else
+ inifile = ENV['HOME']+"/.monitorrc"
+ end
+ return inifile
+end
+
+def read_ini(ini)
+ inifile = IniFile.load(ini)
+ if(inifile.nil?)
+ puts "Initialization file not found or not readable"
+ exit
+ end
return inifile
end
def print_line(win, str, hscroll=0)
+ revert_color = false
+ str[0,5].match(/\033\[3(.)m/) { |c| #Line starts with an escape sequence. We handle that `a la xterm`
+ Ncurses.init_pair(10, c[1].to_i, Ncurses::COLOR_BLACK)
+ win.attron(Ncurses.COLOR_PAIR(10))
+ revert_color = true
+ str = str[5,str.length]
+ }
+ str = str.gsub("\011"," ")
+ #Any other control char is ignored and escaped
+ str = str.gsub(/[[:cntrl:]]/) { |m|
+ "^"+(m.ord + 64).chr
+ }
if(hscroll > 0)
strcut = str[hscroll,str.length]
if(strcut.nil? or strcut.empty?)
else
win.addstr(str[0,winlen-1]+"…")
end
+ if(revert_color)
+ win.attroff(Ncurses.COLOR_PAIR(10))
+ end
end
def make_bufwins(inifile)
list.refresh()
curr_bufwin.refresh()
end
+
+
+options = OptParse.new().parse(ARGV)
+inifile = read_ini(find_ini(options.inifile))
begin
# initialize ncurses
Ncurses.initscr
#Ncurses.stdscr.intrflush(false) # turn off flush-on-interrupt
Ncurses.stdscr.keypad(true) # turn on keypad mode
Ncurses.init_pair(1, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK)
+ Ncurses.init_pair(10, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK)
- inifile = read_ini()
-
list = List_Win.new(inifile)
bufwins = make_bufwins(inifile)
entry = 0
list.print_list(entry=entry)
when 12 #ctrl+L
redraw_all(list,bufwins,cur_bufwin)
+ when 18 #ctrl+R
+ cur_bufwin.update(force=true)
when Ncurses::KEY_RESIZE
redraw_all(list,bufwins,cur_bufwin)
when Ncurses::KEY_LEFT