Esempio n. 1
0
File: io.py Progetto: jubalfh/cog
def merge_data(*files):
    """Merge data from multiple YAML files."""
    data = dict()
    for file in files:
        if os.path.isfile(file):
            data = dict_merge(data, read_yaml(file))
    return data
Esempio n. 2
0
def add(ctx, **args):
    """add a netgroup"""
    type = args.pop('nisNetgroupType')
    data = dict_merge(netgroups.get(type), args)
    cn = data.get('cn')
    path = data.pop('path', None)
    requires = data.pop('requires', None)
    dn = "cn=%s,%s" % (cn, dir.get_netgroup_base(type))
    netgroup_entry = dir.Entry(dn=dn, attrs=data)
    newnetgroup = Netgroup(cn, netgroup_entry)
    newnetgroup.add()
Esempio n. 3
0
def add(ctx, **args):
    """add a group"""
    type = args.pop('groupType')
    data = dict_merge(groups.get(type), args)
    cn = data.get('cn')
    path = data.pop('path', None)
    requires = data.pop('requires', None)
    if not data.get('gidNumber') and 'gidNumber' in requires:
        data['gidNumber'] = dir.get_probably_unique_gidnumber()
    dn = "cn=%s,%s" % (cn, dir.get_group_base(type))
    group_entry = dir.Entry(dn=dn, attrs=data)
    newgroup = Group(cn, group_entry)
    newgroup.add()
Esempio n. 4
0
def show(ctx, **args):
    names = args.get('uid')
    tree = dir.Tree()
    query = '(&(objectClass=*)(%s=%s))'
    attrs = ['uid', 'cn', 'gecos', 'mail', 'telephoneNumber', 'title',
            'o', 'uidNumber', 'gidNumber']
    if args.get('verbose'):
        attrs += ['objectClass', 'memberOf', 'loginShell', 'homeDirectory',
                  'modifiersName', 'modifyTimestamp', 'sshPublicKey']
    for name in names:
        search = tree.search(search_filter=(query % (user_rdn, name)), attributes=attrs)
        user = User(name)
        for item in search:
            groups = {'groups': sorted(flatten([group for group in user.find_groups()]))}
            account = {name: dict_merge(dict(item), groups)}
            print yaml.safe_dump(account, allow_unicode=True, default_flow_style=False)
Esempio n. 5
0
def get_access_group(name, priv_level):
    """
    Gets a netgroup handle. Creates the group when necessary.
    """
    group_type = 'security'
    group_data = dict_merge(netgroups.get(group_type), {})
    path = group_data.pop('path')
    requires = group_data.pop('requires')
    group_name = '%s-%s' % (name, priv_level)
    description = 'Users with %s access to %s.' % (access_levels[priv_level], name)

    dn = 'cn=%s,%s' % (group_name, dir.get_netgroup_base(group_type))
    access_group = Netgroup(group_name, dir.Entry(dn=dn,
                                                  attrs=group_data,
                                                  use_dn=True))
    if not access_group.exists:
        access_group.add()
        access_group.set_description(description)
    return access_group
Esempio n. 6
0
    def __init__(self, user_config=True):

        progpath = dirname(sys.argv[0])

        self.progname = 'cog'
        self.profiles = dict()
        self.store = dict()
        self.cfg_dirs = [pathjoin(dirname(progpath), 'etc', self.progname)]
        if user_config:
            self.make_conf()
            self.cfg_dirs.append(get_app_dir(self.progname, force_posix=True))
        self.cfg_files = [pathjoin(cfg_dir, 'settings')
                          for cfg_dir in self.cfg_dirs if isdir(cfg_dir)]

        self.profiles = merge_data(*self.cfg_files)
        self.current = self.profiles.pop('profile')
        for name, profile in self.profiles.items():
            self.profiles[name] = dict_merge(defaults, profile)
        self.use(self.current)
Esempio n. 7
0
def add(ctx, **args):
    """Adds new user to the directory."""
    account_type = args.pop('accountType')
    user_group = args.pop('userGroup', settings.usergroups)
    user_data = dict_merge(accounts.get(account_type), args)
    name = user_data.pop('uid')
    user_data[user_rdn] = name
    path = user_data.pop('path', None)
    secondary_groups = user_data.pop('group', None)
    requires = user_data.pop('requires', [])
    dn = "%s=%s,%s" % (user_rdn, name, dir.get_account_base(account_type))
    operator_uid = get_current_uid()
    for nameattr in ['cn', 'sn', 'givenName']:
        if not user_data.get(nameattr) and nameattr in requires:
            user_data[nameattr] = '%s (ask %s to fix me)' % (name, operator_uid)
    if 'uidNumber' not in user_data and 'uidNumber' in requires:
        user_data['uidNumber'] = dir.get_probably_unique_uidnumber()
    if 'homeDirectory' not in user_data and 'homeDirectory' in requires:
        user_data['homeDirectory'] = "/home/%s" % user_data['uid']
    user_data['userPassword'] = passwd.make_sha512(passwd.random_string())
    if 'sshpublickey' in user_data:
        ssh_key = read_ssh_keys(user_data.pop('sshpublickey'))
        user_data['sshPublicKey'] = ssh_key
        user_data['objectClass'].append('ldapPublicKey')
    if user_group:
        group_type = account_type if account_type in groups else 'generic'
        group_dn = "cn=%s,%s" % (name, dir.get_group_base(group_type))
        group_id = dir.get_probably_unique_gidnumber()
        group_data = {
            'objectClass': ['posixGroup', 'top'],
            'cn': name,
            'description': 'Personal group for %s.' % name,
            'gidNumber': group_id}
        group_entry = dir.Entry(dn=group_dn, attrs=group_data)
        user_data['gidNumber'] = group_id
        try:
            newgroup = Group(name, group_entry)
            newgroup.add()
        except ldap.LDAPError as e:
            print "A problem occured when creating user group %s – group hasn't been created." % name
    user_entry = dir.Entry(dn=dn, attrs=user_data)
    newuser = User(name, user_entry, groups=secondary_groups)
    newuser.add()
Esempio n. 8
0
 def expand_inheritances(templates):
     """Expand inheritances in object templates."""
     # FIXME: v. naive approach. Still.
     expanded = dict()
     for type, data in templates.items():
         expanded.update({type: {}})
         for name, template in data.items():
             desc = template.get(
                 'desc', '{} template for {} object'.format(name, type))
             attrs = template.get('default', None)
             parent = template.get('inherits', None)
             parents = []
             while True:
                 if parent and parent not in parents:
                     parents.append(parent)
                     parent = data.get(parent).get('inherits', None)
                 else:
                     break
             for parent in reversed(parents):
                 parent_attrs = data.get(parent).get('default')
                 attrs = dict_merge(parent_attrs, attrs)
             limits = attrs.pop('limits', None)
             expanded[type].update({name: Template(name, desc, limits, attrs)})
     return expanded