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: