コード例 #1
0
class MainWindow(QWidget):
       
    def __init__(self,parent = None):
        super(MainWindow,self).__init__(parent)      
        
        self.TYPE_VM = "offline"
        #链接状态
        self.currentLinkState = False
        self.vmListLength = 99
        self.buttonState = True
        self.startLessonFlag = False
        
        self.alllessonstart = False
        
        self.initSubWidget()
        
        #绑定相应的信号和槽函数
        self.bandSignalSlot()

        #self.localMac = globalfunc.get_mac_address()

        #self.waitingTimer = QTimer()
        #self.waitingTimer.start(5000)
        #self.connect(self.waitingTimer, SIGNAL("timeout()"), self.auto_spice)
        #self.flag = True


    def initSubWidget(self):
        # 右上角关闭等最小化按钮
        self.menuBar = MenuBar(self)
        #self.menuBar.hide()
        self.menuBar.show()

        #开启监听,接受云主机发送的信息
        
        #USB
        

        #监视是否有关闭的window进程

        #重启网络信息提示窗口
        self.waitingDlg = InfoHintDialog(None)

        #重启网络线程
        #虚拟机打开可控线程
        

        # 加载窗口

        
        #广播监听
        self.broadcast = WaitingBroadCast()
        
    
    def auto_spice(self):
        serverIp = "192.168.0.29"
        #serverIp = "192.168.1.32"
        argcList = ["smep://%s/?port=%s" % (serverIp, "5901")] 
        if self.flag:
            print "argcList:%s"  % argcList
            self.flag = False
            os.system("killall window")
            QProcess.startDetached("/opt/ccr-student/window/window", argcList)

    def tryRebindPort(self):
        self.broadcast.bindUdpPort()
        #self.tcpServer.bindTcpPort()

    def bandSignalSlot(self):
        
        #点击设置,工具或关于按钮时发送的信号
        self.connect(self.menuBar, SIGNAL("showToolDialog"),self.slotShowToolDialog)
        
        #接收到广播发送的消息,执行相应的操作
        self.connect(self.broadcast, SIGNAL("operaterCmd"),self.slotOperateBroadcastCMD)
        
        
    def slotDownloadError(self,vmname):
        
        self.initLocalVm()
    
    def initLocalVm(self):
        self.TYPE_VM = StoreInfoParser.instance().getVmType()
        if self.TYPE_VM == "offline":# or self.TYPE_VM == None or self.TYPE_VM == "" or self.TYPE_VM == False:
            lessonlist = StoreInfoParser.instance().getLessonList()
            offlessonlist = StoreInfoParser.instance().getOffLessonList()
            if lessonlist == None or offlessonlist == None:
                LogRecord.instance().logger.info(u"local list is none")
                return
            localofflist = []
            locallessonlist = json.loads(lessonlist)
            offlocallessonlist = json.loads(offlessonlist)
            localImgList = LocalImgManager.instance().getCompleteList()
            for item in offlocallessonlist:
                if item["name"] in localImgList:
                    localofflist.append(item)
                    
            StoreInfoParser.instance().setLessonList(json.dumps(localofflist))
            StoreInfoParser.instance().setLessonList(json.dumps(localofflist))
            
            if len(localofflist) == 0:
                LogRecord.instance().logger.info(u"local list is none")
                self.vmWidget.setVMInfoList(localofflist,localofflist)
                self.vmWidget.hide()
                self.loadingWiget.show()
                #self.slotChangeLinkThreadStatus("disconnect")
                self.setPosition()
                self.loadingWiget.setHintInfo("failed", 0)
                if not self.linkThread.isStartLink and self.buttonState:
                    self.loadingWiget.restartLink()
                return
            else:
                
                LogRecord.instance().logger.info(u"local list is not none")
                self.loadingWiget.hide()
                self.vmWidget.setVMInfoList(localofflist,localofflist)
                self.vmWidget.showVmList()
                self.vmWidget.show()
                self.setPosition()
                self.menuBar.show()
                self.menuBar.raise_()
        
    def postVmStateInfo(self, postInfo):
        self.updateThread.setVmInfoState(postInfo)
        
    def hideMenuBar(self):
        self.menuBar.hide()
    
    def updateWindow(self,language):
        
        self.menuBar.updateWindow()
        self.loadingWiget.updateWindow()
        
        
    def slotShowRestartNetworkInfo(self, status):
        """显示重启网络的状态信息"""
        
        language = StoreInfoParser.instance().getLanguage()
        m_pTranslator = QTranslator()
        exePath = "./"
        if language == "chinese":
            QmName = "zh_CN.qm"
        else:
            QmName = "en_US.qm"
        if(m_pTranslator.load(QmName, exePath)):
            QCoreApplication.instance().installTranslator(m_pTranslator)
        
        if status == "Start":
            #InfoHintDialog(self.tr("restarting network, please wait ...")).exec_()
            self.waitingDlg.setHintInfo(self.tr("restarting network, please wait ..."))
        elif status == "Success":
            #InfoHintDialog(self.tr("network setting success")).exec_()
            self.waitingDlg.setHintInfo(self.tr("network setting success"))
        elif status == "Failed":
            #InfoHintDialog(self.tr("network restart failed")).exec_()
            self.waitingDlg.setHintInfo(self.tr("network restart failed"))
        else:
            return
        
        if self.waitingDlg.isHidden():
            desktop = QApplication.desktop()
            self.waitingDlg.move((desktop.width() - self.waitingDlg.width())/2, (desktop.height() - self.waitingDlg.height())/2)
            self.waitingDlg.exec_()
        
    def slotOperateTcpServerCMD(self, command, value):
        
        if command == "TERMINAL_NAME":
                #修改计算机名称到系统配置文件
                StoreInfoParser.instance().setTerminalName(value)
                globalvariable.TERMINAL_NAME = value
                
                self.emit(SIGNAL("terminalchange"))
                
        elif command == "TERMINAL_NETWORK_CONFIG":
                self.operateBroadcastConfigNetwork(value)
                
        if self.TYPE_VM == "online":
            if command == "TICHU":
                #踢出当前的学生机
                globalvariable.TICHU_STATUS = True
                vmLessonInfo = VMInfoManager.instance().getLessonListInfo()
                self.vmWidget.setVMInfoList(vmLessonInfo,[])
                self.vmWidget.updateVMList()
                WindowMonitor.instance().start(2000)
            else:
                LogRecord.instance().logger.info("receive a command which is not understand")
        elif self.TYPE_VM == "offline":
            if command == "shutdown":
                self.vmWidget.domainManager.shutdownDomain()
            elif command == "poweroff":
                self.vmWidget.domainManager.poweroffDomain()
            elif command == "reset":
                self.vmWidget.domainManager.restartDomain()
            elif command == "TICHU":
                self.vmWidget.domainManager.poweroffDomain()
            else:
                LogRecord.instance().logger.info(self.tr("receive a command which is not understand"))

    def operateBroadcastConfigNetwork(self, value):
        LogRecord.instance().logger.info(self.tr("receive a command changing network"))
        self.emit(SIGNAL("update"))
        self.waitingDlg = InfoHintDialog(None)
        if not globalvariable.CLASS_STATUS:
            networkType = value[0]
            if networkType == "static":
                if len(value) >= 5:
                    IPADDR = value[1].strip()
                    NETMASK = value[2].strip()

                    if len(IPADDR) == 0 or len(NETMASK) == 0:
                        InfoHintDialog(self.tr("command is wrong")).exec_()
                        return

                    netconf = globalfunc.setJyStaticNetwork(value)
                    if netconf != "False":
                        #重新启动网络
                        self.restartNetworkTD.setNetConf(netconf)
                        self.restartNetworkTD.start()
                    else:
                        LogRecord.instance().logger.info(u"修改网络配置文件为静态网络失败")
                else:
                    LogRecord.instance().logger.info(u"云主机发送过来的静态网络数据格式有误")
            elif networkType == "dhcp":
                netconf = globalfunc.setJyDynamicNetwork()
                #重新启动网络
                if netconf:
                    self.restartNetworkTD.setNetConf(netconf)
                    self.restartNetworkTD.start()
                else:
                    InfoHintDialog(self.tr('设置自动获取IP失败')).exec_()

    def operateBroadcastStartLesson(self, command):
        """执行上课指令"""
        LogRecord.instance().logger.info(u"接收上课指令")
        globalvariable.CLASS_STATUS = True
        value = globalfunc.getVMCloudsNameFromBroadInfo(command)
        if value:
            globalvariable.CLASS_STATUS_VM_NAME = value
            #关闭所有的window
            if not self.vmWidget.isHidden():
                VMOperation.instance().autoCloseVMLesson()
                WindowMonitor.instance().clearProcessMap()
                WindowMonitor.instance().stop()
                self.startLessonFlag = True
                vmInfo = self.updateThread.getVmInfo()
                vmName = globalvariable.CLASS_STATUS_VM_NAME                         
                vmLessonInfo = VMInfoManager.instance().getLessonListInfo()
                coursename = self.updateThread.getCourseName()
                currentvm = None
                if (not vmInfo) or (not coursename):
                    return
                for item in vmLessonInfo:
                    if item["name"] == coursename:
                        currentvm = item
                        break
                if currentvm !=None:
                    tmp = vmInfo[0]["name"]
                    vmInfo[0]["name"] = coursename
                    vmInfo[0]["vmname"] = vmName
                    vmInfo[0]["os_distro"] = currentvm["os_distro"] 
                    self.vmWidget.setVMInfoList(vmInfo,[])
                else:
                    self.vmWidget.setVMInfoList(vmLessonInfo,[])
                
                self.vmWidget.updateVMList()
                self.vmWidget.show()
                self.setPosition()
                self.menuBar.show()
                self.menuBar.raise_()
                self.ownSleep(1000)
                
                self.openvmThread = threading.Thread(target=self.vmWidget.autoOpenVMLesson,args=(value,))
                self.openvmThread.start()

            elif self.vmWidget.isHidden() and not self.linkThread.isStartLink:
                self.alllessonstart = True
                self.loadingWiget.restartLink()
        else:
            self.vmWidget.hide()
            self.loadingWiget.show()
            self.setPosition()
            LogRecord.instance().logger.info(u"未查询到分配给当前学生机的虚拟机名称")
            self.loadingWiget.setHintInfo("terminalVMIsNone", None)
            time.sleep(5)

    def operateBroadcastStopLesson(self):
        """执行下课指令"""
        LogRecord.instance().logger.info(u"执行下课指令")

        globalvariable.TICHU_STATUS = False
        globalvariable.CLASS_STATUS = False
        globalvariable.CLASS_STATUS_VM_NAME = None
        self.startLessonFlag = False
        WindowMonitor.instance().start(2000)
        
        #关闭所有的window程序
        windowList = WindowMonitor.instance().getCurrentProcessId()
        for ID in windowList:
            os.system("kill -9 %s" % ID)
            
        if self.vmWidget.isHidden() and not self.linkThread.isStartLink:
            self.loadingWiget.restartLink()
        else:
            vmLessonInfo = VMInfoManager.instance().getLessonListInfo()
            self.vmWidget.setVMInfoList(vmLessonInfo,[])
            self.vmWidget.updateVMList()
        
            
    def operateBroadcastRecordUSBStatus(self, command):
        """记录USB的使用状态"""
        if len(command.split(":")) > 1:
            stateValue = command.split(":")[1]
            StoreInfoParser.instance().setUsbState(stateValue)
        else:
            LogRecord.instance().logger.info(u"云主机发送的更改USB数据有误")
            
    def operateBroadcastRecordNetStatus(self, command):
        """Net状态"""
        if len(command.split(":")) > 1:
            stateValue = command.split(":")[1]
            StoreInfoParser.instance().setNetState(stateValue)
            self.vmWidget.domainManager.defineNetFilter(stateValue)
        else:
            LogRecord.instance().logger.info(u"云主机发送的更改Net数据有误")

    def operateBroadcastShutdownByIP(self, command):
        """根据IP执行关机指令"""
        LogRecord.instance().logger.info("operateBroadcastShutdownByIP in")
        if len(command.split(":")) > 1:
            receiveIp = command.split(":")[1]
            serverIp = StoreInfoParser.instance().getCloudsServerIP()
            if receiveIp == serverIp:
                LogRecord.instance().logger.info(u"执行关机指令")
                globalfunc.shutdownTerminal()
            else:
                LogRecord.instance().logger.info(u"接受的云主机地址与当前的不一致")

    def operateBroadcastShutdownByMac(self, command):
        """根据MAC执行关机指令"""
        LogRecord.instance().logger.info(u"执行关机指令")
        LogRecord.instance().logger.info(self.localMac)
        if len(command.split("|")) > 1:
            MAC = command.split("|")[1]
            if MAC == self.localMac:
                globalfunc.shutdownTerminal()
        else:
            LogRecord.instance().logger.info(u"云主机发送的关机命令数据有误")

    def operateBroadcastResolutionModify(self, command):
        """修改学生端的分辨率"""
        if globalvariable.CLASS_STATUS:
            return
        if len(command.split(":")) >= 2:
            new_value = command.split(":")[1]
            globalfunc.setScreenResolution(new_value)
        else:
            LogRecord.instance().logger.info(u"分辨率值格式有误")

    def operateBroadcastRecordCloudServerIP(self, command):
        """记录云主机的IP值"""
        if len(command.split(" ")) >= 5:
            try:
                startIp = command.split(" ")[1].split(":")[1]
                endIp = command.split(" ")[2].split(":")[1]
                mainServerIP = command.split(" ")[3].split(":")[1]
                backupServerIP = command.split(" ")[4].split(":")[1]

                startIndex = int(startIp.split(".")[-1])
                endIndex = int(endIp.split(".")[-1])
                currentIndex = int(globalfunc.get_ip_address().split(".")[-1])

                if currentIndex >= startIndex and currentIndex <= endIndex:
                    LogRecord.instance().logger.info(u"记录云主机的IP地址:%s" % mainServerIP)
                    StoreInfoParser.instance().setServerAddress(mainServerIP)
                    StoreInfoParser.instance().setBackUpServerAddress(backupServerIP)
                    
            except Exception, e:
                LogRecord.instance().logger.info(u"解析接收的云主机IP数据格式有误:%s" % e.message)
        else: