"""
|
|
Jeffery Russell
|
|
9-26-17
|
|
"""
|
|
|
|
import subprocess
|
|
import collections
|
|
|
|
from utils import module
|
|
import configuration
|
|
import mount_ssh_drive
|
|
import os
|
|
|
|
INPUT_FILE = configuration.get_config()["servers"]
|
|
FORWARD_FILE = configuration.get_config()["forwards"]
|
|
Computer = collections.namedtuple("Computer", ('host', 'menu_id'))
|
|
|
|
WELCOME_MESSAGE = "**************************************"
|
|
|
|
|
|
def main():
|
|
"""
|
|
This function inputs all the available hosts from a text file and
|
|
prompts the user to connect to them
|
|
:return:
|
|
"""
|
|
file = module.input_file(INPUT_FILE)
|
|
|
|
cmp = []
|
|
count = 1
|
|
|
|
for line in file:
|
|
cmp.append(Computer(line, count))
|
|
count += 1
|
|
|
|
menu = []
|
|
|
|
for c in cmp:
|
|
menu.append(str(c.menu_id) + ") " + c.host)
|
|
menu.append("A) Exit")
|
|
menu.append("B) Manager tools")
|
|
menu.append("C) Socks Tunnel")
|
|
menu.append("D) SSH Drive Manager")
|
|
menu.append("E) Local Port Forwarding")
|
|
|
|
module.print_menu("SSH manager V 1.0", menu)
|
|
|
|
i = input("Enter Option:")
|
|
|
|
if i == '' or i == 'A' or i == 'a':
|
|
exit_program()
|
|
elif i == 'b' or i == 'B':
|
|
sub_menu()
|
|
elif "c" == str.lower(i):
|
|
socks_ssh_tunnel()
|
|
elif "d" == str.lower(i):
|
|
mount_ssh_drive.main()
|
|
elif "e" == str.lower(i):
|
|
port_forwarding_sub_menu()
|
|
else:
|
|
for c in cmp:
|
|
if int(i) == c.menu_id:
|
|
subprocess.call(["ssh", c.host])
|
|
exit_program()
|
|
|
|
|
|
def socks_ssh_tunnel():
|
|
"""
|
|
prints user a menu to select a host to start a socks proxy with
|
|
:return: None
|
|
"""
|
|
file = module.input_file(INPUT_FILE)
|
|
cmp = []
|
|
count = 1
|
|
for line in file:
|
|
cmp.append(Computer(line, count))
|
|
count += 1
|
|
|
|
menu = []
|
|
for c in cmp:
|
|
menu.append(str(c.menu_id) + ") " + c.host)
|
|
|
|
menu.append("A) Exit")
|
|
menu.append("B) Main")
|
|
module.print_menu("Socks Tunnel", menu)
|
|
|
|
|
|
i = input("Enter option:")
|
|
if i == '' or 'a' == str.lower(i):
|
|
exit_program()
|
|
elif 'b' == str.lower(i):
|
|
main()
|
|
else:
|
|
for c in cmp:
|
|
if int(i) == c.menu_id:
|
|
print_red("Starting socks proxy on " + c.host + ":8123")
|
|
subprocess.call(["ssh", "-D", "8123", "-C", "-q", "-N", c.host])
|
|
exit_program()
|
|
|
|
|
|
def print_sub_menu():
|
|
"""
|
|
prints out a sub help menu for other options
|
|
:return: None
|
|
"""
|
|
module.print_menu("Options", ["1) Add Host",
|
|
"2) Copy SSH key to server",
|
|
"3) Remove host name",
|
|
"4) Return to ssh manager",
|
|
"5) Manage Configuration and Bash",
|
|
"6) Exit"])
|
|
|
|
|
|
def print_red(prt): return "\033[91m {}\033[00m" .format(prt)
|
|
|
|
|
|
def sub_menu():
|
|
"""
|
|
calls printSubMenu and then gets input from user to
|
|
make appropriate function calls
|
|
:return: None
|
|
"""
|
|
print_sub_menu()
|
|
i = input("Enter selection:")
|
|
|
|
if i != '' and int(i) in {1, 2, 3, 4, 5, 6}:
|
|
options = {1: add_host,
|
|
2: copy_ssh_key,
|
|
3: remove_host,
|
|
4: main,
|
|
5: configuration.main,
|
|
6: exit_program
|
|
}
|
|
options[int(i)]()
|
|
else:
|
|
print("Invalid selection!")
|
|
|
|
sub_menu()
|
|
|
|
|
|
def exit_program():
|
|
"""
|
|
Exits the program and clears the screen
|
|
:return: None
|
|
"""
|
|
subprocess.call(["clear"])
|
|
exit()
|
|
|
|
|
|
def add_host():
|
|
"""
|
|
appends an inputted host name to servers.txt
|
|
:return: None
|
|
"""
|
|
host = input("Enter 'user@host' or -1 to exit:")
|
|
if host != '-1':
|
|
module.append_file(INPUT_FILE, host)
|
|
|
|
|
|
def copy_ssh_key():
|
|
"""
|
|
calls systems ssh-copy-id with host name
|
|
:return: None
|
|
"""
|
|
file = module.input_file(INPUT_FILE)
|
|
cmp = []
|
|
count = 1
|
|
for line in file:
|
|
cmp.append(Computer(line, count))
|
|
count += 1
|
|
|
|
menu = []
|
|
for c in cmp:
|
|
menu.append(str(c.menu_id) + ") " + c.host)
|
|
menu.append("A) Exit")
|
|
module.print_menu("Copy SSH Key", menu)
|
|
|
|
host_id = input("Enter number of host to copy ssh key to:")
|
|
if not (host_id == '-1' or host_id.lower() == 'a'):
|
|
for c in cmp:
|
|
if c.menu_id == int(host_id):
|
|
subprocess.call(["ssh-copy-id", c.host])
|
|
|
|
|
|
def remove_host():
|
|
"""
|
|
Removes a host name from servers.txt
|
|
:return: None
|
|
"""
|
|
file = module.input_file(INPUT_FILE)
|
|
cmp = []
|
|
count = 1
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
for line in file:
|
|
cmp.append(Computer(line, count))
|
|
count += 1
|
|
for c in cmp:
|
|
space = " " * (len(WELCOME_MESSAGE) - 3 -
|
|
len(str(c.menu_id) + ") " + c.host))
|
|
print(print_red("*") + str(c.menu_id) + ") " +
|
|
c.host + space + print_red("*"))
|
|
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
|
|
host = input("Enter number of host -1 to exit:")
|
|
if host != '-1':
|
|
for c in cmp:
|
|
if c.menu_id == int(host):
|
|
module.remove_line_from_file(INPUT_FILE, c.host)
|
|
|
|
def add_forward_config():
|
|
"""
|
|
appends new local forward configurations to forwards.txt
|
|
:return: None
|
|
"""
|
|
forwardingConfig = input("Enter forwarding config to add or -1 to exit:")
|
|
if forwardingConfig != '-1':
|
|
module.append_file(FORWARD_FILE, forwardingConfig)
|
|
|
|
|
|
def del_forward_config():
|
|
"""
|
|
removes a local forward configurations from forwards.txt
|
|
:return: None
|
|
"""
|
|
# check if file is empty before trying to open to read file
|
|
if (os.stat(FORWARD_FILE).st_size == 0):
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
print("No forward configurations are available for removal.")
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
|
|
else:
|
|
f = open(FORWARD_FILE, "r")
|
|
i = 1
|
|
savedConfigs = []
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
print("Current saved local port forwarding configurations:")
|
|
for line in f:
|
|
print(print_red("*") + "%s) %s" % (i, line) + print_red("*"))
|
|
savedConfigs.append(line.strip())
|
|
i += 1
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
selection = input("Select a configuration to delete: ")
|
|
module.remove_line_from_file(FORWARD_FILE, savedConfigs[int(selection)-1])
|
|
|
|
def select_forward_config():
|
|
"""
|
|
Select a local forwarding configuration from forwards.txt
|
|
to execute using SSH
|
|
:return: None
|
|
"""
|
|
# check if file is empty before trying to open to read file
|
|
if (os.stat(FORWARD_FILE).st_size == 0):
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
print("No forward configurations are available to run.")
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
|
|
else:
|
|
f = open(FORWARD_FILE, "r")
|
|
i = 1
|
|
savedConfigs = []
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
print("Current saved local port forwarding configurations:")
|
|
for line in f:
|
|
print(print_red("*") + "%s) %s" % (i, line) + print_red("*"))
|
|
savedConfigs.append(line.strip())
|
|
i += 1
|
|
print(print_red("*" * len(WELCOME_MESSAGE)))
|
|
selection = input("Select a configuration to execute: ")
|
|
|
|
#Split the selected entry based on a space so we can feed each
|
|
#element into the subprocess call
|
|
forwardConfig = savedConfigs[int(selection)-1].split(" ")
|
|
subprocess.call(["ssh", "-tt", "-L", forwardConfig[0], forwardConfig[1]])
|
|
exit_program()
|
|
|
|
def print_forwarding_sub_menu():
|
|
"""
|
|
prints out a sub help menu for other forwarding options
|
|
:return: None
|
|
"""
|
|
module.print_menu("Options", ["1) Add local forward configuration",
|
|
"2) Remove local forward configuration",
|
|
"3) Select local forward configuration",
|
|
"4) Exit"])
|
|
|
|
def port_forwarding_sub_menu():
|
|
"""
|
|
|
|
print out a sub menu related to port forwarding
|
|
options
|
|
:return: None
|
|
"""
|
|
print_forwarding_sub_menu()
|
|
|
|
i = input("Enter selection:")
|
|
if i != "" and (int(i) in {1, 2, 3, 4}):
|
|
options = {1: add_forward_config,
|
|
2: del_forward_config,
|
|
3: select_forward_config,
|
|
4: exit_program
|
|
}
|
|
options[int(i)]()
|
|
else:
|
|
print("Invalid selection!")
|
|
|
|
port_forwarding_sub_menu()
|
|
|
|
|
|
"""
|
|
Makes sure that other programs don't execute the main
|
|
"""
|
|
if __name__ == '__main__':
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
exit_program()
|