From 929a1ec8ead76fd361270d9fd992c392c26ed695 Mon Sep 17 00:00:00 2001 From: iu Date: Fri, 10 May 2024 18:53:36 +0000 Subject: [PATCH] + install as service --- src/setcamtime.py | 76 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/src/setcamtime.py b/src/setcamtime.py index 06e3c73..958ee8f 100755 --- a/src/setcamtime.py +++ b/src/setcamtime.py @@ -4,6 +4,48 @@ from datetime import datetime, timedelta import logging import argparse import time +import sys +import shutil +import os + +DST_FILE_NAME = "/usr/setcamtime" +SERVICE_FILENAME = "/etc/systemd/system/setcamtime.service" +SERVICE_TEMPLATE = """ +[Unit] +Description=Webcam time sync service +After=network.target + +[Service] +Type=simple +Restart=always +ExecStart=%CMDLINE% +[Install] +WantedBy=multi-user.target +""" + + +def install_service(): + uninstall_service() + # if not os.path.isfile(DST_FILE_NAME): + os.system("systemctl stop setcamtime") + os.system("systemctl disable setcamtime") + shutil.copy(sys.argv[0], DST_FILE_NAME) + service = SERVICE_TEMPLATE.replace( + "%CMDLINE%", + f"{DST_FILE_NAME} -d -a {args.address} -p {args.port} -s {args.hysteresis} -l {args.login} -w {args.password} -i {args.interval}", + ) + with open(SERVICE_FILENAME, "w", encoding="UTF-8") as f: + f.write(service) + os.system("systemctl enable setcamtime") + os.system("systemctl start setcamtime") + + +def uninstall_service(): + os.system("systemctl stop setcamtime") + os.system("systemctl disable setcamtime") + if os.path.exists(SERVICE_FILENAME): + os.remove(SERVICE_FILENAME) + log = logging.getLogger(__name__) # logging.basicConfig(filename='app.log', level=logging.INFO) @@ -16,18 +58,18 @@ logging.basicConfig( ) -def setCamTime(cam_addr: str, port: int, hysteresis: int, login:str, password:str): +def setCamTime(cam_addr: str, port: int, hysteresis: int, login: str, password: str): with Telnet(cam_addr, port) as tn: tn.read_until(b"login: ") - tn.write((login+"\n").encode("ascii")) + tn.write((login + "\n").encode("ascii")) tn.read_until(b"Password:") - tn.write((password+"\n").encode("ascii")) + tn.write((password + "\n").encode("ascii")) # tn.read_until(b"[/app]#") r = tn.expect([b"\[/app\]\#", b"Login incorrect"]) if r[0] != 0: - log.error('Ошибка аутентификации') + log.error("Ошибка аутентификации") return - now = datetime.now() + timedelta(hours=3) + now = datetime.now()# + timedelta(hours=3) tn.write("date +%Y%m%d%H%M%S\n".encode("ascii")) ds = tn.read_until(b"[/app]#").decode("ascii").split("\n")[1].strip() d = datetime.strptime(ds, "%Y%m%d%H%M%S") - timedelta(hours=5) @@ -54,8 +96,15 @@ parser.add_argument( parser.add_argument("-a", "--address", type=str, help="Camera address", required=True) parser.add_argument("-p", "--port", type=int, help="Camera port", default=23) parser.add_argument("-d", "--daemon", action="store_true", help="daemon mode") -parser.add_argument("-l", "--login", type=str, help="login", default='root') -parser.add_argument("-w", "--password", type=str, help="password") +parser.add_argument("-l", "--login", type=str, help="login", default="root") +parser.add_argument("-w", "--password", type=str, help="password", required=True) +parser.add_argument( + "--install", action="store_true", help="Инсталлировать сервис (systemd)" +) +parser.add_argument( + "--uninstall", action="store_true", help="Деинсталлировать сервис (systemd)" +) + parser.add_argument( "-i", "--interval", @@ -65,6 +114,15 @@ parser.add_argument( ) args = parser.parse_args() +if args.uninstall: + uninstall_service() + exit(0) + + +if args.install: + install_service() + exit(0) + if not args.daemon: setCamTime(args.address, args.port, args.hysteresis, args.login, args.password) else: @@ -72,7 +130,9 @@ else: while True: log.info(f"Старт синхронизации времени") try: - setCamTime(args.address, args.port, args.hysteresis, args.login, args.password) + setCamTime( + args.address, args.port, args.hysteresis, args.login, args.password + ) except Exception as e: log.error(f"Ошибка синхронизации времени {e}") log.info(f"Ожидание {args.interval}сек.")