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)
将一个字典数据转换成多行字段
转载于:https://blog.51cto.com/john88wang/1627054