コード例 #1
0
 def checkPasswd(self, passwd,crypasswd):
     if passwd == "rootroot":
         return True
     else:
         return False
     
     temp = crypasswd.split("$");
     count = len(temp)
     if 4 != count:
         LogRecord.instance().logger.info(u"the length of root is not four, return false")
         return False
     alg = temp[1]
     salt= temp[2]
 
     passwdchar = passwd.toLatin1().data()
     strs = passwdchar,"++++++++++++++"
     LogRecord.instance().logger.info(strs)
     randomchar = "$"+alg+"$"+salt+"$"
     LogRecord.instance().logger.info(randomchar)
     usercry = crypt.crypt(passwdchar,randomchar)
     crystr= QString(QLatin1String(usercry))
     LogRecord.instance().logger.info(usercry)
     LogRecord.instance().logger.info(crystr)
     #加密后的密文与系统存储的root密码密文想比较
     if crypasswd == crystr:
         return True
     
     return False
コード例 #2
0
    def setCTerminal(self):
        cmdlist = "cat /boot/grub/grub.conf"
         
        statusOutput = commands.getstatusoutput(cmdlist)
        if statusOutput[0] == 0:
            content = statusOutput[1]
        
            if not QString(content).contains("MCOS cTerminal Client Start"):
                insertContent = "title MCOS cTerminal Client Start\\n\\t" + \
                        "root (hd0,0)\\n\\t" + \
                        "kernel /boot/boot.krn\\n\\t" + \
                        "boot\\n"
                        
#                 insertContent = "sdfwef"
                addCmd = "sed -i '$a %s' /boot/grub/grub.conf" % insertContent
                if os.system(addCmd) != 0:
                    LogRecord.instance().logger(u"执行命令‘sed -i '%sa %s' /boot/grub/grub.conf失败")
                    return False
                
            
            if not self.setMenuDefaultValue(1):
                return False
        
            if not self.setMenuTimeoutValue(5):
                return False
            
            return True
    
        else:
            return False
コード例 #3
0
def getCurrentScreenResolution():
    currentSolution = "10"
    reSolution = "auto"
    solutionMap = {"0":"800x600","1":"1024x768","2":"1280x720","3":"1440x900","4":"1600x1020","5":"1920x1080","6":"1280x1024","7":"1366x768","8":"1600x900","10":"auto"}
    cmd = "../lib/ccr_jytcapi current_display"
    errorFlg = True 
    while errorFlg:
        try: 
            value =  getCmdExecValueT(cmd)
            errorFlg = False
        except: 
            errorFlg = True 
        
    for i in range(len(value)):
        LogRecord.instance().logger.info("#".join(value))
        if len(value[i].split(":"))==2 and value[i].split(":")[0]=="res" and value[i].split(":")[1] !="auto":
            currentSolution = value[i].split(":")[1]
            break   
    if solutionMap.has_key(currentSolution):
        reSolution = solutionMap[currentSolution]
    if reSolution == "auto":
        LogRecord.instance().logger.info("resolution is auto")
        reSolution = getGdkResolution()

    return reSolution
コード例 #4
0
 def dataReceived(self):
     try:
         dataValue = self.getDataContent()
         if dataValue:
             LogRecord.instance().logger.info(u'接收到广播信息:%s' % dataValue)
             self.emit(SIGNAL("operaterCmd"), dataValue)
     except:
         LogRecord.instance().logger.info(u'广播信息有误:%s' % dataValue)
コード例 #5
0
    def __init__(self,parent=None):  
        super(WaitingBroadCast,self).__init__(parent)  

        self.port = 5555 
        self.udpSocket = QUdpSocket(self)  
        self.connect(self.udpSocket,SIGNAL("readyRead()"),self.dataReceived)  
          
        result = self.udpSocket.bind(self.port)  
        if not result:  
            LogRecord.instance().logger.info(u'udpserver create error!')
            return  
