관리-도구
편집 파일: cl_sysctl
#!/opt/cloudlinux/venv/bin/python3 -bb # coding: utf-8 # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2018 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT import fcntl import sys import time import os from argparse import ArgumentParser from clcommon.sysctl import SysCtlConf, SysCtlMigrate, SYSCTL_CL_CONF_FILE, SYSCTL_FILE SELF_LOCK_FILE = '/var/log/cl_sysctl.lock' def create_parser(): config_help = 'Path to sysctl config file. It\'s %(default)s by default' config_path = SYSCTL_CL_CONF_FILE parser = ArgumentParser(description='Utility for working with sysctl configs. INTERNAL USAGE ONLY!') subparsers = parser.add_subparsers(dest='command') subparser_set = subparsers.add_parser(name='set', help='Set or add the the sysctl parameter to the sysctl config') subparser_set.add_argument('-P', '--parameter', action='store', required=True, help='Name of the sysctl parameter') subparser_set.add_argument('-V', '--value', action='store', required=True, help='Value of the sysctl parameter') subparser_set.add_argument('-C', '--config', action='store', help=config_help, default=config_path) subparser_get = subparsers.add_parser(name='get', help='Get the sysctl parameter') subparser_get.add_argument('-P', '--parameter', action='store', required=True, help='Name of the sysctl parameter') subparser_get.add_argument('-C', '--config', action='store', help=config_help, default=config_path) subparser_remove = subparsers.add_parser(name='remove', help='Remove the sysctl parameter from the sysctl config') subparser_remove.add_argument('-P', '--parameter', action='store', required=True, help='Name of the sysctl parameter') subparser_remove.add_argument('-C', '--config', action='store', help=config_help, default=config_path) subparsers_migrate = subparsers.add_parser(name='migrate', help='Migrate sysctl param from {} to {}'.format( SYSCTL_FILE, SYSCTL_CL_CONF_FILE, )) subparsers_migrate.add_argument('-P', '--parameter', action='store', required=True, help='Name of the sysctl parameter') subparsers_migrate.add_argument('-dV', '--default-value', action='store', help='Default value of sysctl parameter if it is absent in source file') return parser def _parse_args(argv): parser = create_parser() params = parser.parse_args(argv) return params def main_(args): params = _parse_args(args) command = params.command if command == 'set': config_file = params.config sysctl = SysCtlConf(config_file=config_file) sysctl.set(name=params.parameter, value=params.value) elif command == 'get': config_file = params.config sysctl = SysCtlConf(config_file=config_file) value = sysctl.get(name=params.parameter) print(value) elif command == 'remove': config_file = params.config sysctl = SysCtlConf(config_file=config_file) sysctl.remove(name=params.parameter) elif command == 'migrate': sysctl_migrate = SysCtlMigrate() sysctl_migrate.migrate( param_name=params.parameter, default_value=params.default_value, ) def main(): with open(SELF_LOCK_FILE, 'w') as lock_file: lock_file_is_locked = True for _ in range(20): try: fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB) lock_file_is_locked = False break except IOError: print('Another app is currently holding the cl_sysctl lock; waiting for it to exit.') time.sleep(5) if lock_file_is_locked: print('Another app is still holding the cl_sysctl lock after 20 attempts. Please, try again later.') exit(1) else: main_(sys.argv[1:]) try: os.remove(SELF_LOCK_FILE) except (IOError, OSError): pass if __name__ == '__main__': main()