pld-ftp-admin: scripts/check-tree.py (NEW) - add random file from th-pld ft...
glen
glen at pld-linux.org
Wed May 27 00:47:33 CEST 2009
Author: glen Date: Tue May 26 22:47:33 2009 GMT
Module: pld-ftp-admin Tag: HEAD
---- Log message:
- add random file from th-pld ftp admin scripts (dated 2005-08-12)
---- Files affected:
pld-ftp-admin/scripts:
check-tree.py (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: pld-ftp-admin/scripts/check-tree.py
diff -u /dev/null pld-ftp-admin/scripts/check-tree.py:1.1
--- /dev/null Wed May 27 00:47:33 2009
+++ pld-ftp-admin/scripts/check-tree.py Wed May 27 00:47:28 2009
@@ -0,0 +1,299 @@
+#!/usr/bin/env python
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
+import sys, os
+sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
+import ftptree
+ftptree.quietmode=True
+from common import checkdir
+import ftpio
+import config
+cval=config.value
+
+import curses
+
+if len(sys.argv) != 3:
+ print "ERR: wrong number of arguments"
+ print "check-tree.py srctree dsttree"
+ sys.exit(1)
+
+checkdir(sys.argv[1])
+
+ftpio.connect('check-tree')
+
+if not ftpio.lock(sys.argv[1], True):
+ print "ERR: %s tree already locked" % sys.argv[1]
+ sys.exit(1)
+
+if not ftpio.lock(sys.argv[2], True):
+ ftpio.unlock(sys.argv[1])
+ print "ERR: %s tree already locked" % sys.argv[2]
+ sys.exit(1)
+
+srctree=ftptree.FtpTree(sys.argv[1], loadall=True)
+dsttree=ftptree.FtpTree(sys.argv[2])
+
+srctree.checktree(dsttree)
+
+# We've loaded all interesting info, so we can continue without locks
+ftpio.unlock(sys.argv[1])
+ftpio.unlock(sys.argv[2])
+
+# The list(set(list)) cast is a fancy way to remove dups from a list
+names=sorted(list(set([pkg.name for pkg in srctree.values()])))
+
+pkgtree={}
+
+for n in names:
+ pkgtree[n]=[]
+
+for pkg in srctree.values():
+ pkgtree[pkg.name].append(pkg)
+
+for key in pkgtree.keys():
+ pkgtree[key]=sorted(pkgtree[key], reverse=True)
+
+for pkg in srctree.values():
+ pkg.marked4movingpool=pkgtree[pkg.name]
+
+pkglist=[]
+
+for key in sorted(pkgtree.keys()):
+ pkglist=pkglist+pkgtree[key]
+
+DoQuit="OMG!"
+
+class Screen:
+ def __init__(self, srctreename, dsttreename, elements):
+ self.srctree=srctreename
+ self.dsttree=dsttreename
+ self.elements=elements
+ self.pkglistselected=0
+ self.pkgliststartpad=0
+ self.win2startpad=0
+ self.window=1
+ try:
+ # initial
+ self.screen=curses.initscr()
+ self.screen.keypad(1)
+ curses.start_color()
+ curses.noecho()
+ curses.cbreak()
+ curses.meta(1)
+ curses.curs_set(0)
+
+ # Without this refresh(), nothing will show up before first getch()
+ self.screen.refresh()
+
+ self.__init_colors()
+ self.__init_windows()
+ self.__bind_keys()
+
+ try:
+ # Main loop
+ while True:
+ if self.window==1: #pkglist
+ self.__redraw_pkglist()
+ self.__redraw_statusbox()
+ elif self.window==2:
+ pass
+ curses.doupdate()
+ self.__handle_input()
+ except DoQuit:
+ pass
+ finally:
+ curses.echo()
+ curses.nocbreak()
+ curses.curs_set(1)
+ curses.endwin()
+
+ def __bind_keys(self):
+ self.globalkeys=(('qQ', 'quit'), ('KEY_RESIZE', 'resize'),
+ ('KEY_CLOSE', 'quit'))
+ self.perwindowkeys=[(), ()]
+ self.perwindowkeys[0]=(('k', 'move_up'), ('J', 'move_pgdown'),
+ ('K', 'move_pgup'), (' ', 'mark'), ('j', 'move_down'),
+ ('KEY_DOWN', 'move_down'), ('KEY_UP', 'move_up'),
+ ('KEY_HOME', 'move_home'), ('KEY_END', 'move_end'),
+ ('KEY_NPAGE', 'move_pgdown'), ('KEY_PPAGE', 'move_pgup'))
+
+
+ def __init_colors(self):
+ curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_CYAN)
+ self.COLOR_TITLEBAR=curses.color_pair(1)
+ curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE)
+ self.COLOR_STANDARD=curses.color_pair(2)
+ curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLUE)
+ self.COLOR_ERROR=curses.color_pair(3)
+ curses.init_pair(4, curses.COLOR_YELLOW, curses.COLOR_BLUE)
+ self.COLOR_WARNING=curses.color_pair(4)
+ curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_RED)
+ self.COLOR_ERRORMSG=curses.color_pair(5)
+ curses.init_pair(6, curses.COLOR_WHITE, curses.COLOR_YELLOW)
+ self.COLOR_WARNINGMSG=curses.color_pair(6)
+ curses.init_pair(7, curses.COLOR_BLACK, curses.COLOR_WHITE)
+ self.COLOR_WHITEBG=curses.color_pair(7)
+
+ def __init_windows(self):
+ self.__set_screen_coordinates()
+
+ # Titlebar
+ self.titlebar = curses.newpad(1, 200)
+ self.titlebar.bkgdset(ord(' '), self.COLOR_TITLEBAR)
+ self.__redraw_titlebar()
+
+ # Pkg list pad
+ self.pkglist = curses.newpad(len(self.elements), 200)
+ self.pkglist.bkgdset(ord(' '), self.COLOR_STANDARD)
+ self.pkglist.clrtobot()
+
+ # Status bar
+ self.statusbar = curses.newpad(1, 200)
+
+ # Pkg status box
+ self.statusbox = curses.newpad(5, 200)
+ self.statusbox.bkgdset(ord(' '), self.COLOR_STANDARD)
+ self.statusbox.clrtobot()
+ self.__redraw_statusbox()
+
+ def __set_screen_coordinates(self):
+ self.scr_h, self.scr_w = self.screen.getmaxyx()
+ self.pad_h = self.scr_h-5
+ self.sbar_y = self.scr_h-4
+ self.sbox_y = self.scr_h-3
+
+ def __redraw_titlebar(self):
+ self.titlebar.clrtobot()
+# self.titlebar.addstr(0, self.scr_w-14, "pld-ftp-admin")
+ self.titlebar.addstr(0, 1, 'Window #%s' % self.window)
+ tmp="%s => %s" % (self.srctree, self.dsttree)
+ self.titlebar.addstr(0, int(self.scr_w/2-len(tmp)/2)-1, tmp)
+ self.titlebar.addstr(0, self.scr_w-20, "Press 'h' for help.")
+ self.titlebar.noutrefresh(0, 0, 0, 0, 1, self.scr_w-1)
+
+ def __redraw_statusbox(self):
+ self.statusbox.erase()
+ pkg=self.elements[self.pkglistselected]
+ i=0
+ for error in pkg.errors:
+ self.statusbox.bkgdset(ord(' '), self.COLOR_ERRORMSG)
+ self.statusbox.addstr(i, 0, 'ERR: '+error, curses.A_BOLD)
+ self.statusbox.bkgdset(ord(' '), self.COLOR_STANDARD)
+ i+=1
+ for warning in pkg.warnings:
+ self.statusbox.bkgdset(ord(' '), self.COLOR_WARNINGMSG)
+ self.statusbox.addstr(i, 0, 'WARN: '+warning, curses.A_BOLD)
+ self.statusbox.bkgdset(ord(' '), self.COLOR_STANDARD)
+ i+=1
+ self.statusbox.noutrefresh(0,0,self.sbox_y,0,self.scr_h-1,self.scr_w-1)
+
+ def __redraw_pkglist(self):
+ # Safety in case there's a bug somewhere
+ if self.pkgliststartpad>len(self.elements)-self.pad_h:
+ self.pkgliststartpad=len(self.elements)-self.pad_h
+ if self.pkgliststartpad<0:
+ self.pkgliststartpad=0
+
+ self.pkglist.erase()
+ for i in range(len(self.elements)):
+ if self.elements[i].marked4moving:
+ if self.elements[i].warnings:
+ self.pkglist.bkgdset(ord(' '), self.COLOR_WARNINGMSG)
+ self.pkglist.addstr(i, 0, '+', curses.A_BOLD)
+ else:
+ self.pkglist.bkgdset(ord(' '), self.COLOR_WHITEBG)
+ self.pkglist.addstr(i, 0, '+')
+
+ if self.elements[i].errors:
+ self.pkglist.bkgdset(ord(' '), self.COLOR_ERROR)
+ elif self.elements[i].warnings:
+ self.pkglist.bkgdset(ord(' '), self.COLOR_WARNING)
+ else:
+ self.pkglist.bkgdset(ord(' '), self.COLOR_STANDARD)
+ if i == self.pkglistselected:
+ self.pkglist.addstr(i, 2, `self.elements[i]`, curses.A_REVERSE)
+ else:
+ self.pkglist.addstr(i, 2, `self.elements[i]`, curses.A_BOLD)
+ self.pkglist.bkgdset(ord(' '), self.COLOR_STANDARD)
+ self.pkglist.noutrefresh(self.pkgliststartpad,0,1,0,self.pad_h,self.scr_w-1)
+
+ def __do_resize(self):
+ self.__set_screen_coordinates()
+ self.__redraw_titlebar()
+ self.__redraw_statusbox()
+
+ def __do_move_down(self):
+ if 0 <= self.pkglistselected < len(self.elements)-1:
+ self.pkglistselected+=1
+ if (self.pkgliststartpad!=len(self.elements)-self.pad_h and
+ self.pad_h-(self.pkglistselected-self.pkgliststartpad)<5):
+ self.pkgliststartpad+=1
+
+ def __do_move_up(self):
+ if 0 < self.pkglistselected <= len(self.elements)-1:
+ self.pkglistselected-=1
+ if self.pkgliststartpad!=0 and self.pkglistselected-self.pkgliststartpad<4:
+ self.pkgliststartpad-=1
+
+ def __do_move_home(self):
+ self.pkglistselected=0
+ self.pkgliststartpad=0
+
+ def __do_move_end(self):
+ self.pkglistselected=len(self.elements)-1
+ self.pkgliststartpad=len(self.elements)-self.pad_h
+
+ def __do_move_pgdown(self):
+ self.pkglistselected+=self.pad_h
+ if self.pkglistselected >= len(self.elements):
+ self.pkglistselected = len(self.elements)-1
+ self.pkgliststartpad+=self.pad_h
+ if self.pkgliststartpad > len(self.elements)-self.pad_h:
+ self.pkgliststartpad=len(self.elements)-self.pad_h
+
+ def __do_move_pgup(self):
+ self.pkglistselected-=self.pad_h
+ if self.pkglistselected < 0:
+ self.pkglistselected = 0
+ self.pkgliststartpad-=self.pad_h
+ if self.pkgliststartpad < 0:
+ self.pkgliststartpad = 0
+
+ def __do_quit(self):
+ raise DoQuit
+
+ def __do_mark(self):
+ pkg=self.elements[self.pkglistselected]
+ if pkg.errors:
+ return
+ elif pkg.marked4moving:
+ pkg.unmark4moving()
+ else:
+ pkg.mark4moving()
+
+ def __handle_input(self):
+ key=self.screen.getch()
+ if key==27:
+ # Switch window
+ metakey=self.screen.getch()
+ if 0<metakey<256:
+ c=chr(metakey)
+ if c=='1':
+ self.window=1
+ elif c=='2':
+ self.window=2
+ elif 0<key<256:
+ c=chr(key)
+ for bind in self.globalkeys+self.perwindowkeys[self.window-1]:
+ if not bind[0].startswith('KEY_') and c in bind[0]:
+ exec 'self._Screen__do_%s()' % bind[1]
+
+ else:
+# self.elements[0]=`key`
+ for bind in self.globalkeys+self.perwindowkeys[self.window-1]:
+ if bind[0].startswith('KEY_'):
+ if key == getattr(curses, bind[0]):
+ exec 'self._Screen__do_%s()' % bind[1]
+
+s = Screen(sys.argv[1], sys.argv[2], pkglist)
+
================================================================
More information about the pld-cvs-commit
mailing list