コード例 #6
0
 def run(self):
     LogRecord.instance().logger.info(u"开始启动网络")
     self.emit(SIGNAL("restartNetwork"), "Start")
     ok = -1
     ok = self.jytcapi.jysetwiredconf(str(self.netconf))
     if ok != 0:
         self.emit(SIGNAL("restartNetwork"), "Failed")
     else:
         self.emit(SIGNAL("restartNetwork"), "Success")
         self.networkInfoFlg = True 
         self.setNetFlag(True) 
コード例 #7
0
 def autoOpenOffVMLesson(self):
     LogRecord.instance().logger.info(u'自动打开相应的虚拟机')
     
     if len(self.vmInfoList) == 1:
         if self.vmInfoList[0]["name"] in self.downloadingList:
             return
         else:
             self.startVmInfo = self.vmInfoList[0]
             self.domainManager.setDomainInfo(self.startVmInfo)
             self.domainManager.startDomainByName()
     
     else:
         return
コード例 #8
0
 def getCurrentScreenResolution(self, screenName):
     currentSolution = "10"
     reSolution = "auto"
     solutionMap = {"0":"800x600","1":"1024x768","2":"1280x720","3":"1440x900","4":"1600x1020","5":"1920x1080","6":"1280x1024","7":"1366x768","8":"1600x900","10":"auto"}
     cmd = "../lib/ccr_jytcapi current_display"
     value =  self.getCmdExecValueT(cmd)
     for i in range(len(value)):
         LogRecord.instance().logger.info("#".join(value))
         if len(value[i].split(":"))==2 and value[i].split(":")[0]=="res" and value[i].split(":")[1] !="auto":
             currentSolution = value[i].split(":")[1]
             break
     if solutionMap.has_key(currentSolution):
         reSolution = solutionMap[currentSolution]
     return reSolution
コード例 #9
0
ファイル: udev.py プロジェクト: siwenhu/test_client_broadcast
 def monitor_async(self, subsystems, device_type, callbak):
     context = Context()
     monitor = Monitor.from_netlink(context)
     monitor.filter_by(subsystems)
     def device_event(device):
         self.emit(SIGNAL("signal_udev"), device)
         if callbak != None:
             callbak(device)
     try:
         self.observer = MonitorObserver(monitor, callback=device_event, name='udev-monitor-observer')
         self.observer.daemon
         self.observer.start()
         #observer.stop()
     except Exception as e:
         LogRecord.instance().logger.info(u'USB监听启动异常(%s)'%(str(e)))
コード例 #10
0
 def parseLocalData(self):
     framedatas = self.dataframelist
     for key in framedatas.keys():
         if len(framedatas[key]) == self.datagramcount:
             self.localframenum+=1
             dataframe = framedatas[key]
             imgdata = ""
             for i in range(0,self.datagramcount):
                 keys = "%02d"%i
                 imgdata = imgdata + dataframe[keys]
                 #imgdata = dataframe["00"] + dataframe["01"] + dataframe["02"] + dataframe["03"]
             self.framelist[key] = imgdata
             self.framedata.pop(key)
             return
         
     LogRecord.instance().logger.info(self.joinGroup)
コード例 #11
0
 def setMenuDefaultValue(self, value):
     cmdlist = "cat /boot/grub/grub.conf | awk '{ if($0 ~ \"default=\") {print NR}}'"
      
     statusOutput = commands.getstatusoutput(cmdlist)
     if statusOutput[0] == 0:
         rowNum = statusOutput[1]
         defaultValueCmd = QString("sed -i '%1s/.*/default=%2/g' /boot/grub/grub.conf").arg(rowNum).arg(value)
         ok = os.system(str(defaultValueCmd))
         if ok != 0:
             LogRecord.instance().logger(u"执行命令‘sed -i '%1s/.*/default=%s/g' /boot/grub/grub.conf’失败" % str(value))
             return False
     else:
         LogRecord.instance().logger(u"执行命令‘cat /boot/grub/grub.conf | awk '{ if($0 ~ \"default=\") {print NR}}’失败")
         return False
     
     return True
