#!/usr/bin/python3 """Implementation of CloudSync launcher and management script""" import os import signal import sys import time import logging from subprocess import Popen from cloudsync.utils.globals import EXEC_MODE_UPGRADE, EXEC_MODE_UPDATE, EXEC_MODE_NORMAL, EXEC_MODE logging.basicConfig(format='%(message)s', level=logging.INFO) logger = logging.getLogger(__name__) DELAY = 0.5 SENTINEL_FILE = "/tmp/cloudsync_restart_sentinel" SENTINEL_CHECK_INTERVAL = 5 USAGE_FORMAT = "Usage: ./cs.py [debug|info|warning|error] [upgrade|update|]" arguments = sys.argv logging_level = logging.INFO def get_pid(): proc_list = list(os.popen("ps ax | grep cloud_sync.py | grep -v grep")) if len(proc_list) > 0: pid = proc_list[0].split()[0] return pid else: return None def start(): cs_proc = get_pid() if cs_proc: logger.info("CloudSync app already running") else: logger.info("Starting CloudSync app with logging level %s in %s mode", logging_level, EXEC_MODE) time.sleep(DELAY) Popen(['python3', 'cloud_sync.py', str(logging_level),EXEC_MODE]) def stop(): cs_proc_pid = get_pid() if cs_proc_pid: logger.info("Stopping CloudSync app...") time.sleep(DELAY) os.kill(int(cs_proc_pid), signal.SIGTERM) else: logger.info("CloudSync app is not running.") def monitor(): """Monitor sentinel file and restart CloudSync when detected.""" logger.info("Monitoring sentinel file: %s (interval %ds)", SENTINEL_FILE, SENTINEL_CHECK_INTERVAL) start() while True: if os.path.isfile(SENTINEL_FILE): logger.info("Sentinel file detected — restarting CloudSync") try: os.remove(SENTINEL_FILE) except OSError: pass stop() time.sleep(1) start() time.sleep(SENTINEL_CHECK_INTERVAL) if len(arguments) <= 1: logger.error(USAGE_FORMAT) sys.exit(101) if len(arguments) >= 4: argument=arguments[3] if argument in ( EXEC_MODE_UPGRADE, EXEC_MODE_UPDATE, EXEC_MODE_NORMAL ): EXEC_MODE=argument else: logger.error("incorrect %s argument", argument) logger.error(USAGE_FORMAT) sys.exit(104) if len(arguments) >= 3: argument=arguments[2] if argument == "debug": logging_level = logging.DEBUG elif argument == "info": logging_level = logging.INFO elif argument == "warning": logging_level = logging.WARNING elif argument== "error": logging_level = logging.ERROR else: logger.error("incorrect %s argument", argument) logger.error(USAGE_FORMAT) sys.exit(103) if len(arguments) >= 2: argument=arguments[1] if argument == "start": start() elif argument == "stop": stop() elif argument == "restart": logger.info("Restarting CloudSync app...") time.sleep(DELAY) stop() start() elif argument == "status": cs_proc = get_pid() if cs_proc: logger.info("CloudSync app IS running") else: logger.info("CloudSync app IS NOT running") elif argument == "monitor": monitor() else: logger.error("incorrect %s argument", argument) logger.error(USAGE_FORMAT) sys.exit(102)