You've already forked iplist-generator
Initial Project Import
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.pyc
|
||||||
|
.venv
|
||||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"python.formatting.provider": "black"
|
||||||
|
}
|
||||||
16
Dockerfile
Normal file
16
Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
FROM python:3-slim AS build
|
||||||
|
|
||||||
|
COPY src/ /app
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN python3 -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
|
||||||
|
VOLUME /app/data
|
||||||
|
|
||||||
|
ENV NOIP_HOST="127.0.0.1"
|
||||||
|
ENV NOIP_USERNAME=""
|
||||||
|
ENV NOIP_PASSWORD=""
|
||||||
|
|
||||||
|
CMD ["python3", "app.py"]
|
||||||
66
src/app.py
Normal file
66
src/app.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import paramiko
|
||||||
|
import click
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def return_ip_and_prefix(lines :str, scheme :str ="ipv6" ) -> str:
|
||||||
|
""" Lookup and return IP Address and a suffix.
|
||||||
|
Supports both IPv6 and IPv4
|
||||||
|
|
||||||
|
Args:
|
||||||
|
lines (str): The lines of text to check. e.g. output from Paramiko
|
||||||
|
scheme (str, optional): The IP scheme (IPv4 or IPv6). Defaults to "ipv6".
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: An IP with prefix/CIDR
|
||||||
|
"""
|
||||||
|
if scheme == "ipv6":
|
||||||
|
m = re.search(r"inet6 ([\d\w:/]+).+prefixlen (56|64)$", lines)
|
||||||
|
ip_split = ":".join(m.group(1).split(":", 4)[:4])
|
||||||
|
return ip_split + "::1/" + m.group(2)
|
||||||
|
elif scheme == "ipv4":
|
||||||
|
m = re.search(r"inet ([\d./]+)", lines)
|
||||||
|
return m.group(1) + "/32"
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
@click.option("--host", required=True, help="The hostname/ip to connect to.")
|
||||||
|
@click.option("--port", default=22, help="The SSH port to connect on.")
|
||||||
|
@click.option("--username", required=True, help="The username you wish to use.")
|
||||||
|
@click.option("--password", required=True, help="The Password/Secret for this user.")
|
||||||
|
def main(host: str, port: int, username: str, password: str) -> None:
|
||||||
|
""" This application will connect to an OpnSense firewall. The aim is to retrieve
|
||||||
|
the IPv6 Segment and Prefix along with the IPv4 address for the WAN.
|
||||||
|
"""
|
||||||
|
click.echo("Checking for IPv6 Prefix")
|
||||||
|
|
||||||
|
command = "8;ifconfig vtnet1 | grep -E 'prefixlen [0-9]{2}$'"
|
||||||
|
ipv4_command = "ifconfig vtnet0 | grep -E 'inet.+ netmask'"
|
||||||
|
logout_command = "exit; 0\n"
|
||||||
|
|
||||||
|
ssh = paramiko.SSHClient()
|
||||||
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||||
|
ssh.connect(host, port, username, password)
|
||||||
|
|
||||||
|
_, stdout, _ = ssh.exec_command(command)
|
||||||
|
output = stdout.read().decode()
|
||||||
|
|
||||||
|
f = open("data/gallow.txt", "w")
|
||||||
|
f.write(return_ip_and_prefix(output, "ipv6") + "\n")
|
||||||
|
|
||||||
|
click.echo("Fetched IPv6 Prefix")
|
||||||
|
|
||||||
|
click.echo("Checking for IPv4 Address on WAN")
|
||||||
|
_, stdout, _ = ssh.exec_command(ipv4_command)
|
||||||
|
output = stdout.read().decode()
|
||||||
|
f.write(return_ip_and_prefix(output, "ipv4") + "\n")
|
||||||
|
click.echo("Retrieved IPv4 Address from WAN")
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
ssh.exec_command(logout_command)
|
||||||
|
ssh.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(auto_envvar_prefix="NOIP")
|
||||||
2
src/requirements.txt
Normal file
2
src/requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
paramiko==3.0.0
|
||||||
|
click==8.1.3
|
||||||
Reference in New Issue
Block a user