コード例 #12
0
 def startDomain(self): 
     pbp = CustomVMButton().sender()
     buttonName = pbp.objectName()
     vmInfo = pbp.vmInfo
     for item in self.vmOffInfoList:
         if item["name"] == vmInfo["name"]:
             self.startVmInfo = item
     #return
 
     vmid = buttonName.split(":")[0]
     row = buttonName.split(":")[1]
     column = buttonName.split(":")[2]
     
     self.domainManager.setDomainInfo(self.startVmInfo)
     
     LogRecord.instance().logger.info(u"开始开启虚拟机-----------------------------------------------00")
     self.domainManager.startDomainByName()
     LogRecord.instance().logger.info(u"结束开启虚拟机-----------------------------------------------11")
コード例 #13
0
 def autoOpenCourse(self,name,classid = None):
     LogRecord.instance().logger.info(u'自动打开相应的虚拟机')
     self.autoCourse = name
     if name in self.downloadingList:
         self.courseTimer = QTimer()
         self.courseTimer.start(1000)
         self.connect(self.courseTimer, SIGNAL("timeout()"),self.checkDownloadOver)
     
     else:
         for item in self.vmOffInfoList:
             if name == item["name"]:
                 vmInfo = item
                 if classid != None:
                     vmInfo["classid"] = classid
             
                 self.domainManager.setDomainInfo(vmInfo)
                 self.domainManager.startDomainByName()
                 
                 return
コード例 #14
0
    def replaceFirstMenuName(self):
#         pass
        grub_file = QFile("/boot/grub/grub.conf")
        if not grub_file.open(QIODevice.ReadOnly):
            grub_file.close()
            return
     
        fs = QTextStream(grub_file)
        fileContent = fs.readAll()
        grub_file.close()
        if QString(fileContent).contains("MCOS cDesktop Client Start"):
            return
     
        cmd =  "sed -i \"s/CentOS (2.6.32-431.el6.i686)/MCOS cDesktop Client Start/g\" /boot/grub/grub.conf";
     
        ok = os.system(cmd)
        if ok != 0:
            LogRecord.instance().logger(u"替换grub.cfg中的'CentOS (2.6.32-431.el6.i686)'失败")
     
        if QString(fileContent).contains("hiddenmenu"):
            os.system("sed -i \"/hiddenmenu/d\" /boot/grub/grub.conf")
コード例 #15
0
 def autoOpenVMLesson(self, vmName, allflag = False):
     LogRecord.instance().logger.info(u'自动打开相应的虚拟机')
     if self.vmButtonList:
         vmInfo = self.vmButtonList[0].getVMInfo()
         VMOperation.instance().setCurrentVMInfo(vmInfo)
         #thread.start_new_thread(VMOperation.instance().openVM,())
         if allflag == True:                      
             if VMOperation.instance().openVM():
                 LogRecord.instance().logger.info(u'start the lesson')  
         else:
             if VMOperation.instance().openVM():
                 LogRecord.instance().logger.info(u'start the lesson')  
     else:
         LogRecord.instance().logger.info(u'未监测到虚拟机%s的信息' % vmName)  
コード例 #16
0
    def parseMsg(self,msg):
        if len(msg.split("#")) >= 2:
            if msg.split("#")[0] == "teacherip":
                self.teacherIp = msg.split("#")[1]
                self.emit(SIGNAL("receiveteacherip"),self.teacherIp)
            elif msg.split("#")[0] == "mousepos":
                self.slotSetMousePos(msg)
            elif msg.split("#")[0] == "startbroadcast":
                LogRecord.instance().logger.info("startbroadcast")
                self.slotStartAllBroadcast(msg)
                
            elif msg.split("#")[0] == "startstucomputerbroadcast":
                self.slotStartStuBroadcast(msg)
                    
            elif msg.split("#")[0] == "stopbroadcast":
                self.udpSocket.leaveMulticastGroup(self.mcast_addr_own)
                    
                self.emit(SIGNAL("stopbroadcast"))
                self.broadFlag = False
