add ensure-port-fwd.py

Signed-off-by: Martin Matous <m@matous.dev>
This commit is contained in:
Martin Matous 2023-09-24 02:54:57 +02:00
parent 70b69e1f8c
commit 584f0f913e
Signed by: mmatous
GPG key ID: 8BED4CD352953224
2 changed files with 73 additions and 0 deletions

View file

@ -27,6 +27,20 @@ alias -s dnf '/usr/local/bin/dnf-search-installed.py'
Usage: `dnf search <package>` Usage: `dnf search <package>`
## ensure-port-fwd.py
Ensure given ports are present in TC7200 port forwarding table.
For all those who get shitty routers shoved down their throats
by their greedy and incompetent ISPs who like to randomly
reset their settings for fun and profit using a backdoor.
Status: active use (🖕 UPC/Vodafone)
Dependencies: selenium, geckodriver, e-waste
Usage: Run as a systemd service
## gasquery.py ## gasquery.py
Query Alchemy API for current ETH L1 basefee. Query Alchemy API for current ETH L1 basefee.
Intended for consumption by i3status-rs' custom block. Intended for consumption by i3status-rs' custom block.

59
ensure-port-fwd.py Executable file
View file

@ -0,0 +1,59 @@
#!/usr/bin/env python3
# 3rd-party dependencies: selenium
import os
import sys
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
username = os.environ['ROUTER_USERNAME']
password = os.environ['ROUTER_PASSWORD']
target_ip = sys.argv[1]
PORTS = {22, 25, 80, 443, 465, 993}
options = webdriver.FirefoxOptions()
options.add_argument('-headless')
browser = webdriver.Firefox(options)
browser.implicitly_wait(1)
browser.get('http://192.168.0.1/')
username_text_box = browser.find_element(By.ID, 'loginUsername')
username_text_box.send_keys(username)
password_text_box = browser.find_element(By.ID, 'loginPassword')
password_text_box.send_keys(password)
submit_button = browser.find_element(By.XPATH, '/html/body/div[1]/div[4]/div[1]/form/button')
submit_button.click()
browser.get('http://192.168.0.1/advanced/forwarding.asp')
form_fields = '/html/body/div/div[4]/div[1]/form/input'
forwarded_ports = browser.find_elements(By.XPATH, form_fields)
forwarded: set[int] = set()
forwarded = { int(port.get_attribute('value').split('-')[0]) for port in forwarded_ports[1::4] }
missing = PORTS - forwarded
n_missing = len(missing)
add_row = browser.find_element(By.XPATH, '/html/body/div/div[4]/div[1]/form/button[1]')
for i in range(n_missing):
add_row.click()
n_fwd = len(forwarded)
for i, port in enumerate(missing):
browser.find_element(By.NAME, f'ForwardingPortRange{i + n_fwd}').clear()
browser.find_element(By.NAME, f'ForwardingPortRange{i + n_fwd}').send_keys(port)
browser.find_element(By.NAME, f'ForwardingTargetIp{i + n_fwd}').clear()
browser.find_element(By.NAME, f'ForwardingTargetIp{i + n_fwd}').send_keys(target_ip)
browser.find_element(By.NAME, f'ForwardingTargetPort{i + n_fwd}').clear()
browser.find_element(By.NAME, f'ForwardingTargetPort{i + n_fwd}').send_keys(port)
submit = browser.find_element(By.XPATH, '/html/body/div/div[4]/div[1]/form/button[2]')
submit.click()
logout = browser.find_element(By.CLASS_NAME, 'logout')
logout.click()
browser.quit()