Files
playground/install_backup_service.py
T
2026-07-24 15:58:31 +02:00

79 lines
2.2 KiB
Python

#!/usr/bin/env -S uv run --script
# /// script
# dependencies = []
# ///
import argparse
import logging
import subprocess
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Install cron job")
parser.add_argument("--name", required=True, help="Name for the cron job")
parser.add_argument("command", nargs=argparse.REMAINDER, help="Command to run")
return parser.parse_args()
def get_current_crontab() -> str:
try:
result = subprocess.run(["crontab", "-l"], capture_output=True, text=True, check=True)
return result.stdout
except subprocess.CalledProcessError:
return ""
def create_cron_entry(name: str, command: list) -> str:
command_str = " ".join(command)
return f"0 0 * * * {command_str}"
def job_exists(name: str, current_crontab: str) -> bool:
comment = f"# {name}"
return comment in current_crontab
def install_cron_job(name: str, command: list) -> None:
current_crontab = get_current_crontab()
if job_exists(name, current_crontab):
logger.info(f"Cron job '{name}' already exists")
return
cron_entry = create_cron_entry(name, command)
job_comment = f"# {name}"
new_crontab = current_crontab.rstrip()
if new_crontab and not new_crontab.endswith("\n"):
new_crontab += "\n"
new_crontab += f"{job_comment}\n{cron_entry}\n"
process = subprocess.Popen(["crontab", "-"], stdin=subprocess.PIPE, text=True)
process.communicate(input=new_crontab)
if process.returncode != 0:
raise RuntimeError("Failed to install cron job")
logger.info(f"Cron job '{name}' installed successfully")
def main():
args = parse_args()
if not args.command:
raise ValueError("Command is required")
logger.info(f"Installing cron job '{args.name}' with command: {' '.join(args.command)}")
install_cron_job(args.name, args.command)
logger.info("Installation completed successfully")
logger.info("Check cron jobs with: crontab -l")
if __name__ == "__main__":
exit(main())