This commit is contained in:
iu 2024-05-10 13:04:34 +00:00
parent 5a83965acd
commit 06c39f73fe
2 changed files with 80 additions and 0 deletions

View File

@ -1,2 +1,3 @@
# camera-set-time
Сервис синхронизации времени вэб камеры Tenda CP-7

79
src/setcamtime.py Executable file
View File

@ -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)