From 06c39f73fe9ae818875c290184dd1d3aa29559f2 Mon Sep 17 00:00:00 2001 From: iu Date: Fri, 10 May 2024 13:04:34 +0000 Subject: [PATCH] Initial --- README.md | 1 + src/setcamtime.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100755 src/setcamtime.py diff --git a/README.md b/README.md index c4dc3c1..3f40509 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # camera-set-time +Сервис синхронизации времени вэб камеры Tenda CP-7 \ No newline at end of file diff --git a/src/setcamtime.py b/src/setcamtime.py new file mode 100755 index 0000000..06e3c73 --- /dev/null +++ b/src/setcamtime.py @@ -0,0 +1,79 @@ +#!/bin/python3 +from telnetlib import Telnet +from datetime import datetime, timedelta +import logging +import argparse +import time + +log = logging.getLogger(__name__) +# logging.basicConfig(filename='app.log', level=logging.INFO) +logging.basicConfig( + level=logging.DEBUG, + handlers=[ + # logging.FileHandler('app.log'), + logging.StreamHandler() + ], +) + + +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.read_until(b"Password:") + 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('Ошибка аутентификации') + return + 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) + diff = abs(now - d).total_seconds() + # log.debug(ds) + log.info(f"Время камеры\t {d}") + log.info(f"Локальное время\t {now}") + log.info(f"Дельта, {diff}с.") + if diff > hysteresis: + now = now + timedelta(hours=5) + cmd = f"date -s {now:%Y%m%d%H%M.%S}\n" + tn.write(cmd.encode("ascii")) + result = tn.read_until(b"[/app]#").decode("ascii").split("\n")[1].strip() + cmd = cmd.replace("\n", "") + log.debug(f'Результат выполнения комманды "{cmd}": "{result}"') + log.info("Время установлено") + + +parser = argparse.ArgumentParser(description="CP7 time setter service") +parser.add_argument("-v", "--version", action="version", version="%(prog)s 1.0") +parser.add_argument( + "-s", "--hysteresis", type=int, help="hysteresis, in seconds", default=30 +) +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( + "-i", + "--interval", + type=int, + help="interval in seconds to work in daemon mode", + default=60 * 60, +) +args = parser.parse_args() + +if not args.daemon: + setCamTime(args.address, args.port, args.hysteresis, args.login, args.password) +else: + log.info("Старт сервиса") + while True: + log.info(f"Старт синхронизации времени") + try: + setCamTime(args.address, args.port, args.hysteresis, args.login, args.password) + except Exception as e: + log.error(f"Ошибка синхронизации времени {e}") + log.info(f"Ожидание {args.interval}сек.") + time.sleep(args.interval)