Ejemplo n.º 1
0
def get_sql_msg(src_ip,state):
    text = '${device/db_ip} ${device/db_port} ${device/db_user} ${device/db_passwd}'
    rpc_handle = HttpHandler()
    rpc_handle.login()
    result = rpc_handle.getResponseData("device_router","DeviceRouter","compile_text",[{"dev_ip":src_ip,"text":text}])
    if result:
        dbcfg = result.split()
        conn = None
        import MySQLdb
        try:
            conn = MySQLdb.connect(host=dbcfg[0], user=dbcfg[2],port=int(dbcfg[1]), passwd=dbcfg[3],db="ssoc",init_command="SET NAMES utf8")
            conn.autocommit(1)
            curs = conn.cursor()
            sql1 = "select b.mem_address,b.mem_port,a.control_address,a.control_port from cloud_virtual_server a " \
                   "LEFT JOIN cloud_virtual_member b on a.v_id = b.pool_id where b.mem_address='%s'"%src_ip
            curs.execute(sql1)
            conn.commit()
            result = curs.fetchall()
            #修改每个主机对应的端口状态
            for i in result:
                mem_address,mem_port,control_host,control_port = i
                set_member(mem_address,mem_port,str(state),control_host,control_port)
        except:
            logger.warning("连接数据库失败")
    else:
        logger.warning("获取数据库连接参数失败!%s可能不存在"%src_ip)
