示例#1
0
文件: thread.py 项目: hpcit/RCM
 def run(self):
     try:
         self.session_widget.display_sessions = self.session_widget.remote_connection_manager.list(
         )
     except Exception as e:
         logger.error("Failed to reload the display sessions")
         logger.error(e)
示例#2
0
    def on_save(self):
        if not parser.has_section('Settings'):
            parser.add_section('Settings')

        # update settings values
        self.update_and_apply_settings()

        parser.set('Settings', 'debug_log_level',
                   json.dumps(self.settings['debug_log_level']))
        parser.set('Settings', 'ssh_client',
                   json.dumps(self.settings['ssh_client']))
        parser.set('Settings', 'preload_command',
                   json.dumps(self.settings['preload_command']))

        try:
            config_file_dir = os.path.dirname(config_file_name)
            if not os.path.exists(config_file_dir):
                os.makedirs(config_file_dir)

            with open(config_file_name, 'w') as config_file:
                parser.write(config_file)
        except Exception:
            logger.error(
                "failed to dump the settings in the configuration file")

        self.close()
示例#3
0
    def kill_display(self):
        """
        Kill the display running on the server
        :return:
        """
        current_status = self.status

        if self.status is Status.FINISHED:
            self.terminate.emit(self.display_id)
            return

        try:
            logger.debug("Killing remote display " + str(self.display_name))
            self.status = Status.KILLING
            self.update_gui()

            self.kill_thread = KillThread(self.parent, self.session, self,
                                          current_status)
            self.kill_thread.finished.connect(self.on_killed)
            self.kill_thread.start()
        except:
            logger.error("Failed to start kill remote display thread " +
                         str(self.display_name))
            self.status = current_status
            self.update_gui()
示例#4
0
    def __init__(self, display_names, platform_config):
        QDialog.__init__(self)

        self.display_name = ""
        self.display_names = display_names
        self.display_size_list = collections.deque(maxlen=5)

        # current selections
        self.session_queue = None
        self.session_vnc = None
        self.display_size = None

        # combo
        self.session_queue_combo = None
        self.session_vnc_combo = None
        self.display_combo = None

        try:
            self.session_queues = platform_config.config['queues'].keys()
            self.session_vncs = platform_config.config['vnc_commands'].keys()
        except:
            self.session_queues = []
            self.session_vncs = []
            logger.error("Failed to parse the server platform config")

        self.setWindowTitle("New display")
        self.init_ui()
示例#5
0
文件: thread.py 项目: hpcit/RCM
 def run(self):
     try:
         self.session_widget.remote_connection_manager.kill(self.session)
         self.display_widget.status = Status.FINISHED
     except Exception as e:
         self.display_widget.status = self.current_status
         logger.error("Failed to kill the display session")
         logger.error(e)
示例#6
0
    def open_vnc_session(self):

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "Open...",
            "",
            "VNC Files (*.vnc);;All Files (*)",
            options=options)

        current_session_widget = self.main_widget.tabs.currentWidget()

        if filename:
            # check if session needs tunneling
            file = open(filename, 'r')
            if 'rcm_tunnel' in file.read():
                file.seek(0)
                lines = file.readlines()
                for line in lines:
                    if 'rcm_tunnel' in line:
                        node = line.split('=')[1].rstrip()
                        if not current_session_widget.is_logged:
                            logger.error(
                                "You are not logged in the current session. Please log in."
                            )
                            return
                        if node == current_session_widget.host:
                            user = current_session_widget.user
                        else:
                            logger.error(
                                "The host of the current session (" +
                                current_session_widget.host +
                                ") is different from the host of the vnc file ("
                                + node + ")")
                            return
                    if 'host' in line:
                        hostname = line.split('=')[1].rstrip()
                    if 'port' in line:
                        port = line.split('=')[1].rstrip()
                        display = int(port) - 5900
                    if 'password' in line:
                        password = line.split('=')[1].rstrip()

                session = rcm.rcm_session(node=hostname,
                                          tunnel='y',
                                          display=display,
                                          nodelogin=node,
                                          username=user,
                                          vncpassword=password)
                current_session_widget.remote_connection_manager.vncsession(
                    session=session)
                logger.info("Connected to remote display " + str(display) +
                            " on " + node + " as " + str(user) +
                            " with tunnel")
            else:
                current_session_widget.remote_connection_manager.vncsession(
                    configFile=filename)
