Attached is the CLI code tarball. It is documented at http://test.kernel.org/autotest/CLIHowTo

From: [email protected]



git-svn-id: http://test.kernel.org/svn/autotest/trunk@1950 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/cli/acl.py b/cli/acl.py
new file mode 100755
index 0000000..b5832fd
--- /dev/null
+++ b/cli/acl.py
@@ -0,0 +1,211 @@
+#
+# Copyright 2008 Google Inc. All Rights Reserved.
+
+"""
+The acl module contains the objects and methods used to
+manage ACLs in Autotest.
+
+The valid actions are:
+add:     adds acl(s), or users or hosts to an ACL
+remove:      deletes acl(s), or users or hosts from an ACL
+list:    lists acl(s)
+
+The common options are:
+--alist / -A: file containing a list of ACLs
+
+See topic_common.py for a High Level Design and Algorithm.
+
+"""
+
+import os, sys
+from autotest_lib.cli import topic_common, action_common
+
+
+class acl(topic_common.atest):
+    """ACL class
+    atest acl [create|delete|list|add|remove] <options>"""
+    usage_action = '[create|delete|list|add|remove]'
+    topic = 'acl_group'
+    msg_topic = 'ACL'
+    msg_items = '<acls>'
+
+    def __init__(self):
+        """Add to the parser the options common to all the ACL actions"""
+        super(acl, self).__init__()
+        self.parser.add_option('-A', '--alist',
+                               help='File listing the ACLs',
+                               type='string',
+                               default=None,
+                               metavar='ACL_FLIST')
+
+
+    def parse(self, flists=None, req_items='acls'):
+        """Consume the common acl options"""
+        if flists:
+            flists.append(('acls', 'alist', '', True))
+        else:
+            flists = [('acls', 'alist', '', True)]
+        return self.parse_with_flist(flists, req_items)
+
+
+    def get_items(self):
+        return self.acls
+
+
+class acl_help(acl):
+    """Just here to get the atest logic working.
+    Usage is set by its parent"""
+    pass
+
+
+class acl_list(action_common.atest_list, acl):
+    """atest acl list [--verbose]
+    [--user <users>|--mach <machine>|--alist <file>] [<acls>]"""
+    def __init__(self):
+        super(acl_list, self).__init__()
+
+        self.parser.add_option('-u', '--user',
+                               help='List ACLs containing USER',
+                               type='string',
+                               metavar='USER')
+        self.parser.add_option('-m', '--machine',
+                               help='List ACLs containing MACHINE',
+                               type='string',
+                               metavar='MACHINE')
+
+
+    def parse(self):
+        flists = [('users', '', 'user', False),
+                  ('hosts', '', 'machine', False)]
+        (options, leftover) = super(acl_list, self).parse(flists,
+                                                          req_items=None)
+
+        if ((self.users and (self.hosts or self.acls)) or
+            (self.hosts and self.acls)):
+            self.invalid_syntax('Only specify one of --user,'
+                                '--machine or ACL')
+
+        if len(self.users) > 1:
+            self.invalid_syntax('Only specify one <user>')
+        if len(self.hosts) > 1:
+            self.invalid_syntax('Only specify one <machine>')
+
+        try:
+            self.users = self.users[0]
+        except IndexError:
+            pass
+
+        try:
+            self.hosts = self.hosts[0]
+        except IndexError:
+            pass
+        return (options, leftover)
+
+
+    def execute(self):
+        filters = {}
+        check_results = {}
+        if self.acls:
+            filters['name__in'] = self.acls
+            check_results['name__in'] = 'name'
+
+        if self.users:
+            filters['users__login'] = self.users
+            check_results['users__login'] = None
+
+        if self.hosts:
+            filters['hosts__hostname'] = self.hosts
+            check_results['hosts__hostname'] = None
+
+        return super(acl_list,
+                     self).execute(op='get_acl_groups',
+                                   filters=filters,
+                                   check_results=check_results)
+
+
+    def output(self, results):
+        super(acl_list, self).output(results,
+                                     keys=['name', 'description'],
+                                     sublist_keys=['hosts', 'users'])
+
+
+class acl_create(action_common.atest_create, acl):
+    """atest acl create <acl> --desc <description>"""
+    def __init__(self):
+        super(acl_create, self).__init__()
+        self.parser.add_option('-d', '--desc',
+                               help='Creates the ACL with the DESCRIPTION',
+                               type='string')
+        self.parser.remove_option('--alist')
+
+
+    def parse(self):
+        (options, leftover) = super(acl_create, self).parse()
+
+        if not options.desc:
+            self.invalid_syntax('Must specify a description to create an ACL.')
+
+        self.data_item_key = 'name'
+        self.data['description'] = options.desc
+
+        if len(self.acls) > 1:
+            self.invalid_syntax('Can only create one ACL at a time')
+
+        return (options, leftover)
+
+
+class acl_delete(action_common.atest_delete, acl):
+    """atest acl delete [<acls> | --alist <file>"""
+    pass
+
+
+class acl_add_or_remove(acl):
+    def __init__(self):
+        super(acl_add_or_remove, self).__init__()
+        # Get the appropriate help for adding or removing.
+        words = self.usage_words
+        lower_words = tuple(word.lower() for word in words)
+
+        self.parser.add_option('-u', '--user',
+                               help='%s USER(s) %s the ACL' % words,
+                               type='string',
+                               metavar='USER')
+        self.parser.add_option('-U', '--ulist',
+                               help='File containing users to %s %s '
+                               'the ACL' % lower_words,
+                               type='string',
+                               metavar='USER_FLIST')
+        self.parser.add_option('-m', '--machine',
+                               help='%s MACHINE(s) %s the ACL' % words,
+                               type='string',
+                               metavar='MACHINE')
+        self.parser.add_option('-M', '--mlist',
+                               help='File containing machines to %s %s '
+                               'the ACL' % lower_words,
+                               type='string',
+                               metavar='MACHINE_FLIST')
+
+
+    def parse(self):
+        flists = [('users', 'ulist', 'user', False),
+                  ('hosts', 'mlist', 'machine', False)]
+
+        (options, leftover) = super(acl_add_or_remove, self).parse(flists)
+
+        if (not getattr(self, 'users', None) and
+            not getattr(self, 'hosts', None)):
+            self.invalid_syntax('Specify at least one USER or MACHINE')
+
+        return (options, leftover)
+
+
+class acl_add(action_common.atest_add, acl_add_or_remove):
+    """atest acl add <acl> --user <user>|
+       --machine <machine>|--mlist <FILE>]"""
+    pass
+
+
+class acl_remove(action_common.atest_remove, acl_add_or_remove):
+    """atest acl remove [<acls> | --alist <file>
+    --user <user> | --machine <machine> | --mlist <FILE>]"""
+    pass