#                 lent = len(self.framedata)
#                 file = open("frame.txt","w")
#                 file.write(QString.number(self.datanum))
#                 file.write("++")
#                 file.write(QString.number(self.datareceivenum))
#                 file.write("++")
#                 file.write(QString.number(self.localframenum))
#                 file.write("++")
#                 file.write(QString.number(self.necnum))
#                 file.write("++")
#                 file.write(QString.number(self.avilableframenum))
#                 file.write("++")
#                 file.write(QString.number(lent))
#                 file.close()
                
                self.framedata.clear()
                self.dataframelist.clear()
                self.currentframe = None
コード例 #17
0
def getLinuxOperationSystemType():
    """得到linux操作系统的类型"""
    statusOutput = commands.getstatusoutput("head -n 1 /etc/issue")
    LogRecord.instance().logger.info(u"/etc/issue文件内容:%s" % statusOutput[1])
    if statusOutput[0] == 0:
        output = QString(statusOutput[1])
        if output.contains("Ubuntu 12.04"):
            return "Ubuntu 12.04"
        if output.contains("Ubuntu 13.04"):
            return "Ubuntu 13.04"
        elif output.contains("CentOS release 6.5"):
            return "CentOS 6.5"
        elif output.contains("CentOS release 7.0"):
            return "CentOS 7.0"
        elif output.contains("Ubuntu 14.04"):
            return "Ubuntu 14.04"
        elif output.contains("Ubuntu"):
            return "Ubuntu"
        elif output.contains("MCOS-cClassroom-student"):
            return "CentOS 7.0"
        elif output.contains("CentOS"):
            return "CentOS"

    return None
コード例 #18
0
def getNetInfo():
    netList = ["0.0.0.0","255.255.255.0","1.1.1.1", "dhcp", "dhcp", "0.0.0.0", "0.0.0.0"]

    networkInfo = getCmdExecValueT("../lib/ccr_jytcapi network")
    for item in networkInfo:
        if len(item.split(":")) == 2:
            if item.split(":")[0] == "ip":
                netList[0] = item.split(":")[1] 
            elif item.split(":")[0] == "mask": 
                netList[1] = item.split(":")[1] 
            elif item.split(":")[0] == "gateway":
                netList[2] = item.split(":")[1]
            elif item.split(":")[0] == "conf":
                if item.split(":")[1] == "0": 
                    netList[3] = "dhcp"
                else:   
                    netList[3] = "static"
            elif item.split(":")[0] == "dns1": 
                netList[4] = "static"
                netList[5] = item.split(":")[1]
            elif item.split(":")[0] == "dns2":
                netList[6] = item.split(":")[1]
    LogRecord.instance().logger.info(netList)
    return netList
コード例 #19
0
def getGdkResolution():
    import gtk.gdk
    LogRecord.instance().logger.info("getGdkResolution in")
    resolution = "1024x768"
    w = gtk.gdk.get_default_root_window()
    sz = w.get_size() #(1440,900)
    if len(sz) == 2:
        LogRecord.instance().logger.info(str(sz[0]))
        LogRecord.instance().logger.info(str(sz[1]))
        resolution = str(sz[0]) + "x" + str(sz[1])

    return resolution 