示例#7
0
 def connect_display(self):
     try:
         logger.info("Connecting to remote display " +
                     str(self.display_name))
         self.parent.remote_connection_manager.submit(
             self.session, gui_cmd=self.enable_connect_button)
     except:
         logger.error("Failed to connect to remote display " +
                      str(self.display_name))
示例#8
0
文件: thread.py 项目: hpcit/RCM
 def run(self):
     try:
         self.session_widget.remote_connection_manager.login_setup(
             host=self.host, remoteuser=self.user, password=self.password)
         self.session_widget.platform_config = self.session_widget.remote_connection_manager.get_config(
         )
         self.session_widget.is_logged = True
     except Exception as e:
         self.session_widget.is_logged = False
         logger.error("Failed to login")
         logger.error(e)
示例#9
0
    def kill_all_threads(self):
        try:
            self.kill_login_thread()
            self.kill_reload_thread()

            for display_session_id in self.displays.keys():
                self.displays[display_session_id].kill_all_threads()

            if self.remote_connection_manager:
                self.remote_connection_manager.vncsession_kill()
        except Exception as e:
            logger.error('Failed to kill running threads')
            logger.error(e)
    def on_save(self):
        if not parser.has_section('Settings'):
            parser.add_section('Settings')

        # update settings values
        self.update_and_apply_settings()
        for k in defaults:
            parser.set('Settings', k, json.dumps(self.settings[k], indent=4))

        try:
            config_file_dir = os.path.dirname(config_file_name)
            if not os.path.exists(config_file_dir):
                os.makedirs(config_file_dir)

            with open(config_file_name, 'w') as config_file:
                parser.write(config_file)
        except Exception:
            logger.error(
                "failed to dump the settings in the configuration file")

        self.close()
示例#11
0
    def share_display(self):
        try:
            logger.info("Sharing display " + str(self.display_name))

            filename_suggested = self.session.hash['session name'].replace(
                ' ', '_') + '.vnc'
            options = QFileDialog.Options()
            options |= QFileDialog.DontUseNativeDialog
            filename, _ = QFileDialog.getSaveFileName(
                self,
                "Share display " + str(self.display_name),
                filename_suggested,
                " Vnc Files (*.vnc);;All Files (*)",
                options=options)

            if filename:
                with open(filename, 'w') as out_file:
                    out_file.write("[Connection]\n")
                    if self.session.hash['tunnel'] == 'y':
                        # rcm_tunnel is a key word to know that I need to tunnel across that node
                        out_file.write("rcm_tunnel={0}\n".format(
                            self.session.hash['nodelogin']))
                        out_file.write("host={0}\n".format(
                            self.session.hash['node']))
                    else:
                        out_file.write("host={0}\n".format(
                            self.session.hash['nodelogin']))
                    try:
                        port = int(self.session.hash['port'])
                    except Exception as e:
                        logger.debug(
                            str(e) + " - " + str(traceback.format_exc()))
                        port = 5900 + int(self.session.hash['display'])
                    out_file.write("port={0}\n".format(port))
                    out_file.write("password={0}\n".format(
                        self.session.hash['vncpassword']))
        except Exception as e:
            logger.debug(str(e) + " - " + str(traceback.format_exc()))
            logger.debug(str(self.session.hash))
            logger.error("Failed to share display " + str(self.display_name))
示例#12
0
    def update_config_file(self, session_name):
        """
        Update the config file with the new session name
        :param session_name: name of the last session inserted by the user
        :return:
        """
        if not parser.has_section('LoginFields'):
            parser.add_section('LoginFields')

        parser.set('LoginFields', 'hostList',
                   json.dumps(list(self.sessions_list)))

        try:
            config_file_dir = os.path.dirname(config_file_name)
            if not os.path.exists(config_file_dir):
                os.makedirs(config_file_dir)

            with open(config_file_name, 'w') as config_file:
                parser.write(config_file)
        except:
            logger.error(
                "failed to dump the session list in the configuration file")
