226 lines
7.6 KiB
Python
226 lines
7.6 KiB
Python
#
|
|
# 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.
|
|
|
|
"""
|
|
|
|
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')
|
|
|
|
self.topic_parse_info = topic_common.item_parse_info(
|
|
attribute_name='acls',
|
|
filename_option='alist',
|
|
use_leftover=True)
|
|
|
|
|
|
def get_items(self):
|
|
"""Get the items in the ACL list."""
|
|
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):
|
|
user_info = topic_common.item_parse_info(attribute_name='users',
|
|
inline_option='user')
|
|
host_info = topic_common.item_parse_info(attribute_name='hosts',
|
|
inline_option='machine')
|
|
|
|
(options, leftover) = super(acl_list, self).parse([user_info,
|
|
host_info])
|
|
|
|
users = getattr(self, 'users')
|
|
hosts = getattr(self, 'hosts')
|
|
acls = getattr(self, 'acls')
|
|
if ((users and (hosts or acls)) or
|
|
(hosts and acls)):
|
|
self.invalid_syntax('Only specify one of --user,'
|
|
'--machine or ACL')
|
|
|
|
if len(users) > 1:
|
|
self.invalid_syntax('Only specify one <user>')
|
|
if len(hosts) > 1:
|
|
self.invalid_syntax('Only specify one <machine>')
|
|
|
|
try:
|
|
self.users = users[0]
|
|
except IndexError:
|
|
pass
|
|
|
|
try:
|
|
self.hosts = 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):
|
|
# If an ACL was specified, always print its details
|
|
if self.acls or self.verbose:
|
|
sublist_keys=('hosts', 'users')
|
|
else:
|
|
sublist_keys=()
|
|
|
|
super(acl_list, self).output(results,
|
|
keys=('name', 'description'),
|
|
sublist_keys=sublist_keys)
|
|
|
|
|
|
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(req_items='acls')
|
|
|
|
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):
|
|
"""Shared implementation for acl add and acl remove."""
|
|
|
|
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):
|
|
user_info = topic_common.item_parse_info(attribute_name='users',
|
|
inline_option='user',
|
|
filename_option='ulist')
|
|
host_info = topic_common.item_parse_info(attribute_name='hosts',
|
|
inline_option='machine',
|
|
filename_option='mlist')
|
|
(options, leftover) = super(acl_add_or_remove,
|
|
self).parse([user_info, host_info],
|
|
req_items='acls')
|
|
|
|
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
|