Initial commit
authorU-Blackbird\slack <slack@Blackbird.(none)>
Fri, 27 Jun 2008 01:12:52 +0000 (03:12 +0200)
committerJorge Gorbe Moya <slack@codemaniacs.com>
Fri, 27 Jun 2008 01:15:03 +0000 (03:15 +0200)
melon-view.py [new file with mode: 0755]

diff --git a/melon-view.py b/melon-view.py
new file mode 100755 (executable)
index 0000000..fb429ae
--- /dev/null
@@ -0,0 +1,117 @@
+#!/usr/bin/python\r
+\r
+import sys\r
+import curses\r
+import os\r
+import time\r
+\r
+log_dirs = [sys.argv[1]]\r
+refresh_interval = 2\r
+\r
+class AppInfo:\r
+       def __init__(self, name, user, machine, status, progress):\r
+               self.name = name\r
+               self.user = user\r
+               self.machine = machine\r
+               self.status = status\r
+               self.progress = progress\r
+\r
+\r
+def get_app_info(filename):\r
+       f = file(filename,"r")\r
+       try:\r
+               f.seek(-200, 2)\r
+       except IOError:\r
+               f.seek(0)\r
+       \r
+       lines = f.read().split("\n")\r
+       for l in lines:\r
+               if l[:2]=='!!' and l[-2:]=='!!':\r
+                       last_complete_line = l\r
+       l = last_complete_line[2:-2].split("&")\r
+       return AppInfo(l[0],l[1],l[2],l[3],int(l[4]))\r
+\r
+\r
+def get_apps_info():\r
+       apps = []\r
+       for dir in log_dirs:\r
+               filenames = os.listdir(dir)\r
+               for f in filenames:\r
+                       if f[-6:] == ".melon":\r
+                               apps.append(get_app_info(dir+os.sep+f))\r
+       return apps\r
+\r
+\r
+\r
+# curses init\r
+stdscr = curses.initscr()\r
+rows, cols = stdscr.getmaxyx()\r
+if cols < 70:\r
+       print "Terminal is too narrow"\r
+       # curses cleanup\r
+       stdscr.keypad(0)\r
+       curses.nocbreak()\r
+       curses.echo()\r
+       curses.endwin()\r
+       sys.exit(1)\r
+\r
+curses.noecho()\r
+#curses.cbreak()\r
+curses.halfdelay(100)\r
+stdscr.keypad(1)\r
+# app goes here\r
+\r
+numboxes = (rows-1)/3\r
+cur_pos = 0\r
+cur_x_pos = 0\r
+barsize = cols-63;\r
+last_refresh = 0\r
+\r
+\r
+exit = False\r
+while not exit:\r
+       if time.time() - last_refresh > refresh_interval:\r
+               last_refresh = time.time()\r
+               apps = get_apps_info()\r
+\r
+       stdscr.erase()\r
+       for i in xrange(min(numboxes, len(apps)-cur_pos)):\r
+               app = apps[cur_pos + i]\r
+               attribs = curses.A_NORMAL\r
+               stdscr.addstr(3*i+1, 2, app.name, attribs)\r
+               stdscr.addstr(3*i+1, 60, app.user+"@"+app.machine, attribs)\r
+               stdscr.addstr(3*i+2, 2, app.status[cur_x_pos:], attribs)\r
+\r
+               stdscr.hline(3*i+2, 60, curses.ACS_BOARD, barsize)\r
+               stdscr.hline(3*i+2, 60, curses.ACS_BLOCK, int((app.progress/100.0)*barsize))\r
+\r
+               stdscr.hline(3*(i+1),1,curses.ACS_HLINE, cols-2)\r
+\r
+       stdscr.box()\r
+       try:\r
+               cmd = stdscr.getch()\r
+       except:\r
+               pass\r
+       if cmd == ord('q'):\r
+               exit = True\r
+       elif cmd == curses.KEY_DOWN:\r
+               if cur_pos < len(apps)-numboxes:\r
+                       cur_pos += 1\r
+       elif cmd == curses.KEY_UP:\r
+               if cur_pos > 0:\r
+                       cur_pos -= 1\r
+       elif cmd == curses.KEY_RIGHT:\r
+               cur_x_pos += 10\r
+       elif cmd == curses.KEY_LEFT:\r
+               if cur_x_pos > 0:\r
+                       cur_x_pos -= 10\r
+       stdscr.refresh()\r
+\r
+# curses cleanup\r
+stdscr.keypad(0)\r
+curses.nocbreak()\r
+curses.echo()\r
+curses.endwin()\r
+\r
+\r
+\r