Ejemplo n.º 2
0
class SwitchCTMS:
    def __init__(self,dev_ip):
        self.conn = None
        self.dev_ip = dev_ip
        self.rpc_handle = HttpHandler()
        self.rpc_handle.login()
        self.getDabaseConnect()

    def complieText(self,dev_ip,text):
        return self.rpc_handle.getResponseData("device_router","DeviceRouter","compile_text",[{"dev_ip":dev_ip,"text":text}])

    def getDeviceInfo(self,devclass = "/zport/dmd/Devices/",devIp=None):
        param = [{"start":0,
        	"limit":50,
            "dir":"ASC",
            "sort":"name",
            "params":"{\"productionState\":[\"1000\"]",
            "uid":devclass}]
        if devIp:
            param[0]["params"]= param[0]["params"] + ',"ipAddress":"'+devIp+'"}'
        else:
            param[0]["params"]= param[0]["params"]+"}"
        return self.rpc_handle.getResponseData("device_router","DeviceRouter","getDevices",param)

    def getDabaseConnect(self):
        text = '${device/db_ip} ${device/db_port} ${device/db_user} ${device/db_passwd}'
        result = self.complieText(self.dev_ip,text)
        if result:
            dbcfg = result.split()
            conn = None
            import MySQLdb
            try:
                self.conn = MySQLdb.connect(host=dbcfg[0], user=dbcfg[2],port=int(dbcfg[1]), passwd=dbcfg[3],db="ssoc",reconnect=1,init_command="SET NAMES utf8")
                self.conn.autocommit(1)
            except:
                logger.warning("连接数据库失败")
        else:
            logger.warning("获取数据库连接参数失败!%s可能不存在"%self.dev_ip)

    def DelBackDeviceInfo(self):
        logger.debug("being DelBackDeviceInfo")
        sql = 'select back_ip,back_id from cloud_master_back_info where master_ip = "%s"'%self.dev_ip
        self.conn.query(sql)
        result = self.conn.use_result()
        rows =  result.fetch_row(0,1)
        sql = 'delete from cloud_master_back_info where master_ip = "%s"'%self.dev_ip
        curs = self.conn.cursor()
        curs.execute(sql)
        logger.debug("end DelBackDeviceInfo")
        return rows

    def StopService(self,dev_ip):
        param = "${device/zCommandPassword} ${device/zCommandPort} ${device/zCommandUsername} ${device/zSybaseModelerOSUser}"
        param = self.complieText(dev_ip,param)
        if param:
            params_list = param.split()
            cmd = 'sudo sshpass -p %s ssh -p %s %s@%s su - %s -c "echo null_acb |stopctms;killall -9 ctms;echo ok"""'%(params_list[0],params_list[1],params_list[2],dev_ip,params_list[3])
            logger.info("exec command :%s"%cmd)
            cmd = "ls"
            p = subprocess.Popen(cmd,bufsize=1,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
            logger.info("---StopCTMSService result----\n%s"%p.stdout.read())
        else:
            logger.warning("停止CTMS服务失败,编译停止命令出错")

    def StartService(self,dev_ip):
        param = "${device/zCommandPassword} ${device/zCommandPort} ${device/zCommandUsername} ${device/zSybaseModelerOSUser}"
        param = self.complieText(dev_ip,param)
        if param:
            params_list = param.split()
            cmd = 'sudo sshpass -p %s ssh -p %s %s@%s su - %s -c "echo null_acb |stopctms;killall -9 ctms;startctms;echo ok"""'%(params_list[0],params_list[1],params_list[2],dev_ip,params_list[3])
            logger.info("exec command :%s"%cmd)
            cmd = "pwd"
            p = subprocess.Popen(cmd,bufsize=1,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
            logger.info("---StartService result----\n%s"%p.stdout.read())
        else:
            logger.warning("启动CTMS服务失败,编译停止命令出错")

    def ChangeDeviceClass(self,devid,newClass):
        #param = [{"uids":["/zport/dmd/Devices/Server/Webserver/Apache/devices/192.168.1.166"],"target":"/zport/dmd/Devices/Client"}]
        param = [{"uids":[devid],"target":newClass}]
        logger.info("修改设备%s的类型%s"%(devid,newClass))
        result = self.rpc_handle.getResponseData("acg_router","ACGRouter","changeDevCls",param)
        logger.info("修改设备%s的类型%s:返回%s"%(devid,newClass,result))


    def DoStartBack(self):
        #   2。是否已经启动备机(已经启动备机,则忽略)
        sql = 'select back_ip,back_id from cloud_master_back_info where master_ip = "%s"'%self.dev_ip
        self.conn.query(sql)
        result = self.conn.use_result()
        rows =  result.fetch_row(0,1)
        if len(rows) > 0:
            logger.warning("设备[%s]的备机已经启动,忽略启动备机操作"%self.dev_ip)
        else:
            #查询可用的备机
            sql = """select  virsh_id,virsh_ip from cloud_virsh a,
            (select domain_id from cloud_virsh where virsh_ip = "%s")c
            where a.domain_id = c.domain_id
            and a.device_type = 0
            and a.virsh_id not in(select back_id from cloud_master_back_info)"""%self.dev_ip
            self.conn.query(sql)
            result = self.conn.use_result()
            rows =  result.fetch_row(0,1)
            if len(rows)<= 0:
                logger.warning("设备[%s]的备机启动失败,没有空闲的备机"%self.dev_ip)
            else:
                result =self.getDeviceInfo(devIp=rows[0]["virsh_ip"])
                if result["totalCount"]>0:
                    logger.info("设备[%s]的备机[%s]开始启动"%(self.dev_ip,rows[0]["virsh_ip"]))
                    #启动CTMS
                    self.StartService(rows[0]["virsh_ip"])
                    #修改设备分类
                    back_devid = result["devices"][0]["uid"]
                    paths = back_devid.split("/")[0:-2]
                    paths.append(APP_CLASS)
                    newClass = "/".join(paths)
                    self.ChangeDeviceClass(back_devid,newClass)
                    #登记主备
                    curs = self.conn.cursor()
                    sql = "insert into cloud_master_back_info(back_id,back_ip,master_ip) values('%s','%s','%s')"%(back_devid,rows[0]["virsh_ip"],self.dev_ip)
                    curs.execute(sql)
                    #重启zendmd
                    os.system("zencommand restart")
                    logger.warning("设备[%s]的切换备机完成"%self.dev_ip)
                else:
                    logger.warning("设备[%s]的备机不存在"%self.dev_ip)


    def DoStopBack(self):
        import pydevd
        pydevd.settrace('127.0.0.1', port=7777, stdoutToServer=True, stderrToServer=True)
        backlist =self.DelBackDeviceInfo()
        if len(backlist) ==0:
            logger.warning("设备%s没有找到备机"%self.dev_ip)
        else:
            for back in backlist:
                #获取备份机的设备信息
                result = self.getDeviceInfo(devIp=back["back_ip"])
                #如果备机还存在
                if result["totalCount"]>0:
                    #移动到上一级设备类
                    paths= result["devices"][0]["uid"].split("/")
                    if paths[-3] == APP_CLASS:
                        paths = paths[0:-3]
                        self.ChangeDeviceClass(result["devices"][0]["uid"],"/".join(paths))
                    self.StopService(back["back_ip"])
                    os.system("zencommand restart")
                    logger.warning("设备[%s]的停止备机完成"%self.dev_ip)
                else:
                    logger.warning("设备[%s]的备机[%s]已不存在"%(self.dev_ip,back["back_ip"]))