コード例 #20
0
    def setNetworkCardFilePath(self):
        #self.networkconfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + "br0"
        #self.bridgeNetworkconfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + "br0"
        ethName = common.DEFAULT_NETCARD_NAME
        ethNameList = globalfunc.getEthNameList()
        if not ethNameList:
            LogRecord.instance().logger.info(u"获取网卡名称失败!")
        else:
            ethName = ethNameList[0]

        self.originalNetConfigFile = common.NETWORK_CONFIG_CENTOS_7_0 + ethName
        LogRecord.instance().logger.info(u"获取网卡名称:%s" % self.originalNetConfigFile)
        
        self.originalBridgerNetConfigFile = common.BRIDGER_NETWORK_CONFIG_CENTOS_7_0
        LogRecord.instance().logger.info(u"获取bridge网卡名称:%s" % self.originalNetConfigFile)

        self.networkconfigFile = self.originalNetConfigFile
        self.bridgeNetworkconfigFile = self.originalBridgerNetConfigFile
        if globalvariable.PROGRAM_RUNNING_TYPE == common.OPERATION_ENV_TYPE:#running env
            self.networkconfigFile = globalfunc.convertPathToConfigPath(self.originalNetConfigFile)
            self.bridgeNetworkconfigFile = globalfunc.convertPathToConfigPath(self.originalBridgerNetConfigFile)
コード例 #21
0
def mountFile(filePath):
    mountPath = convertPathToConfigPath(filePath)
    if os.system("mount --bind %s %s" % (mountPath, filePath)) != 0:
        LogRecord.instance().logger.info(u"挂载配置文件失败,挂载路径:%s, 配置文件路径:%s" % (mountPath, filePath))
コード例 #22
0
def umountFile(filePath):
    if os.system("umount %s" % filePath) != 0:
        LogRecord.instance().logger.info(u"卸载配置文件失败,文件路径:%s" % filePath)
コード例 #23
0
    def slotCreateVMLesson(self):
        vmBtn = self.sender()
        if vmBtn:
            LogRecord.instance().logger.info(u'开始创建虚拟机')
            if globalvariable.VM_IS_CREATE_STATUS:
                LogRecord.instance().logger.info(u'重复点击!')
                return
            else:
                globalvariable.VM_IS_CREATE_STATUS = True

            LogRecord.instance().logger.info(u'准备获取虚拟机信息!')
            paramInfo = vmBtn.getVMInfo()
            LogRecord.instance().logger.info(u'准备获取虚拟机信息完成!')
            try:
                vmName = VMOperation.instance().createVMLesson(paramInfo)
            except:
                LogRecord.instance().logger.info(u'创建虚拟机异常.........!')
            LogRecord.instance().logger.info(u'得到创建的虚拟机信息!')
            if vmName:
                LogRecord.instance().logger.info(u'创建虚拟机%s成功' % vmName)
                vmInfo = NetworkManager.instance().getVMInfo(vmName)
                if vmInfo == None:
                    globalvariable.VM_IS_CREATE_STATUS = False
                    return
                if len(vmInfo) == 0:
                    globalvariable.VM_IS_CREATE_STATUS = False
                    return
                vmInfo[0]["vmname"] = vmInfo[0]["name"]
                if vmInfo:
                    VMOperation.instance().setCurrentVMInfo(vmInfo[0])
                    if VMOperation.instance().openVM(True):
                        #保存开启虚拟机的名称
                        #globalvariable.VM_IS_CREATE_STATUS = False
                        WindowMonitor.instance().insertVmId(vmName)
                    else:
                        globalvariable.VM_IS_CREATE_STATUS = False
                        #删除没有成功运行的虚拟机
                        if VMOperation.instance().removeVMLesson(vmName):
                            LogRecord.instance().logger.info(u"删除后台相应的虚拟机成功")
                else:
                    LogRecord.instance().logger.info(u'未查询到相应的虚拟机:%s' % vmName)
                    globalvariable.VM_IS_CREATE_STATUS = False
            else:
                LogRecord.instance().logger.info(u'创建虚拟机失败')
                globalvariable.VM_IS_CREATE_STATUS = False


            #刷新虚拟机界面
            self.emit(SIGNAL("refreshVMS"))
