Merge pull request #399 from josegonzalez/patch-1

Improve pep8 compliance
This commit is contained in:
Travis Rowland
2017-05-08 20:46:45 -07:00
committed by GitHub

View File

@@ -1,5 +1,16 @@
#!/usr/bin/python3 -u #!/usr/bin/python3 -u
import os, os.path, sys, stat, signal, errno, argparse, time, json, re # -*- coding: utf-8 -*-
import argparse
import errno
import json
import os
import os.path
import re
import signal
import stat
import sys
import time
KILL_PROCESS_TIMEOUT = int(os.environ.get('KILL_PROCESS_TIMEOUT', 5)) KILL_PROCESS_TIMEOUT = int(os.environ.get('KILL_PROCESS_TIMEOUT', 5))
KILL_ALL_PROCESSES_TIMEOUT = int(os.environ.get('KILL_ALL_PROCESSES_TIMEOUT', 5)) KILL_ALL_PROCESSES_TIMEOUT = int(os.environ.get('KILL_ALL_PROCESSES_TIMEOUT', 5))
@@ -15,33 +26,43 @@ log_level = None
terminated_child_processes = {} terminated_child_processes = {}
_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search
class AlarmException(Exception): class AlarmException(Exception):
pass pass
def error(message): def error(message):
if log_level >= LOG_LEVEL_ERROR: if log_level >= LOG_LEVEL_ERROR:
sys.stderr.write("*** %s\n" % message) sys.stderr.write("*** %s\n" % message)
def warn(message): def warn(message):
if log_level >= LOG_LEVEL_WARN: if log_level >= LOG_LEVEL_WARN:
sys.stderr.write("*** %s\n" % message) sys.stderr.write("*** %s\n" % message)
def info(message): def info(message):
if log_level >= LOG_LEVEL_INFO: if log_level >= LOG_LEVEL_INFO:
sys.stderr.write("*** %s\n" % message) sys.stderr.write("*** %s\n" % message)
def debug(message): def debug(message):
if log_level >= LOG_LEVEL_DEBUG: if log_level >= LOG_LEVEL_DEBUG:
sys.stderr.write("*** %s\n" % message) sys.stderr.write("*** %s\n" % message)
def ignore_signals_and_raise_keyboard_interrupt(signame): def ignore_signals_and_raise_keyboard_interrupt(signame):
signal.signal(signal.SIGTERM, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN)
signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGINT, signal.SIG_IGN)
raise KeyboardInterrupt(signame) raise KeyboardInterrupt(signame)
def raise_alarm_exception(): def raise_alarm_exception():
raise AlarmException('Alarm') raise AlarmException('Alarm')
def listdir(path): def listdir(path):
try: try:
result = os.stat(path) result = os.stat(path)
@@ -52,13 +73,15 @@ def listdir(path):
else: else:
return [] return []
def is_exe(path): def is_exe(path):
try: try:
return os.path.isfile(path) and os.access(path, os.X_OK) return os.path.isfile(path) and os.access(path, os.X_OK)
except OSError: except OSError:
return False return False
def import_envvars(clear_existing_environment = True, override_existing_environment = True):
def import_envvars(clear_existing_environment=True, override_existing_environment=True):
if not os.path.exists("/etc/container_environment"): if not os.path.exists("/etc/container_environment"):
return return
new_env = {} new_env = {}
@@ -76,7 +99,8 @@ def import_envvars(clear_existing_environment = True, override_existing_environm
if override_existing_environment or not name in os.environ: if override_existing_environment or not name in os.environ:
os.environ[name] = value os.environ[name] = value
def export_envvars(to_dir = True):
def export_envvars(to_dir=True):
if not os.path.exists("/etc/container_environment"): if not os.path.exists("/etc/container_environment"):
return return
shell_dump = "" shell_dump = ""
@@ -92,7 +116,6 @@ def export_envvars(to_dir = True):
with open("/etc/container_environment.json", "w") as f: with open("/etc/container_environment.json", "w") as f:
f.write(json.dumps(dict(os.environ))) f.write(json.dumps(dict(os.environ)))
_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search
def shquote(s): def shquote(s):
"""Return a shell-escaped version of the string *s*.""" """Return a shell-escaped version of the string *s*."""
@@ -105,12 +128,15 @@ def shquote(s):
# the string $'b is then quoted as '$'"'"'b' # the string $'b is then quoted as '$'"'"'b'
return "'" + s.replace("'", "'\"'\"'") + "'" return "'" + s.replace("'", "'\"'\"'") + "'"
def sanitize_shenvname(s): def sanitize_shenvname(s):
return re.sub(SHENV_NAME_WHITELIST_REGEX, "_", s) return re.sub(SHENV_NAME_WHITELIST_REGEX, "_", s)
# Waits for the child process with the given PID, while at the same time # Waits for the child process with the given PID, while at the same time
# reaping any other child processes that have exited (e.g. adopted child # reaping any other child processes that have exited (e.g. adopted child
# processes that have terminated). # processes that have terminated).
def waitpid_reap_other_children(pid): def waitpid_reap_other_children(pid):
global terminated_child_processes global terminated_child_processes
@@ -143,7 +169,8 @@ def waitpid_reap_other_children(pid):
raise raise
return status return status
def stop_child_process(name, pid, signo = signal.SIGTERM, time_limit = KILL_PROCESS_TIMEOUT):
def stop_child_process(name, pid, signo=signal.SIGTERM, time_limit=KILL_PROCESS_TIMEOUT):
info("Shutting down %s (PID %d)..." % (name, pid)) info("Shutting down %s (PID %d)..." % (name, pid))
try: try:
os.kill(pid, signo) os.kill(pid, signo)
@@ -168,6 +195,7 @@ def stop_child_process(name, pid, signo = signal.SIGTERM, time_limit = KILL_PROC
finally: finally:
signal.alarm(0) signal.alarm(0)
def run_command_killable(*argv): def run_command_killable(*argv):
filename = argv[0] filename = argv[0]
status = None status = None
@@ -185,11 +213,13 @@ def run_command_killable(*argv):
error("%s failed with status %d\n" % (filename, os.WEXITSTATUS(status))) error("%s failed with status %d\n" % (filename, os.WEXITSTATUS(status)))
sys.exit(1) sys.exit(1)
def run_command_killable_and_import_envvars(*argv): def run_command_killable_and_import_envvars(*argv):
run_command_killable(*argv) run_command_killable(*argv)
import_envvars() import_envvars()
export_envvars(False) export_envvars(False)
def kill_all_processes(time_limit): def kill_all_processes(time_limit):
info("Killing all processes...") info("Killing all processes...")
try: try:
@@ -217,6 +247,7 @@ def kill_all_processes(time_limit):
finally: finally:
signal.alarm(0) signal.alarm(0)
def run_startup_files(): def run_startup_files():
# Run /etc/my_init.d/* # Run /etc/my_init.d/*
for name in listdir("/etc/my_init.d"): for name in listdir("/etc/my_init.d"):
@@ -230,6 +261,7 @@ def run_startup_files():
info("Running /etc/rc.local...") info("Running /etc/rc.local...")
run_command_killable_and_import_envvars("/etc/rc.local") run_command_killable_and_import_envvars("/etc/rc.local")
def start_runit(): def start_runit():
info("Booting runit daemon...") info("Booting runit daemon...")
pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir", pid = os.spawnl(os.P_NOWAIT, "/usr/bin/runsvdir", "/usr/bin/runsvdir",
@@ -237,6 +269,7 @@ def start_runit():
info("Runit started as PID %d" % pid) info("Runit started as PID %d" % pid)
return pid return pid
def wait_for_runit_or_interrupt(pid): def wait_for_runit_or_interrupt(pid):
try: try:
status = waitpid_reap_other_children(pid) status = waitpid_reap_other_children(pid)
@@ -244,11 +277,13 @@ def wait_for_runit_or_interrupt(pid):
except KeyboardInterrupt: except KeyboardInterrupt:
return (False, None) return (False, None)
def shutdown_runit_services(quiet = False):
def shutdown_runit_services(quiet=False):
if not quiet: if not quiet:
debug("Begin shutting down runit services...") debug("Begin shutting down runit services...")
os.system("/usr/bin/sv -w %d down /etc/service/* > /dev/null" % KILL_PROCESS_TIMEOUT) os.system("/usr/bin/sv -w %d down /etc/service/* > /dev/null" % KILL_PROCESS_TIMEOUT)
def wait_for_runit_services(): def wait_for_runit_services():
debug("Waiting for runit services to exit...") debug("Waiting for runit services to exit...")
done = False done = False
@@ -263,10 +298,12 @@ def wait_for_runit_services():
# services. # services.
shutdown_runit_services(True) shutdown_runit_services(True)
def install_insecure_key(): def install_insecure_key():
info("Installing insecure SSH key for user root") info("Installing insecure SSH key for user root")
run_command_killable("/usr/sbin/enable_insecure_key") run_command_killable("/usr/sbin/enable_insecure_key")
def main(args): def main(args):
import_envvars(False, False) import_envvars(False, False)
export_envvars() export_envvars()
@@ -320,24 +357,24 @@ def main(args):
wait_for_runit_services() wait_for_runit_services()
# Parse options. # Parse options.
parser = argparse.ArgumentParser(description = 'Initialize the system.') parser = argparse.ArgumentParser(description='Initialize the system.')
parser.add_argument('main_command', metavar = 'MAIN_COMMAND', type = str, nargs = '*', parser.add_argument('main_command', metavar='MAIN_COMMAND', type=str, nargs='*',
help = 'The main command to run. (default: runit)') help='The main command to run. (default: runit)')
parser.add_argument('--enable-insecure-key', dest = 'enable_insecure_key', parser.add_argument('--enable-insecure-key', dest='enable_insecure_key',
action = 'store_const', const = True, default = False, action='store_const', const=True, default=False,
help = 'Install the insecure SSH key') help='Install the insecure SSH key')
parser.add_argument('--skip-startup-files', dest = 'skip_startup_files', parser.add_argument('--skip-startup-files', dest='skip_startup_files',
action = 'store_const', const = True, default = False, action='store_const', const=True, default=False,
help = 'Skip running /etc/my_init.d/* and /etc/rc.local') help='Skip running /etc/my_init.d/* and /etc/rc.local')
parser.add_argument('--skip-runit', dest = 'skip_runit', parser.add_argument('--skip-runit', dest='skip_runit',
action = 'store_const', const = True, default = False, action='store_const', const=True, default=False,
help = 'Do not run runit services') help='Do not run runit services')
parser.add_argument('--no-kill-all-on-exit', dest = 'kill_all_on_exit', parser.add_argument('--no-kill-all-on-exit', dest='kill_all_on_exit',
action = 'store_const', const = False, default = True, action='store_const', const=False, default=True,
help = 'Don\'t kill all processes on the system upon exiting') help='Don\'t kill all processes on the system upon exiting')
parser.add_argument('--quiet', dest = 'log_level', parser.add_argument('--quiet', dest='log_level',
action = 'store_const', const = LOG_LEVEL_WARN, default = LOG_LEVEL_INFO, action='store_const', const=LOG_LEVEL_WARN, default=LOG_LEVEL_INFO,
help = 'Only print warnings and errors') help='Only print warnings and errors')
args = parser.parse_args() args = parser.parse_args()
log_level = args.log_level log_level = args.log_level