Update of /cvsroot/tmda/tmda/bin
In directory sc8-pr-cvs1:/tmp/cvs-serv13728/bin
Modified Files:
tmda-gui tmda-manager
Log Message:
Some little improvements.
Nothing really visual, but the server (tmda-manager) has been slightly
reworked to interract with other languages (PHP mainly for now).
Index: tmda-gui
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-gui,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- tmda-gui 8 Jan 2003 00:20:51 -0000 1.21
+++ tmda-gui 9 Jan 2003 00:20:51 -0000 1.22
@@ -127,8 +127,6 @@
msg = Pending.Message(msgid)
except Errors.MessageError:
raise MessageError
- if command not in ('terse', 'show',):
- msg.initMessage()
try:
try:
data = getattr(msg, command)(args)
@@ -200,7 +198,6 @@
sin = sock.makefile('r', 0)
sout = sock.makefile('w', 0)
# eat up greetings from manager
- ## FIXME: maybe check the protocol version ?
cc = sin.read(1)
while cc != '+':
l = sin.readline().strip()
@@ -232,7 +229,6 @@
def net_command(command):
"""Send a command to the server, and return the result."""
data = []
-# print str(command)
sout.write(str(command)+'\n')
cc = sin.read(1)
# '.' is the end of connection
@@ -256,7 +252,7 @@
def net_recover(s="error recovery"):
s = str(s)
- r = net_command('nop %s\n' % s)[0]
+ r = net_command('nop %s' % s)[0]
if r != s:
raise ProtoError, r
@@ -312,7 +308,7 @@
"""Get a pending message."""
opts = ''
for a in args.keys():
- if args[a]:
+ if args[a] != None:
opts += ' --%s=%s' % (a, args[a])
else:
opts += ' --%s' % a
@@ -328,9 +324,7 @@
"""Get the pending message list."""
if command == 'list':
try:
- ## FIXME: add reverse option pending command
- data = net_command('pending --only --descending=1')
-# data.reverse()
+ data = net_command('pending --only --descending')
return data
except ProtoError, msg:
print "%s: %s" % (ProtoError, msg)
@@ -338,7 +332,6 @@
return []
# Let's check if we're running locally or through the network
-
try:
from TMDA import Version
from TMDA import Address
@@ -353,7 +346,6 @@
processMessage = lib_processMessage
processPending = lib_processPending
-
# No TMDA library around, we're not on the server
except ImportError:
using_network = 1
@@ -368,7 +360,12 @@
'use. If you decide to use it anyway, please send your comments to ' + \
'the [EMAIL PROTECTED] mailing list, and not tmda-users.'
print 'WARNING:\n'
-print wraptext(warning), '\n'
+try:
+ print wraptext(warning), '\n'
+except NameError:
+ ## not TMDA lib around
+ print warning, '\n'
+
try:
from Tkinter import *
@@ -378,12 +375,17 @@
'support. Visit http://python.org/topics/tkinter/trouble.html ' + \
'for more information.'
print 'ERROR:\n'
- print wraptext(no_tk), '\n'
+ try:
+ print wraptext(no_tk), '\n'
+ except NameError:
+ ## not TMDA lib around
+ print no_tk, '\n'
sys.exit()
def PasswordPrompt(pl):
"""Prompt for a password."""
def setpw(ev=None):
+ global pl, ask, root
pl.append(ask.get())
ask.destroy()
root.destroy()
@@ -775,13 +777,13 @@
self._sb = Scrollbar(self, orient=VERTICAL)
self._sb.config(command=self._yview)
- vars = getVars('TERSE_SUMMARY_HEADERS', 'TERSE_LABEL_HEADERS')
+ vars = getVars('TERSE_SUMMARY_HEADERS', 'TERSE_SUMMARY_LABELS')
try:
self._colnames = vars['TERSE_SUMMARY_HEADERS']
# FIXME: test if the user wants the msgid (config)
self._colnames.insert(0, 'msgid')
try:
- self._collabels = vars['TERSE_LABEL_HEADERS']
+ self._collabels = vars['TERSE_SUMMARY_LABELS']
# FIXME: test if the user wants the msgid (config)
self._collabels.insert(0, 'msgid')
except KeyError:
@@ -812,7 +814,7 @@
self.maxmsg = cfg.get('messagelist_maxmsg')
if not self.maxmsg:
- self.maxmsg = -1
+ self.maxmsg = 0
cfg.set('messagelist_maxmsg', self.maxmsg)
def curselection(self):
@@ -891,8 +893,15 @@
for col in self._cols:
col.delete(0, END)
self.msgs = []
- lst = processPending('list')[:self.maxmsg]
- self.statusbar.Set('Please wait, loading message list...')
+ self.totallst = processPending('list')
+ if self.maxmsg > 0:
+ self.statusbar.Set('Please wait, loading message list (%s on %s)...' \
+ % (self.maxmsg, len(self.totallst)))
+ lst = self.totallst[:self.maxmsg]
+ else:
+ self.statusbar.Set('Please wait, loading message list (%s)...' \
+ % len(self.totallst))
+ lst = self.totallst
self.statusbar.progress.Show(len(lst))
x = 0
for item in lst:
@@ -1066,8 +1075,9 @@
def updateStatus(self, ev=None):
- self.statusbar.Set("%d messages in pending queue..." \
- % len(self.listbox.msgs))
+ self.statusbar.Set("Displaying %d out of %d messages in pending queue..." \
+ % (len(self.listbox.msgs),
+ len(self.listbox.totallst)))
def poll(self):
self.counter += 1
@@ -1221,7 +1231,7 @@
self.vars = [
# Format is: variable name, label, default, type
- ('messagelist_maxmsg', "Max messages in pending list", -1, int),
+ ('messagelist_maxmsg', "Max messages in pending list", 0, int),
('pending_refresh_interval', "Refresh interval (sec)", 600, int),
('address_main', 'Main address', getAddress('base'), str)
]
@@ -1244,7 +1254,12 @@
def ApplySettings(self):
for (var, text, dft, typ) in self.vars:
- cfg.set(var, typ(self.ent[var].get()))
+ try:
+ cfg.set(var, typ(self.ent[var].get()))
+ except ValueError:
+ self.ent[var].delete(0, END)
+ self.ent[var].insert(END, dft)
+ cfg.set(var, dft)
def SaveSettings(self):
self.ApplySettings()
@@ -1356,10 +1371,9 @@
if __name__ == '__main__':
main()
+ cfg.save()
-cfg.save()
-
-
+"""$Id$"""
Index: tmda-manager
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-manager,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- tmda-manager 8 Jan 2003 00:20:51 -0000 1.8
+++ tmda-manager 9 Jan 2003 00:20:51 -0000 1.9
@@ -115,6 +115,8 @@
hostport = '%s:%s' % (FQDN, defaultport)
program = sys.argv[0]
daemon_mode = None
+quiet = 0
+debug = 0
def usage(code, msg=''):
print __doc__ % globals()
@@ -123,16 +125,18 @@
sys.exit(code)
try:
- opts, args = getopt.getopt(sys.argv[1:],
- 'H:u:R:A:a:dDVh', ['hostport=',
- 'username=',
- 'authfile=',
- 'remoteauth=',
- 'authprog=',
- 'daemon',
- 'debug',
- 'version',
- 'help'])
+ opts, args = getopt.getopt(sys.argv[1:], 'H:u:R:A:a:dDqVh',
+ ['hostport=',
+ 'username=',
+ 'authfile=',
+ 'remoteauth=',
+ 'authprog=',
+ 'daemon',
+ 'debug',
+ 'quiet',
+ 'version',
+ 'help',
+ ])
except getopt.error, msg:
usage(1, msg)
@@ -146,7 +150,10 @@
print Version.TMDA
sys.exit()
elif opt in ('-D', '--debug'):
+ debug = 1
Auth.DEBUGSTREAM = sys.stderr
+ elif opt in ('-q', '--quiet'):
+ quiet = 1
elif opt in ('-d', '--daemon'):
daemon_mode = 1
elif opt in ('-H', '--hostport'):
@@ -166,6 +173,10 @@
Auth.security_disclaimer()
Auth.init_auth_method()
+if daemon_mode and quiet:
+ print >> sys.stderr, "Warning: cannot be quiet in daemon mode."
+ quiet = 0
+
import asynchat
import asyncore
import base64
@@ -200,20 +211,16 @@
sys.stdin = stdin
sys.stdout = stdout
sys.stderr = stderr
- self.prompt = prompt
+ if quiet:
+ self.prompt = ''
+ else:
+ self.prompt = prompt
self.authenticated = not Auth.running_as_root
+ if debug:
+ # patch ourself
+ self.precmd = self._precmd
Cmd.__init__(self)
- def Print(self, *strings):
- self.stdout.write(' '.join(strings))
- self.stdout.write('\n')
-
- def write(self, string):
- self.stdout.write(string)
-
- def readline(self):
- return self.stdin.readline()
-
def outputData(self, data):
"""Output data."""
if type(data) == str:
@@ -222,7 +229,12 @@
for line in data:
for subline in line.split('\n'):
d.append(subline)
- sys.stdout.write(' ' + '\n '.join(d) + '\n')
+ if quiet:
+ sys.stdout.write('\n'.join(d) + '\n')
+ else:
+ sys.stdout.write(' ' + '\n '.join(d) + '\n')
+ if debug:
+ self.log('<' + '\n<'.join(d) + '\n')
def parseArgs(self, args, shortopts=[], longopts=[]):
"""Parse command line arguments."""
@@ -238,30 +250,47 @@
longopts)
except getopt.error, msg:
self.error(0, "ARG", str(msg))
+ ## FIXME: raise an exception here, and
+ ## catch it in the callers
return ([], [])
return (opts, args)
return pargs
def mainLoop(self):
+ greetings = ''
+ if not quiet:
+ greetings = 'TMDA Manager v%s\nProtocol v%s' % \
+ (Version.TMDA, self.ProtoVer)
try:
- self.cmdloop('TMDA Manager v%s\nProtocol v%s' % (Version.TMDA,
self.ProtoVer))
+ self.cmdloop(greetings)
except KeyboardInterrupt, msg:
raise KeyboardInterrupt, msg
+ def _precmd(self, line):
+ """Log commands in debug mode."""
+ self.log('>'+line)
+ return line
+
def log(self, *strings):
+ """Log strings to stderr."""
for s in strings:
sys.stderr.write(str(s))
sys.stderr.write('\n')
def error(self, ret, code, str):
"""Output an error message."""
- print "-%s: %s" % (code, str.replace('\n', ' '))
+ line = "-%s: %s" % (code, str.replace('\n', ' '))
+ print line
+ if debug:
+ self.log('!' + line)
return ret
## Cmd functions
def do_help(self, args):
- print "Write me!"
+ self.outputData("Write me!")
+ if args:
+ Cmd.do_help(self, args)
def do_nop(self, args):
"""No-OPeration, do nothing but echo args."""
@@ -388,51 +417,117 @@
return 0
def help_pending(self):
- print "Write me!"
+ self.outputData([
+ "pending --queue",
+ "pending [--all|--confirmed|--released|--delivered|--only]"+\
+ " [--descending] [--range N[:M]]",
+ "pending [--all|--confirmed|--released|--delivered|--only]"+\
+ " --number",
+ ])
def do_pending(self, args):
"""List pending message ids."""
if not self.authenticated:
return self.error(0, "AUTH", "Please authenticate first.")
- (opts, args) = self.parseArgs(args, 'qacrdoD:',
+ (opts, args) = self.parseArgs(args, 'qacrdopDns:u:R:',
[ 'queue',
'all',
+ 'any',
'confirmed',
'released',
'delivered',
'only',
- 'descending=',
+ 'pending',
+ 'descending',
+ 'number',
+ 'since=',
+ 'until=',
+ 'range=',
] )
- try:
- (opt, arg) = opts[0]
- except IndexError:
- (opt, arg) = ('-o', '')
descending = None
- for (o, a) in opts:
- if o == '-D' or o == '--descending':
- if a:
- descending = 1
- break
- descending = 1
+ descending = 1
+ interactive = 0
+ plist = 'only'
+ number = 0
+ since = None
+ until = None
+ range = None
+ for (opt, arg) in opts:
+ if opt in ('-D', '--descending'):
+ descending = 1
+ elif opt in ('-q', '--queue'):
+ interactive = 1
+ elif opt in ('-a', '--all', '--any'):
+ plist = 'all'
+ elif opt in ('-c', '--confirmed'):
+ plist = 'confirmed'
+ elif opt in ('-r', '--released'):
+ plist = 'released'
+ elif opt in ('-d', '--delivered'):
+ plist = 'delivered'
+ elif opt in ('-o', '--only', '-p', '--pending'):
+ plist = 'only'
+ elif opt in ('-n', '--number'):
+ number = 1
+ elif opt in ('-s', '--since'):
+ since = arg
+ elif opt in ('-u', '--until'):
+ until = arg
+ elif opt in ('-R', '--range'):
+ try:
+ min, max = arg.split(':', 1)
+ try:
+ min = int(min)
+ except ValueError:
+ min = 0
+ try:
+ max = int(max)
+ except ValueError:
+ max = 0
+ range = (min, max)
+ except ValueError:
+ # only one value given
+ try:
+ min = int(arg)
+ range = (min, min+1)
+ except ValueError:
+ # ignore bogus --range flag
+ pass
+
from TMDA import Pending
- if opt == '-q' or opt == '--queue':
+ if interactive:
Pending.InteractiveQueue().initQueue().mainLoop()
return 0
ids = ''
- if opt == '-a' or opt == '--all':
+ if plist == 'all':
ids = Pending.Queue(descending=descending).initQueue().listIds()
- elif opt == '-c' or opt == '--confirmed':
+ elif plist == 'confirmed':
ids = Pending.Queue(descending=descending).initQueue().listConfirmedIds()
- elif opt == '-r' or opt == '--released':
+ elif plist == 'released':
ids = Pending.Queue(descending=descending).initQueue().listReleasedIds()
- elif opt == '-d' or opt == '--delivered':
+ elif plist == 'delivered':
ids = Pending.Queue(descending=descending).initQueue().listDeliveredIds()
- elif opt == '-o' or opt == '--only':
+ elif plist == 'only':
ids = Pending.Queue(descending=descending).initQueue().listPendingIds()
- if ids:
- self.outputData(ids)
- else:
- self.outputData('nothing'+opt)
+
+ if since:
+ ids = [ id for id in ids if id > since ]
+
+ if until:
+ ids = [ id for id in ids if id <= until ]
+
+ if number:
+ self.outputData(str(len(ids)))
+# self.outputData((str(len(ids)),))
+
+ if ids and not number:
+ if range:
+ if range[1]:
+ self.outputData(ids[range[0]:range[1]])
+ else:
+ self.outputData(ids[range[0]:])
+ else:
+ self.outputData(ids)
return 0
def help_message(self):
@@ -452,37 +547,47 @@
'blacklist',
'date=',
] )
- try:
- (opt, arg) = opts[0]
- except IndexError:
- (opt, arg) = ('-t', '')
+ (opt, arg) = ('-t', '')
date = 0
for (o, a) in opts:
if o == '-D' or o == '--date':
if a:
date = 1
break
+ else:
+ ## FIXME: one action allowed for now
+ (opt, arg) = (o, a)
from TMDA import Pending
+ from TMDA import Errors
if not len(args):
return self.error(0, 'ARG', 'Missing message id.')
- if opt == '-t' or opt == '--terse':
- for l in Pending.Message(args[0]).initMessage().terse(tsv=0, date=date):
- self.outputData(l.replace('\n', r'\n'))
- elif opt == '-s' or opt == '--summary':
- self.outputData(Pending.Message(args[0]).initMessage().summary())
- elif opt == '-S' or opt == '--show':
- self.outputData(Pending.Message(args[0]).initMessage().show())
- elif opt == '-r' or opt == '--release':
- Pending.Message(args[0]).initMessage().release()
- elif opt == '-d' or opt == '--delete':
- Pending.Message(args[0]).initMessage().delete()
- elif opt == '-w' or opt == '--whitelist':
- Pending.Message(args[0]).initMessage().whitelist()
- elif opt == '-b' or opt == '--blacklist':
- Pending.Message(args[0]).initMessage().blacklist()
+ try:
+ if opt == '-t' or opt == '--terse':
+ for l in Pending.Message(args[0]).initMessage().terse(tsv=0,
+date=date):
+ self.outputData(l.replace('\n', r'\n'))
+ elif opt == '-s' or opt == '--summary':
+ self.outputData(Pending.Message(args[0]).initMessage().summary())
+ elif opt == '-S' or opt == '--show':
+ self.outputData(Pending.Message(args[0]).initMessage().show())
+ elif opt == '-r' or opt == '--release':
+ Pending.Message(args[0]).initMessage().release()
+ elif opt == '-d' or opt == '--delete':
+ Pending.Message(args[0]).initMessage().delete()
+ elif opt == '-w' or opt == '--whitelist':
+ Pending.Message(args[0]).initMessage().whitelist()
+ elif opt == '-b' or opt == '--blacklist':
+ Pending.Message(args[0]).initMessage().blacklist()
+ except Errors.MessageError:
+ return self.error(0, 'ARG', 'Unknown message id %s.' %
+ args[0])
+
return 0
+ def help_get(self):
+ print "Write me!"
+
def do_get(self, args):
+ """Get a Default module variable."""
if not self.authenticated:
return self.error(0, "AUTH", "Please authenticate first.")
(opts, args) = self.parseArgs(args)
@@ -490,16 +595,53 @@
from TMDA import Defaults
res = []
if '*' in args:
- args = dict(Defaults).keys()
+ args = vars(Defaults).keys()
+ args.sort()
for a in args:
try:
- res.append('%s=%s' % (a, getattr(Defaults, a)))
+ val = getattr(Defaults, a)
+ if type(val) in (int, str, list) and \
+ a[0] >= 'A' and a[0] <= 'Z' and \
+ a != 'CRYPT_KEY':
+ res.append('%s=%s' % (a, repr(val)))
except AttributeError, msg:
pass
- #self.error(0, 'VAR', '%s: %s' % (a, msg))
- self.outputData('\n'.join(res))
+ self.outputData(res)
return 0
+ def help_getfile(self):
+ print "Write me!"
+
+ def do_getfile(self, args):
+ """Get a TMDA file (except CRYPT_KEY_FILE)."""
+ if not self.authenticated:
+ return self.error(0, "AUTH", "Please authenticate first.")
+ (opts, args) = self.parseArgs(args)
+
+ import os.path
+ from TMDA import Defaults
+ path = os.path.expanduser(args[0])
+
+ # Check if the client wants to peep into our crypt_key file
+ if os.path.expanduser(Defaults.CRYPT_KEY_FILE) == path:
+ return self.error(0, 'ACC', "You can't do that.")
+
+ # Check if the client wants to fetch non-TMDA files
+ if os.path.commonprefix((Defaults.DATADIR,
+ path)) != Defaults.DATADIR:
+ return self.error(0, 'ACC', "You can't do that.")
+
+ # All seems OK, let's serve the request
+ try:
+ file = open(path)
+ self.outputData([ line[:-1] for line in file.readlines() ])
+ file.close()
+ except IOError:
+ return self.error(0, 'RES', "Resource not found.")
+
+ return 0
+
+
def do_exit(self, args):
"""Exit the shell."""
_______________________________________
tmda-cvs mailing list
http://tmda.net/lists/listinfo/tmda-cvs