#!/usr/bin/python # -*- coding: utf-8 -*- ## # A cloudban létrehozott virtuális gépekhez történő kapcsolódást segítő program ## from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import platform, argparse, sys, time ## # Paraméterek átadására használt struktúra # state A virtuális gép állapota, azt figyeljük, hogy fut-e # protocol SSH, NX és RDP lehetséges # host A virtuális gép címe # port Ezen a porton csatlakozunk a virtuális géphez # user Csatlakozáshoz használt név # password Csatlakozáshoz használt jelszó class Struct: pass ## # Argument parser, argparse modulon alapszik # @return args # def pars_arguments(): parser = argparse.ArgumentParser(); parser.add_argument("uri", type=str, help="Specific schema handler", nargs='?', default=None) parser.add_argument("-u", "--username", type=str) parser.add_argument("-p", "--password", type=str) parser.add_argument("-d", "--driver", help="Select webdriver. Aside from Firefox, you have to install first the proper driver.", \ type=str, choices=['firefox', 'chrome', 'ie', 'opera', 'safari'], default="firefox") parser.add_argument("-o", "--old", help="Use old interface", action="store_true") args = parser.parse_args(); return args class Browser: ## # Browser inicializálás # @param args Az args.driver paraméterrel meghatározhatjuk, melyik böngészőt akarjuk használni. # def __init__(self, args): self.args = args if args.driver == "firefox": self.driver = webdriver.Firefox() elif args.driver == "chrome": self.driver = webdriver.Chrome() elif args.driver == "ie": self.driver = webdriver.Ie() elif args.driver == "opera": self.driver = webdriver.Opera() elif args.driver == "safari": self.driver = webdriver.Safari() self.driver.implicitly_wait(10) ## # Címtáras beléptetés a parancssorban megadott paraméterek alapján # def login(self): driver = self.driver args = self.args if args.username is not None: driver.find_element_by_name("j_username").clear() driver.find_element_by_name("j_username").send_keys(args.username) if args.password is not None: driver.find_element_by_name("j_password").clear() driver.find_element_by_name("j_password").send_keys(args.password) if args.username is not None and args.password is not None: driver.find_element_by_css_selector("input[type='submit']").click() ## # A régi webes felület használata # @return vm Virtuális gép csatlakozásához szükséges paraméterek # def old_main(self): vm = Struct() driver = self.driver driver.maximize_window() driver.get("https://cloud.ik.bme.hu/info/") driver.find_element_by_css_selector("a[href*='/login/']").click() self.login() vm.state, vm.protocol = "", "NONE" try: while vm.state.upper()[:3] not in ("FUT", "RUN"): element = WebDriverWait(driver, 7200).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input.hidden-password.shown[type='text']"))) vm.password = element.get_attribute("value") vm.state = driver.find_element_by_css_selector("#state > div > p").text vm.protocol = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(1) > td").text vm.host,vm.port = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(2) > td").text.split(':') vm.user = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(4) > td").text driver.find_element_by_css_selector("a[href*='/logout/']").click() except: print "Browser session timed out!" return vm ## # Az új webes felület használata # @return vm Virtuális gép csatlakozásához szükséges paraméterek # def main(self): vm = Struct() driver = self.driver driver.maximize_window() driver.get("https://pc3.szgt.uni-miskolc.hu/") #driver.find_element_by_css_selector("a[href*='/login/']").click() #self.login() vm.state, vm.protocol = "", "NONE" try: while vm.state.upper()[:3] not in ("FUT", "RUN"): element = WebDriverWait(driver,7200).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#vm-details-pw-eye.icon-eye-close"))) vm.state = driver.find_element_by_css_selector("#vm-details-state > span").text #cl: connection string converted to list cl = driver.find_element_by_css_selector("#vm-details-connection-string").get_attribute("value").split() if cl[0] == "sshpass": vm.protocol = "SSH" vm.user, vm.host = cl[6].split("@") vm.password, vm.port = cl[2], cl[8] elif cl[0] == "rdesktop": vm.protocol = "RDP" vm.host, vm.port = cl[1].split(":") vm.user, vm.password = cl[3], cl[5] driver.find_element_by_css_selector("a[href*='/logout/']").click() except: print "Browser session timed out!" return vm ## # Főprogram # beolvassuk a paramétereket # megnyitjuk a kiválasztott böngészőben a weboldalt # bejelentkezünk a címtárba # kiválasztjuk a futtatni kívánt klienst # kapcsolódunk a klienshez def main(): args = pars_arguments() if args.uri is not None: vm = Struct() vm.protocol, vm.user, vm.password, vm.host, vm.port = args.uri.split(':',4) vm.protocol = vm.protocol.upper() vm.state = "RUN" else: browser = Browser(args) if args.old: vm = browser.old_main() else: vm = browser.main() browser.driver.quit() if platform.system() == "Linux": from cloud_connect_from_linux import connect elif platform.system() == "Windows": from cloud_connect_from_windows import connect if vm.state.upper()[:3] in ("FUT", "RUN"): connect(vm) if __name__ == "__main__": main()