Пример #1
0
def main():
    set_routes = set()
    add_routes = set()
    setup_logging('routes.log')
    config = get_config('router')
    router_key = config['ROUTER_CONFIG']
    router_api = RouterOsApiPool(**router_key).get_api()
    route = router_api.get_resource('/ip/route')
    load_existing_routes(route, set_routes)
    connections = router_api.get_resource('/ip/firewall/connection')
    while True:
        heartbeat()
        add_routes.clear()
        add_fast_routes(add_routes, connections)
        new_routes, remove_routes = load_address_list(router_api, set_routes,
                                                      add_routes)
        if new_routes:
            add_new_routes(route, new_routes, remove_routes)
            set_routes -= remove_routes
            set_routes = set_routes.union(new_routes)
        sleep(30)
Пример #2
0
def main_loop(session_key, session):
    res = session.get('http://192.168.100.1/reseau-pa3-frequencecable.html')
    res.raise_for_status()

    if 'document.write(AccessMemberLimit);' in res.text:
        logging.warning(
            "Permission denied, another user is already logged; sleeping 20 seconds"
        )
        sleep(20)
        return session_key

    if '>location.href="/login.html"<' in res.text:
        logging.info("logging in to session")
        # login
        res = session.get('http://192.168.100.1/login.html')
        res.raise_for_status()
        session_key = session_key_matcher.match(res.text).group(1)
        logging.info("session key is {}".format(session_key))
        res = session.post(
            f'http://192.168.100.1/postlogin.cgi?sessionKey={session_key}',
            data={
                'sessionKey': session_key,
                'loginUsername': MODEM_USER,
                'loginPassword': MODEM_PASSWORD,
            })
        if 'var RefreshPage = ' not in res.text:
            logging.warning("failed to login")
            return session_key
        logging.info(f"cookie is {session.cookies}")
        return session_key

    if not session.cookies:
        logging.warning(
            f"need to force logout and log back in for reboot to work")
        session.get('http://192.168.100.1/logout.html').raise_for_status()
        return ''

    new_session_key = session_key_matcher.match(res.text).group(1)
    if new_session_key and new_session_key != session_key:
        session_key = new_session_key

    m = error_counters_matcher.match(res.text)
    correctable = int(m.group(1))
    uncorrectable = int(m.group(2))

    if uncorrectable > 1:
        logging.warning(
            "found {} correctable and {} uncorrectable errors".format(
                correctable, uncorrectable))
        logging.warning("disabling cable modem route")
        router_api = RouterOsApiPool(**ROUTER_KEY).get_api()
        route = router_api.get_resource('/ip/route')
        route_id = route.get(distance='15')[0]['id']
        route.set(id=route_id, disabled='no')

        logging.warning(
            "restarting cable modem; session key is {}, cookies {}".format(
                session_key, session.cookies))

        res = session.post(
            f'http://192.168.100.1/reseau-pa3-frequencecable.cgi?sessionKey={session_key}',
            data={
                'sessionKey': session_key,
                'CmStartupDsFreq': '999999',
                'action': '1',
            })
        res.raise_for_status()
        if 'Invalid Session Key' in res.text:
            logging.warning(
                'Invalid Session Key error, logging out and retrying')
            session.get('http://192.168.100.1/logout.html').raise_for_status()
            return ''

        logging.warning("disabling eth interface on router")
        eth = router_api.get_resource('/interface')
        eth_id = eth.get(name='wan-hot')[0]['id']
        eth.set(id=eth_id, disabled='yes')

        logging.warning("waiting 125 seconds")
        sleep(120)

        eth.set(id=eth_id, disabled='no')
        logging.warning("reenabling cable modem interface")
        sleep(5)

        logging.warning("reenabling cable modem route")
        route.set(id=route_id, disabled='yes')

    return session_key