From 5a16d7e9bffe816c3e339e9e3e20de7c5db134e4 Mon Sep 17 00:00:00 2001 From: Mira Kristipati Date: Fri, 2 Aug 2024 14:26:21 -0400 Subject: [PATCH] Initial commit --- .gitignore | 2 + README.md | 3 ++ reset-ise-passwd/default.nix | 13 +++++++ reset-ise-passwd/main.py | 74 ++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 reset-ise-passwd/default.nix create mode 100755 reset-ise-passwd/main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9773ff1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv +.ruff_cache diff --git a/README.md b/README.md new file mode 100644 index 0000000..047f37d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Calliope + +A monorepo for QoL stuff for adaptation diff --git a/reset-ise-passwd/default.nix b/reset-ise-passwd/default.nix new file mode 100644 index 0000000..ca9ee87 --- /dev/null +++ b/reset-ise-passwd/default.nix @@ -0,0 +1,13 @@ +{ pkgs ? import { } }: + +pkgs.mkShell { + packages = [ + (pkgs.python3.withPackages (python-pkgs: [ + python-pkgs.pexpect + python-pkgs.icecream + python-pkgs.mypy + python-pkgs.ruff + ])) + pkgs.openssh + ]; +} diff --git a/reset-ise-passwd/main.py b/reset-ise-passwd/main.py new file mode 100755 index 0000000..cc20b67 --- /dev/null +++ b/reset-ise-passwd/main.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import argparse +import logging +import re +import sys +from logging import getLogger +from typing import List + +import pexpect + + +def login(username: str, password: str) -> pexpect.spawn: + child = pexpect.spawn( + f"ssh -i /dev/null {username}@{addr}", + encoding="utf-8", + logfile=sys.stdout, + ) + child.expect("password:") + child.sendline(password) + return child + + +def change_password(child: pexpect.spawn, old_password: str, new_password: str) -> None: + child.expect("password:") + child.sendline(old_password) + child.expect("[Nn]ew password:") + child.sendline(new_password) + child.expect("[Nn]ew password:") + child.sendline(new_password) + child.expect_list([re.compile("success"), re.compile(f"{username}#")]) + logger.info("Changing password to %s", new_password) + + +def set_new_password_and_verify( + child: pexpect.spawn, + password: str, + new_password: str, +) -> pexpect.spawn: + change_password(child, password, new_password) + + child = login(username, new_password) + child.expect(f"{username}#") + return child + + +if __name__ == "__main__": + logger = getLogger(__name__) + logger.level = logging.DEBUG + + parser = argparse.ArgumentParser() + parser.add_argument("addr", help="IP address of the device") + parser.add_argument("username", help="Username of the device", default="admin") + parser.add_argument("password", help="Password of the device") + args = parser.parse_args() + username = args.username + password = args.password + addr = args.addr + try: + passwords: List[str] = [password] + [ + "".join([f"{i}{j}" for i in password]) for j in range(4) + ] + + child = login(username, password) + new_password = passwords.pop() + child = set_new_password_and_verify(child, password, new_password) + + while len(passwords): + password = new_password + child.sendline("password") + new_password = passwords.pop() + child = set_new_password_and_verify(child, password, new_password) + + except Exception: + logger.exception("man idek anymore, file a bug")