コード例 #24
0
    def setRowColumnWidget(self,row,column,vmid):
        status = "sfw"
        #self.vmTableWidget.clear()
        mainWidget = QWidget()
        #self.vmTableWidget.hideColumn()
        #vmRowButtonList = []
        parentWidth = self.parent.width()
        resolutionValue = StoreInfoParser.instance().getResolutionValue()
        if resolutionValue:
            if len(resolutionValue.split("x")) >= 2:
                parentWidth = int(resolutionValue.split("x")[0])*5/9.0
        ratio = parentWidth/800.0
        vmWidth = (parentWidth - 20*2 -50*2*ratio)/3
        if len(self.vmInfoList) > 3:
            vmWidth = (parentWidth - 20*2 -50*2*ratio)/3 - 20*(1 - ratio)
        
        vmButton = CustomVMButton()
        vmButton.setFixedSize(QSize(vmWidth, vmWidth + 5))
        vmButton.setIconSize(QSize(vmWidth - 60*ratio,vmWidth - 30*ratio))
        vmButton.setText(self.vmInfoList[row*3 + column]["name"])
        vmButton.setFlat(True)
        vmButton.setFont(QFont("Times", 15, QFont.Bold))
        vmInfo = self.vmInfoList[row*3 + column]
        vmButton.setVMInfo(vmInfo)
        imageName = "other.png"
        if self.vmInfoList[row*3 + column].has_key("os_distro"):
            if common.imageMap.has_key(self.vmInfoList[row*3 + column]["os_distro"]):
                imageName = common.imageMap[self.vmInfoList[row*3 + column]["os_distro"]]
            else:
                LogRecord.instance().logger.info(u'common.imageMap中未找到键值%s' % self.vmInfoList[row*3 + column]["os_distro"])
                        
        vmButton.setIcon(QIcon("images/systemImage/%s" % imageName))
                
#         if globalvariable.CLASS_STATUS and not globalvariable.TICHU_STATUS:
#             self.connect(vmButton, SIGNAL("clicked()"),self.slotOpenVMLesson)
#             self.connect(vmButton, SIGNAL("controlvm"),self.slotControlVM)
#         else:
#             self.connect(vmButton, SIGNAL("clicked()"),self.slotCreateVMLesson)
                    
        #vmRowButtonList.append(vmButton)
        self.vmButtonList.append(vmButton)
        #firMybutton.setStatus("undownload")
        vmButton.setObjectName(vmid + ":" + QString.number(row) + ":" + QString.number(column))
        self.connect(vmButton, SIGNAL("clicked()"),self.startDomain)
        
            
        progressBar = WidgetProgress()
        progressBar.setFixedSize(vmWidth, vmWidth + 5)
        #progressBar.progressBar.setValue(0)
        progressBar.setVmName(self.vmInfoList[row*3 + column]["name"])
        progressBar.setObjectName(vmid + ":" + QString.number(row) + ":" + QString.number(column))
        #progressBar.objectName()
        
        #self.firMybutton.setText(self.tr("确萨"))
        
        #progressBar = QProgressBar()
        
        myLayout = QHBoxLayout()
        myLayout.setMargin(0)
        myLayout.addStretch()
        myLayout.addWidget(vmButton)
        myLayout.addWidget(progressBar)
        myLayout.addStretch()
        
        if vmid in self.downloadingList:
            vmButton.hide()
        else:
            progressBar.hide()
             
        #firMybutton.hide()
        mainWidget.setLayout(myLayout)
        
        
        self.vmTableWidget.setCellWidget(row, column, mainWidget)