示例#13
0
    def update_config_file(self):
        """
        Update the config file with the display size list
        :return:
        """
        if not parser.has_section('DisplaySizeField'):
            parser.add_section('DisplaySizeField')

        parser.set('DisplaySizeField', 'displaysizelist',
                   json.dumps(list(self.display_size_list)))

        try:
            config_file_dir = os.path.dirname(config_file_name)
            if not os.path.exists(config_file_dir):
                os.makedirs(config_file_dir)

            with open(config_file_name, 'w') as config_file:
                parser.write(config_file)
        except:
            logger.error(
                "failed to dump the display size list in the configuration file"
            )
示例#14
0
文件: worker.py 项目: hpcit/RCM
    def run(self):
        try:
            logger.debug("Worker for display " + str(self.display_id) +
                         " started")
            self.signals.status.emit(Status.PENDING)

            display_session = self.remote_connection_manager.newconn(
                queue=self.session_queue,
                geometry=self.display_size,
                sessionname=self.display_id,
                vnc_id=self.session_vnc)

            self.signals.status.emit(Status.RUNNING)

            self.display_widget.session = display_session
            self.remote_connection_manager.vncsession(
                display_session,
                gui_cmd=self.display_widget.enable_connect_button)

            logger.debug("Worker for display " + str(self.display_id) +
                         " finished")
        except Exception as e:
            logger.error(e)
示例#15
0
 def run(self):
     try:
         self.session_widget.display_sessions = self.session_widget.remote_connection_manager.list(
         )
     except Exception as e:
         logger.error("Failed to reload the display sessions")
         logger.error(e)
         exc_info = (type(e), e, e.__traceback__)
         logger.error('Exception occurred', exc_info=exc_info)
示例#16
0
    def run(self):
        try:
            logger.debug("Worker for display " + str(self.display_id) +
                         " started")
            self.signals.status.emit(Status.PENDING)

            api_version = self.remote_connection_manager.api_version()

            if api_version >= "1.0.0":
                display_session = self.remote_connection_manager.new(
                    queue="dummy_queue",
                    geometry="dummy_display_size",
                    sessionname=self.display_id,
                    vnc_id="dummy_vnc",
                    choices=self.display_dlg.choices)
            else:
                display_session = self.remote_connection_manager.new(
                    queue=self.display_dlg.session_queue,
                    geometry=self.display_dlg.display_size,
                    sessionname=self.display_id,
                    vnc_id=self.display_dlg.session_vnc,
                    choices=None)

            self.signals.status.emit(Status.RUNNING)

            self.display_widget.session = display_session
            self.remote_connection_manager.submit(
                display_session,
                gui_cmd=self.display_widget.enable_connect_button)

            logger.debug("Worker for display " + str(self.display_id) +
                         " finished")
        except Exception as e:
            self.signals.status.emit(Status.FINISHED)
            logger.error("Exception: " + str(e) + " - " +
                         str(traceback.format_exc()))
示例#17
0
    def on_ok(self):
        """
        :return: Return accept signal if the display name is unique
        """

        session_line = self.findChild(QLineEdit, 'session_line')
        display_name = str(session_line.text())

        # if the display_name is empty, it is set to test
        # if it is not empty we validate it using a regex
        if not re.match(r'^[\w\_\s]{0,16}$', display_name):
            logger.error("Invalid display name: only alphanumeric "
                         "plus underscore plus space characters "
                         "are allowed for a maximum of 16 characters")
            return
        if display_name == "":
            self.display_name = "test"
        else:
            self.display_name = display_name

        # if the display name already exists, it returns
        if self.display_name in self.display_names:
            logger.error("session " + str(self.display_name) +
                         " already exists")
            return

        self.session_queue = str(self.session_queue_combo.currentText())
        self.session_vnc = str(self.session_vnc_combo.currentText())
        self.display_size = str(self.display_combo.currentText())

        # add a new display size if it's fine for us in the combobox for the next time
        if self.display_size not in list(self.display_size_list):
            if re.match(r'^\d{1,5}x\d{1,5}$', self.display_size):
                self.display_size_list.appendleft(self.display_size)
            else:
                logger.error("Invalid display size")
                return

        # convert full screen in the format width x height
        if self.display_size == "full_screen":
            screen_width = QDesktopWidget().width()
            screen_height = QDesktopWidget().height()
            self.display_size = str(screen_width) + "x" + str(screen_height)

        logger.info("session queue: " + self.session_queue + "; " +
                    "session vnc: " + self.session_vnc + "; " +
                    "display size: " + self.display_size + ";")

        self.update_config_file()
        self.accept()