Пример #1
0
class Main:
    wMain = None
    client = None
    waitClientTerminate_thread = None

    def __init__(self):
        config.init('./config.cfg')

        logfile = config.get('logfile', None)

        loglevel = config.get('loglevel', None)
        if loglevel == 'crit':
            loglevel = logging.CRITICAL
            pass
        elif loglevel == 'error':
            loglevel = logging.ERROR
            pass
        elif loglevel == 'warn':
            loglevel = logging.WARNING
            pass
        elif loglevel == 'info':
            loglevel = logging.INFO
            pass
        elif loglevel == 'debug':
            loglevel = logging.DEBUG
            pass
        else:
            loglevel = None

        logging.basicConfig(filename=logfile,
                            level=loglevel,
                            format='%(asctime)-15s %(message)s')

        logging.debug('main thread id: %s', threading.get_ident())

        self.wMain = MainWindow()
        self.wMain.onOk = self.onWndOk
        self.wMain.onCancel = self.onWndCancel
        self.wMain.start()
        pass

    def wait(self):
        pass

    #def wndLock(self):
    #    if self.wMain:
    #        self.wMain.lock()
    #    pass

    def wndUnlock(self):
        if self.wMain:
            self.wMain.unlock()
        pass

    def wndSetStatus(self, text):
        if self.wMain:
            self.wMain.setStatus(text)
        pass

    def onWndOk(self, username, passwd, printer, shares, keyauth, key=None):
        self.wMain.lock()

        clientParams = {'user': username, 'printer': printer, 'shares': shares}

        if (keyauth and not key):
            keyfilename = '%s.key' % username
            if not os.path.isfile(keyfilename):
                self.wMain.onNewpassOk = functools.partial(self.onNewpassOk,
                                                           username=username,
                                                           passwd=passwd,
                                                           printer=printer,
                                                           shares=shares)
                self.wMain.showNewpassModal()
                return
            #f = open('.pem','r')
            #s = f.read()
            #keydata = StringIO.StringIO(s)
            #key = paramiko.RSAKey.from_private_key(keydata)
            try:
                key = paramiko.RSAKey.from_private_key_file(
                    keyfilename, passwd)
            except paramiko.ssh_exception.PasswordRequiredException as e:
                logging.debug('password required for key')
                messagebox.showerror(
                    message='Требуется ввести пароль упрощенной авторизации!')
                return
            except paramiko.ssh_exception.SSHException as e:
                logging.debug('incorrect password for key')
                messagebox.showerror(
                    message='Неверный пароль упрощенной авторизации!')
                return
            except Exception:
                logging.debug('auth key readinind error')
                messagebox.showerror(message='Ошибка упрощенной авторизации!')
                return

            clientParams['authkey'] = key
        else:
            if (keyauth):
                clientParams['authkey'] = key
            clientParams['password'] = passwd

        self.wMain.showStatusModal()

        self.paramsForSave = {
            'username': username,
            'printer': printer,
            'shares': shares,
            'keyauth': keyauth
        }  #'password':passwd,

        self.client = X2goClient(**clientParams)
        self.client.onChangeStatus = self.onClientChangeStatus
        self.client.onError = self.onClientError
        self.client.onStarted = self.onClientStarted
        self.client.start()
        pass

    def onNewpassOk(self, username, printer, shares, passwd, keypasswd):
        keyfilename = '%s.key' % username
        RSAKEY_STRENGTH = 4096
        key = paramiko.RSAKey.generate(RSAKEY_STRENGTH)
        key.write_private_key_file(keyfilename, keypasswd)
        self.onWndOk(username=username,
                     passwd=passwd,
                     printer=printer,
                     shares=shares,
                     keyauth=1,
                     key=key)
        pass

    def waitClientTerminate(self):
        a = True
        while a:
            self.client.join()
            a = self.client.is_alive()
            logging.debug('client thread is_alive: %s', a)
            time.sleep(3) if a else None

        self.client = None
        self.waitClientTerminate_thread = None
        self.wndUnlock()
        pass

    def onWndCancel(self):
        if (self.client and not self.waitClientTerminate_thread):
            self.wndSetStatus('Отмена соединения...')
            self.client.stop()
            self.waitClientTerminate_thread = threading.Thread(
                target=self.waitClientTerminate)
            self.waitClientTerminate_thread.start()
        else:
            self.wMain.close()
        pass

    def onClientChangeStatus(self, text):
        self.wndSetStatus(text)
        pass

    def onClientError(self, error):
        self.wndSetStatus(error)
        self.client = None
        self.wndUnlock()
        pass

    def onClientStarted(self):
        self.wMain.close()
        self.wMain = None
        config.sets(self.paramsForSave)
        pass