SaltStack源码分析之user状态模块

user状态模块用于在sls文件中指定安装包的uid等属性

/usr/lib/python2.6/site-packages/salt/states/user.py

‘‘‘
Management of user accounts
===========================

The user module is used to create and manage user settings, users can be set
as either absent or present

.. code-block:: yaml

    fred:
      user.present:
        - fullname: Fred Jones
        - shell: /bin/zsh
        - home: /home/fred
        - uid: 4000
        - gid: 4000
        - groups:
          - wheel
          - storage
          - games

    testuser:
      user.absent
‘‘‘
def present(name,
            uid=None,
            gid=None,
            gid_from_name=False,
            groups=None,
            optional_groups=None,
            remove_groups=True,
            home=None,
            createhome=True,
            password=None,
            enforce_password=True,
            empty_password=False,
            shell=None,
            unique=True,
            system=False,
            fullname=None,
            roomnumber=None,
            workphone=None,
            homephone=None,
            date=None,
            mindays=None,
            maxdays=None,
            inactdays=None,
            warndays=None,
            expire=None):
    ‘‘‘
    Ensure that the named user is present with the specified properties

    name
        The name of the user to manage

    uid
        The user id to assign, if left empty then the next available user id
        will be assigned

    gid
        The default group id

    gid_from_name
        If True, the default group id will be set to the id of the group with
        the same name as the user.

    groups
        A list of groups to assign the user to, pass a list object. If a group
        specified here does not exist on the minion, the state will fail.
        If set to the empty list, the user will be removed from all groups
        except the default group.

    optional_groups
        A list of groups to assign the user to, pass a list object. If a group
        specified here does not exist on the minion, the state will silently
        ignore it.

    NOTE: If the same group is specified in both "groups" and
    "optional_groups", then it will be assumed to be required and not optional.

    remove_groups
        Remove groups that the user is a member of that weren‘t specified in
        the state, True by default

    home
        The location of the home directory to manage

    createhome
        If True, the home directory will be created if it doesn‘t exist.
        Please note that directories leading up to the home directory
        will NOT be created.

    password
        A password hash to set for the user. This field is only supported on
        Linux, FreeBSD, NetBSD, OpenBSD, and Solaris.

    .. versionchanged:: 0.16.0
       BSD support added.

    enforce_password
        Set to False to keep the password from being changed if it has already
        been set and the password hash differs from what is specified in the
        "password" field. This option will be ignored if "password" is not
        specified.

    empty_password
        Set to True to enable no password-less login for user

    shell
        The login shell, defaults to the system default shell

    unique
        Require a unique UID, True by default

    system
        Choose UID in the range of FIRST_SYSTEM_UID and LAST_SYSTEM_UID.

    User comment field (GECOS) support (currently Linux, FreeBSD, and MacOS
    only):

    The below values should be specified as strings to avoid ambiguities when
    the values are loaded. (Especially the phone and room number fields which
    are likely to contain numeric data)

    fullname
        The user‘s full name

    roomnumber
        The user‘s room number (not supported in MacOS)

    workphone
        The user‘s work phone number (not supported in MacOS)

    homephone
        The user‘s home phone number (not supported in MacOS)

    .. versionchanged:: 2014.7.0
       Shadow attribute support added.

    Shadow attributes support (currently Linux only):

    The below values should be specified as integers.

    date
        Date of last change of password, represented in days since epoch
        (January 1, 1970).

    mindays
        The minimum number of days between password changes.

    maxdays
        The maximum number of days between password changes.

    inactdays
        The number of days after a password expires before an account is
        locked.

    warndays
        Number of days prior to maxdays to warn users.

    expire
        Date that account expires, represented in days since epoch (January 1,
        1970).
    ‘‘‘
    fullname = str(fullname) if fullname is not None else fullname
    roomnumber = str(roomnumber) if roomnumber is not None else roomnumber
    workphone = str(workphone) if workphone is not None else workphone
    homephone = str(homephone) if homephone is not None else homephone

    ret = {‘name‘: name,
           ‘changes‘: {},
           ‘result‘: True,
           ‘comment‘: ‘User {0} is present and up to date‘.format(name)}

    if groups:
        missing_groups = [x for x in groups if not __salt__[‘group.info‘](x)]
        if missing_groups:
            ret[‘comment‘] = ‘The following group(s) are not present: ‘                              ‘{0}‘.format(‘,‘.join(missing_groups))
            ret[‘result‘] = False
            return ret

    if optional_groups:
        present_optgroups = [x for x in optional_groups
                             if __salt__[‘group.info‘](x)]
        for missing_optgroup in [x for x in optional_groups
                                 if x not in present_optgroups]:
            log.debug(‘Optional group "{0}" for user "{1}" is not ‘
                      ‘present‘.format(missing_optgroup, name))
    else:
        present_optgroups = None

    # Log a warning for all groups specified in both "groups" and
    # "optional_groups" lists.
    if groups and optional_groups:
        for isected in set(groups).intersection(optional_groups):
            log.warning(‘Group "{0}" specified in both groups and ‘
                        ‘optional_groups for user {1}‘.format(isected, name))

    if gid_from_name:
        gid = __salt__[‘file.group_to_gid‘](name)

    if empty_password:
        __salt__[‘shadow.del_password‘](name)

    changes = _changes(name,
                       uid,
                       gid,
                       groups,
                       present_optgroups,
                       remove_groups,
                       home,
                       createhome,
                       password,
                       enforce_password,
                       empty_password,
                       shell,
                       fullname,
                       roomnumber,
                       workphone,
                       homephone,
                       date,
                       mindays,
                       maxdays,
                       inactdays,
                       warndays,
                       expire)

    if changes:
        if __opts__[‘test‘]:
            ret[‘result‘] = None
            ret[‘comment‘] = (‘The following user attributes are set to be ‘
                              ‘changed:\n‘)
            for key, val in changes.items():
                ret[‘comment‘] += ‘{0}: {1}\n‘.format(key, val)
            return ret
        # The user is present
        if ‘shadow.info‘ in __salt__:
            lshad = __salt__[‘shadow.info‘](name)
        pre = __salt__[‘user.info‘](name)
        for key, val in changes.items():
            if key == ‘passwd‘ and not empty_password:
                __salt__[‘shadow.set_password‘](name, password)
                continue
            if key == ‘date‘:
                __salt__[‘shadow.set_date‘](name, date)
                continue
            if key == ‘home‘ or key == ‘homeDoesNotExist‘:
                if createhome:
                    __salt__[‘user.chhome‘](name, val, True)
                else:
                    __salt__[‘user.chhome‘](name, val, False)
                continue
            if key == ‘mindays‘:
                __salt__[‘shadow.set_mindays‘](name, mindays)
                continue
            if key == ‘maxdays‘:
                __salt__[‘shadow.set_maxdays‘](name, maxdays)
                continue
            if key == ‘inactdays‘:
                __salt__[‘shadow.set_inactdays‘](name, inactdays)
                continue
            if key == ‘warndays‘:
                __salt__[‘shadow.set_warndays‘](name, warndays)
                continue
            if key == ‘expire‘:
                __salt__[‘shadow.set_expire‘](name, expire)
                continue
            if key == ‘groups‘:
                __salt__[‘user.ch{0}‘.format(key)](
                    name, val, not remove_groups
                )
            else:
                __salt__[‘user.ch{0}‘.format(key)](name, val)

        post = __salt__[‘user.info‘](name)
        spost = {}
        if ‘shadow.info‘ in __salt__:
            if lshad[‘passwd‘] != password:
                spost = __salt__[‘shadow.info‘](name)
        # See if anything changed
        for key in post:
            if post[key] != pre[key]:
                ret[‘changes‘][key] = post[key]
        if ‘shadow.info‘ in __salt__:
            for key in spost:
                if lshad[key] != spost[key]:
                    ret[‘changes‘][key] = spost[key]
        if ret[‘changes‘]:
            ret[‘comment‘] = ‘Updated user {0}‘.format(name)
        changes = _changes(name,
                           uid,
                           gid,
                           groups,
                           present_optgroups,
                           remove_groups,
                           home,
                           createhome,
                           password,
                           enforce_password,
                           empty_password,
                           shell,
                           fullname,
                           roomnumber,
                           workphone,
                           homephone,
                           date,
                           mindays,
                           maxdays,
                           inactdays,
                           warndays,
                           expire)

        if changes:
            ret[‘comment‘] = ‘These values could not be changed: {0}‘.format(
                changes
            )
            ret[‘result‘] = False
        return ret

    if changes is False:
        # The user is not present, make it!
        if __opts__[‘test‘]:
            ret[‘result‘] = None
            ret[‘comment‘] = ‘User {0} set to be added‘.format(name)
            return ret
        if groups and present_optgroups:
            groups.extend(present_optgroups)
        elif present_optgroups:
            groups = present_optgroups[:]
        if __salt__[‘user.add‘](name,
                                uid=uid,
                                gid=gid,
                                groups=groups,
                                home=home,
                                shell=shell,
                                unique=unique,
                                system=system,
                                fullname=fullname,
                                roomnumber=roomnumber,
                                workphone=workphone,
                                homephone=homephone,
                                createhome=createhome):
            ret[‘comment‘] = ‘New user {0} created‘.format(name)
            ret[‘changes‘] = __salt__[‘user.info‘](name)
            if ‘shadow.info‘ in __salt__ and not salt.utils.is_windows():
                if password and not empty_password:
                    __salt__[‘shadow.set_password‘](name, password)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘passwd‘] != password:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ password to‘                                          ‘ {1}‘.format(name, password)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘password‘] = password
                if date:
                    __salt__[‘shadow.set_date‘](name, date)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘lstchg‘] != date:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ last change date to‘                                          ‘ {1}‘.format(name, date)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘date‘] = date
                if mindays:
                    __salt__[‘shadow.set_mindays‘](name, mindays)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘min‘] != mindays:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ minimum days to‘                                          ‘ {1}‘.format(name, mindays)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘mindays‘] = mindays
                if maxdays:
                    __salt__[‘shadow.set_maxdays‘](name, mindays)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘max‘] != maxdays:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ maximum days to‘                                          ‘ {1}‘.format(name, maxdays)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘maxdays‘] = maxdays
                if inactdays:
                    __salt__[‘shadow.set_inactdays‘](name, inactdays)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘inact‘] != inactdays:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ inactive days to‘                                          ‘ {1}‘.format(name, inactdays)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘inactdays‘] = inactdays
                if warndays:
                    __salt__[‘shadow.set_warndays‘](name, warndays)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘warn‘] != warndays:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ warn days to‘                                          ‘ {1}‘.format(name, mindays)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘warndays‘] = warndays
                if expire:
                    __salt__[‘shadow.set_expire‘](name, expire)
                    spost = __salt__[‘shadow.info‘](name)
                    if spost[‘expire‘] != expire:
                        ret[‘comment‘] = ‘User {0} created but failed to set‘                                          ‘ expire days to‘                                          ‘ {1}‘.format(name, expire)
                        ret[‘result‘] = False
                    ret[‘changes‘][‘expire‘] = expire
        else:
            ret[‘comment‘] = ‘Failed to create new user {0}‘.format(name)
            ret[‘result‘] = False

    return ret
