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'


# Define a function alias in order not to shadow built-in's
__func_alias__ = {
    'set_': 'set'
}


def __virtual__():
    '''
    Only work on POSIX-like systems
    '''
    if salt.utils.is_windows():
        return False
    return True

判断操作系统的类型,如果是windows就不使用这个模块

判断是否是windows的函数

def is_windows():
    '''  
    Simple function to return if a host is Windows or not
    '''
    return sys.platform.startswith('win')



def _parse_conf(conf_file=default_conf):
    '''
    Parse a logrotate configuration file.

    Includes will also be parsed, and their configuration will be stored in the
    return dict, as if they were part of the main config file. A dict of which
    configs came from which includes will be stored in the 'include files' dict
    inside the return dict, for later reference by the user or module.
    '''
    ret = {}
    mode = 'single'
    multi_name = ''
    multi = {}
    with salt.utils.fopen(conf_file, 'r') as ifile:
        for line in ifile:
            line = line.strip()
            if not line:
                continue
            if line.startswith('#'):
                continue

            comps = line.split()
            if '{' in line and '}' not in line:
                mode = 'multi'
                multi_name = comps[0]
                continue
            if '}' in line:
                mode = 'single'
                ret[multi_name] = multi
                multi_name = ''
                multi = {}
                continue

            if mode == 'single':
                key = ret
            else:
                key = multi

            if comps[0] == 'include':
                if 'include files' not in ret:
                    ret['include files'] = {}
                for include in os.listdir(comps[1]):
                    if include not in ret['include files']:
                        ret['include files'][include] = []
                    include_path = '{0}/{1}'.format(comps[1], include)
                    include_conf = _parse_conf(include_path)
                    for file_key in include_conf:
                        ret[file_key] = include_conf[file_key]
                        ret['include files'][include].append(file_key)

            if len(comps) > 1:
                key[comps[0]] = ' '.join(comps[1:])
            else:
                key[comps[0]] = True
    return ret

解析配置文件




def show_conf(conf_file=default_conf):
    '''
    Show parsed configuration

    CLI Example:

    .. code-block:: bash

        salt '*' logrotate.show_conf
    '''
    return _parse_conf(conf_file)

显示配置文件

$ sudo salt 'gintama-qa-server' logrotate.show_conf
gintama-qa-server:
    ----------
    /var/log/btmp:
        ----------
        create:
            0600 root utmp
        missingok:
            True
        monthly:
            True
        rotate:
            1
    /var/log/cron:
        True
    /var/log/dracut.log:
        ----------
        create:
            0600 root root
        missingok:
            True
        notifempty:
            True
        size:
            30k
        yearly:
            True
    /var/log/httpd/*log:
        ----------
        /sbin/service:
            httpd reload > /dev/null 2>/dev/null || true
        delaycompress:
            True
        endscript:
            True
        missingok:
            True
        notifempty:
            True
        postrotate:
            True
        sharedscripts:
            True
    /var/log/maillog:
        True
    /var/log/messages:
        True
    /var/log/salt/cloud:
        ----------
        compress:
            True
        missingok:
            True
        notifempty:
            True
        rotate:
            5
        weekly:
            True
    /var/log/salt/key:
        ----------
        compress:
            True
        missingok:
            True
        notifempty:
            True
        rotate:
            5
        weekly:
            True
    /var/log/salt/master:
        ----------
        compress:
            True
        missingok:
            True
        notifempty:
            True
        rotate:
            5
        weekly:
            True
    /var/log/salt/minion:
        ----------
        compress:
            True
        missingok:
            True
        notifempty:
            True
        rotate:
            5
        weekly:
            True
    /var/log/salt/ssh:
        ----------
        compress:
            True
        missingok:
            True
        notifempty:
            True
        rotate:
            5
        weekly:
            True
    /var/log/secure:
        True
    /var/log/spooler:
        True
    /var/log/wtmp:
        ----------
        create:
            0664 root utmp
        minsize:
            1M
        monthly:
            True
        rotate:
            1
    /var/log/yum.log:
        ----------
        create:
            0600 root root
        missingok:
            True
        notifempty:
            True
        yearly:
            True
    create:
        True
    dateext:
        True
    include:
        /etc/logrotate.d
    include files:
        ----------
        dracut:
            - /var/log/dracut.log
        httpd:
            - /var/log/httpd/*log
        salt:
            - /var/log/salt/master
            - /var/log/salt/ssh
            - /var/log/salt/cloud
            - /var/log/salt/key
            - /var/log/salt/minion
        syslog:
            - /var/log/secure
            - /var/log/messages
            - /var/log/maillog
            - /var/log/cron
            - /var/log/spooler
            - {
        yum:
            - /var/log/yum.log
    rotate:
        4
    weekly:
        True
    {:
        ----------
        /bin/kill:
            -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript:
            True
        postrotate:
            True
        sharedscripts:
            True



def set_(key, value, setting=None, conf_file=default_conf):
    '''
    Set a new value for a specific configuration line

    CLI Example:

    .. code-block:: bash

        salt '*' logrotate.set rotate 2

    Can also be used to set a single value inside a multiline configuration
    block. For instance, to change rotate in the following block::

        /var/log/wtmp {
            monthly
            create 0664 root root
            rotate 1
        }

    Use the following command:

    .. code-block:: bash

        salt '*' logrotate.set /var/log/wtmp rotate 2

    This module also has the ability to scan files inside an include directory,
    and make changes in the appropriate file.
    '''
    conf = _parse_conf(conf_file)
    for include in conf['include files']:
        if key in conf['include files'][include]:
            conf_file = os.path.join(conf['include'], include)

    if isinstance(conf[key], dict) and not setting:
        return (
            'Error: {0} includes a dict, and a specific setting inside the '
            'dict was not declared'.format(key)
        )

    if setting:
        if isinstance(conf[key], str):
            return ('Error: A setting for a dict was declared, but the '
                    'configuration line given is not a dict')
        # We're going to be rewriting an entire stanza
        stanza = conf[key]
        if value == 'False':
            del stanza[value]
        else:
            stanza[value] = setting
        new_line = _dict_to_stanza(key, stanza)
        log.debug(stanza)
        log.debug(new_line)
        log.debug(key)
        __salt__['file.psed'](conf_file,
                              '{0}.*{{.*}}'.format(key),
                              new_line)
    else:
        # This is the new config line that will be set
        if value == 'True':
            new_line = key
        elif value == 'False':
            new_line = ''
        else:
            new_line = '{0} {1}'.format(key, value)

        log.debug(conf_file)
        log.debug(key)
        log.debug(new_line)
        __salt__['file.psed'](conf_file,
                              '^{0}.*'.format(key),
                              new_line,
                              flags='gM')

设置配置项

sudo salt 'gintama-qa-server' logrotate.set rotate 4



def _dict_to_stanza(key, stanza):
    '''
    Convert a dict to a multi-line stanza
    '''
    ret = ''
    for skey in stanza:
        if stanza[skey] is True:
            stanza[skey] = ''
        ret += '    {0} {1}\n'.format(skey, stanza[skey])
    return '{0} {{\n{1}}}'.format(key, ret)


将一个字典数据转换成多行字段