- """
- 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()
|