From 0713cabc6b3dd77182829bb49aee56d1b3bffa2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=BCleki=20F=C3=A1bi=C3=A1n?= Date: Fri, 8 May 2020 22:21:15 +0200 Subject: [PATCH] Implemented ip change checking --- app.py | 9 +++++++++ ip_watchdog.py | 24 ++++++++++++++++++++++++ redis_super_storage.py | 31 ++++++++++++++----------------- 3 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 ip_watchdog.py diff --git a/app.py b/app.py index 7747a52..c9d5ff7 100644 --- a/app.py +++ b/app.py @@ -6,6 +6,7 @@ import logging from redis_super_storage import RedisSuperStorage from communicators import ConsumerCommunicator, ProducerCommunicator +from ip_watchdog import IPWatchdog """ Scheduler @@ -32,13 +33,21 @@ def main(): redis_storage = RedisSuperStorage(os.environ.get('REDIS_URL', "redis://localhost:6379/0"), 5) consumer_communicator = ConsumerCommunicator(redis_storage) producer_communicator = ProducerCommunicator(redis_storage) + ip_watchdog = IPWatchdog(redis_storage) + logging.info("Syncing to initial consumer list") for ip in get_initial_ip_list(): + logging.debug(f"Syncing to {ip}") consumer_communicator.targeted_snyc(ip) while True: logging.debug("Doing a sync") consumer_communicator.sync_all() + + ip_changed, ipaddr = ip_watchdog.ip_changed() + if ip_changed: + producer_communicator.push_ip_update(ipaddr) + time.sleep(os.environ.get("RUN_INTERVAL", 30)) diff --git a/ip_watchdog.py b/ip_watchdog.py new file mode 100644 index 0000000..9962f70 --- /dev/null +++ b/ip_watchdog.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +from typing import Tuple +import logging +import socket + +from redis_super_storage import RedisSuperStorage + + +class IPWatchdog: + + def __init__(self, redis_store: RedisSuperStorage): + self._redis_store = redis_store + self._host_name = socket.gethostname() + + def ip_changed(self) -> Tuple[bool, str]: + old_ip = self._redis_store.current_ip + current_ip = socket.gethostbyname(self._host_name) + + if current_ip != old_ip: + logging.info(f'IP changed: {old_ip} -> {current_ip}') + self._redis_store.current_ip = current_ip + return True, current_ip + + return False, old_ip diff --git a/redis_super_storage.py b/redis_super_storage.py index 4f31a8f..78a3f43 100644 --- a/redis_super_storage.py +++ b/redis_super_storage.py @@ -2,12 +2,11 @@ import redis import os import json -import socket import time -import logging class RedisSuperStorage: + def __init__(self, redis_url: str, timeout: int): self.r = redis.from_url(redis_url) self._timeout = timeout @@ -38,21 +37,6 @@ class RedisSuperStorage: return list_of_producer_ip - def is_ip_changed(self) -> bool: - old_ip = self.r.get('current_ip') - - if old_ip: - old_ip = old_ip.decode('utf-8') - - host_name = socket.gethostname() - current_ip = socket.gethostbyname(host_name) - - if current_ip != old_ip: - logging.info(f'IP changed: {old_ip} -> {current_ip}') - self.r.set('current_ip', current_ip.encode('utf-8')) - - return current_ip != old_ip - def update_consumer(self, uuid: str, ip: str): cust_key = f"consumer_{uuid}" @@ -65,3 +49,16 @@ class RedisSuperStorage: self.r.set(cust_key, json.dumps(info).encode('utf-8')) self.r.expire(cust_key, os.environ["CUSTOMER_TIMEOUT"]) + + def get_current_ip(self) -> str: + ip = self.r.get('current_ip') + + if ip: + ip = ip.decode('utf-8') + + return ip + + def set_current_ip(self, ip: str): + self.r.set('current_ip', ip.encode('utf-8')) + + current_ip = property(get_current_ip, set_current_ip)