コード例 #25
0
 def updateVMList(self):
     language = StoreInfoParser.instance().getLanguage()
     m_pTranslator = QTranslator()
     exePath = "./"
     if language == "chinese":
         QmName = "zh_CN.qm"
         StoreInfoParser.instance().setLanguage("chinese")
     else:
         QmName = "en_US.qm"
         
     if(m_pTranslator.load(QmName, exePath)):
         QCoreApplication.instance().installTranslator(m_pTranslator)
     
     if self.vmstatusTimer.isActive():
         self.vmstatusTimer.stop()
     else:
         pass
     subWidget = QWidget()
     vmNum = len(self.vmInfoList)
     rowNum = 0
     subMainLayout = QVBoxLayout()
     subMainLayout.setMargin(0)
     #subMainLayout.addStretch()
     #subMainLayout.addSpacing(10)
     #subMainLayout.setSpacing(10)
     
     self.vmButtonList = []
     
     if vmNum % 3 != 0:
         rowNum = vmNum / 3 + 1
     else:
         rowNum = vmNum / 3
          
     for i in range(rowNum):
         indexEnd = 3
         if i == rowNum - 1:
             indexEnd = vmNum - (i*3)
              
         parentWidth = self.parent.width()
         resolutionValue = StoreInfoParser.instance().getResolutionValue()
         if resolutionValue:
             if len(resolutionValue.split("x")) >= 2:
                 parentWidth = int(resolutionValue.split("x")[0])*5/9.0
         
         ratio = parentWidth/800.0
         vmWidth = (parentWidth - 20*2 -50*2*ratio)/3
         if vmNum > 3:
             vmWidth = (parentWidth - 20*2 -50*2*ratio)/3 - 20*(1 - ratio)
         vmRowButtonList = []
         for j in range(indexEnd):
             vmButton = CustomVMButton(self)
             vmButton.setFixedSize(QSize(vmWidth, vmWidth + 5))
             vmButton.setIconSize(QSize(vmWidth - 60*ratio,vmWidth - 30*ratio))
             vmButton.setText(self.vmInfoList[i*3 + j]["name"])
             vmButton.setToolTip(self.tr("course: ") + self.vmInfoList[i*3 + j]["name"])
             vmButton.setStyleSheet(u"QToolTip{border-radius:5px;background-color:white;color:black;font-size:20px;font-family:微软雅黑;}")
             vmButton.setFlat(True)
             vmButton.setFont(QFont("Times", 15, QFont.Bold))
             vmInfo = self.vmInfoList[i*3 + j]
             vmButton.setVMInfo(vmInfo)
             imageName = "other.png"
             if self.vmInfoList[i*3 + j].has_key("os_distro"):
                 if common.imageMap.has_key(self.vmInfoList[i*3 + j]["os_distro"]):
                     imageName = common.imageMap[self.vmInfoList[i*3 + j]["os_distro"]]
                 else:
                     LogRecord.instance().logger.info(u'common.imageMap中未找到键值%s' % self.vmInfoList[i*3 + j]["os_distro"])
                     
             vmButton.setIcon(QIcon("images/systemImage/%s" % imageName))
             if globalvariable.CLASS_STATUS and not globalvariable.TICHU_STATUS:
                 self.connect(vmButton, SIGNAL("clicked()"),self.slotOpenVMLesson)
                 self.connect(vmButton, SIGNAL("controlvm"),self.slotControlVM)
             else:
                 self.connect(vmButton, SIGNAL("clicked()"),self.slotCreateVMLesson)
                 
             vmRowButtonList.append(vmButton)
             self.vmButtonList.append(vmButton)
           
         btnLayout = QHBoxLayout()
         if vmNum > 3:
             btnLayout.setSpacing(10)
             #btnLayout.setMargin(10)
             btnLayout.addSpacing(30)
         for vmbtn in vmRowButtonList:
             btnLayout.addWidget(vmbtn)
         btnLayout.addStretch()
         subMainLayout.addLayout(btnLayout) 
          
     #subMainLayout.addStretch()
     subWidget.setLayout(subMainLayout)
     if self.scrollArea.widget():
         self.scrollArea.takeWidget()
     self.scrollArea.setWidgetResizable(False)
     self.scrollArea.setWidget(subWidget)