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

Reply via email to