时间: 2024-10-05 17:19:29

SaltStack源码分析之user状态模块的相关文章

SaltStack源码分析之group状态模块

group状态模块用于创建并管理UNIX组账号设置. /usr/lib/python2.6/site-packages/salt/states/group.py ''' Management of user groups ========================= The group module is used to create and manage unix group settings, groups can be either present or absent: .. cod

SaltStack源码分析之pkg状态模块

pkg状态模块使用各个操作系统自带的包管理工具来安装各种软件包,例如RedHat系列使用YUM安装软件包,Ubuntu使用apt-get安装等 /usr/lib/python2.6/site-packages/salt/states/pkg.py ''' Installation of packages using OS package managers such as yum or apt-get ================================================

SaltStack源码分析之service状态模块

/usr/lib/python2.6/site-packages/salt/states/service.py 这个模块用于启动或重启服务和后台进程 starting or restarting of services and daemons ============================================== Services are defined as system daemons typically started with system init or rc s

SaltStack源码分析之file状态模块

file模块用于对普通文件,目录,特殊文件和链接文件进行各种操作 /usr/lib/python2.6/site-packages/salt/states/file.py def managed(name,             source=None,             source_hash='',             user=None,             group=None,             mode=None,             template=No

SaltStack源码分析之使用Redis模块

Redis模块路径 /usr/lib/python2.6/site-packages/salt/modules/redismod.py Redis模块会首先检查是否安装有Redis的Python驱动 # -*- coding: utf-8 -*- ''' Module to provide redis functionality to Salt .. versionadded:: 2014.7.0 :configuration: This module requires the redis py

SaltStack源码分析之使用MongoDB模块

MongoDB模块

SaltStack源码分析之使用logrotate模块

logrotate模块用于处理日志文件轮转的相关任务 # -*- coding: utf-8 -*- ''' Module for managing logrotate. ''' # Import python libs import os import logging # Import salt libs import salt.utils log = logging.getLogger(__name__) default_conf = '/etc/logrotate.conf' # Defi

Hadoop2源码分析-HDFS核心模块分析

1.概述 这篇博客接着<Hadoop2源码分析-RPC机制初识>来讲述,前面我们对MapReduce.序列化.RPC进行了分析和探索,对Hadoop V2的这些模块都有了大致的了解,通过对这些模块的研究,我们明白了MapReduce的运行流程以及内部的实现机制,Hadoop的序列化以及它的通信机制(RPC).今天我们来研究另一个核心的模块,那就是Hadoop的分布式文件存储系统——HDFS,下面是今天分享的内容目录: HDFS简述 NameNode DataNode 接下来,我们开始今天的分享

jQuery1.9.1源码分析--数据缓存Data模块

阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(elem, name, data)源码分析 internalRemoveData方法源码分析 internalData方法的源码分析 jQuery.fn.extend({data: function( key, value ) {}})源码分析 jQuery.extend({removeData: function( elem, name ) {}})源码分