79 lines
2.2 KiB
Python
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())
|