Ejemplo n.º 1
0
class Gis(object):
	PROPS = [ { 'id':'1', 'name':u'服务器地址', 'field':'address'},
	  { 'id':'2', 'name': u'端口', 'field':'port'},
	  { 'id':'3','name': u'通信模式', 'field':'commtype'},
	  { 'id':'4','name': u'启用', 'field':'enabled' },
	  { 'id':'16383', 'name': u'驱动程序名', 'field':'driver' }
	  ]

	def __init__(self):
		self.gw = Gateway()
		self.info = self.gw.get_config_root()
		self.gw_node = self.gw.get_node() 
	
	def list(self):
		gis = etree.Element("GIS")
		module = self.gw_node.find('MODULE[@id="127"]')
		if module != None:
			tags = module.findall("TAG")
			for tag in tags:
				item = etree.SubElement('Item')
				for prop in self.PROPS:
					item.set(prop['field'],tag.find('PROP[id=' + prop['id'] + ']').text)
		return gis
		
  	def write(self):
        	self.gw.write(self.info)
Ejemplo n.º 2
0
class Encoder(object):
	GW = Gateway()
	OBJECT_MAX = 65535
	PROPS = [ { 'id':'1', 'name':u'名称', 'field':'name','unique':True, 'validate':'.+','long_name':u'编码器名称' },
	  { 'id':'2', 'name': u'设备地址', 'field':'address', 'unique':True, 'validate':'^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$'},
	  { 'id':'3','name': u'服务端口', 'field':'service_port', 'validate':'^\d+$', 'min':1,'max':65535 },
	  { 'id':'4','name': u'设备名称', 'field':'device_name' },
	  { 'id':'5','name': u'生产厂家', 'field':'vendor' },
	  { 'id':'6','name': u'设备类型', 'field':'device_type' },
	  { 'id':'7','name': u'GUID', 'field':'guid' },
	  { 'id':'8','name': u'PTZProtocal', 'field':'ptz_protocal' },
	  { 'id':'9','name': u'IO Addr', 'field':'io_addr', 'validate':'^\d+$', 'min':0, 'max':255, 'long_name':u'IO地址' },
	  { 'id':'10','name':u'音频端口', 'field':'audio_port', 'validate':'^\d+$', 'min':1, 'max':65535 },
          { 'id':'11','name':u'连接模式', 'field':'connect_type' },        
	  { 'id':'16383', 'name': u'驱动程序名', 'field':'driver' }
	  ]

	VIDEO_PROPS = [ {'id':'1', 'name':u'名称', 'field':'name', 'default':'video0' },
	  { 'id':'2','name': u'编码类型', 'field':'encode_type' },
	  { 'id':'3','name': u'通道号', 'field':'channel' },
	  { 'id':'4','name': u'通讯模式', 'field':'com_method' },
	  { 'id':'5','name': u'源地址', 'field':'src_address', 'default':GW.get_info()['host'] },
	  { 'id':'6','name': u'源端口', 'field':'src_port' },
	  { 'id':'7','name': u'协议类型', 'field':'protocal_type' },
	  { 'id':'8','name': u'码率', 'field':'encode_rate' },
	  { 'id':'9','name': u'分辨率', 'field':'resolution' }
	  ]

	AUDIO_PROPS = [ {'id':'1', 'name':u'名称', 'field':'name', 'default':'audio0' },
	  { 'id':'2','name': u'编码类型', 'field':'encode_type' },
	  { 'id':'3','name': u'通道号', 'field':'channel' },
	  { 'id':'4','name': u'通讯模式', 'field':'com_method' },
	  { 'id':'5','name': u'源地址', 'field':'src_address' },
	  { 'id':'6','name': u'源端口', 'field':'src_port' },
	  { 'id':'7','name': u'协议类型', 'field':'protocal_type' },
	  { 'id':'8','name': u'码率', 'field':'encode_rate' }
	  ]

	SPOT_PROPS = [ {'id':'1', 'name':u'名称', 'field':'name' },
	  { 'id':'5','name': u'URL', 'field':'URL' },
	  ]

	def __init__(self):
		self.gw = Gateway()
		self.info = self.gw.get_config_root() 
		self.gw_node = self.gw.get_node()
		self.gw_info = self.gw.get_info()
		self.extra = self.gw.extra
		self.rewrite = False

	def to_xml(self, encoder):
		encoder_id = encoder.get('id')
		en = etree.Element("Encoder", id=encoder_id)
		for prop in self.PROPS:
			value = encoder.xpath("PROP[@id='" + prop['id'] + "']")[0].text
			if value == None:
			  value = ''
			en.set(prop['field'], value)
		en.set('device', str(get_device_index(en.get('device_name'))))
		
		return en

	def find_alias(self, id):
		nodes = self.extra.xpath('Stream[@id="' + id + '"]')
		if len(nodes) == 0:
			return None
		return nodes[0]

	def add_alias(self, id, alias):
		if alias.strip() == '':
			return None
		stream = etree.SubElement(self.extra.getroot(), 'Stream')
		stream.set('id', id)
		stream.set('status','0')
		stream.set('code', alias)
		return stream

	def update_alias(self, id, alias):
		if alias.strip() == '':
			self.remove_alias(id)
			return
		stream = self.find_alias(id)
		if stream == None:
			stream = self.add_alias(id, alias)
		else:
			stream.set('code', alias)

	def remove_alias(self, id):
		stream = self.find_alias(id)
		if stream != None:
			stream.getparent().remove(stream)

	def spot_to_xml(self, encoder, spot):
		id = spot.get('id')
		s = etree.Element('Spot')
                url = spot.xpath('PROP[@id="5"]')[0].text
                s.set('id', id)
                s.set('name', spot.xpath('PROP[@id="1"]')[0].text)
                s.set('global_id',re.search('(?<=sip:).*?(?=@)',url).group())

                relay = spot.xpath('PROP[@id="6"]')
                if len(relay) == 0:
                        relay = etree.SubElement(spot, "PROP", id="6", name=u"转发")
                        relay.text = "false"
                        self.rewrite = True
                else:
                        relay = relay[0]

                s.set('relay', relay.text)
                
		alias = self.find_alias(id)
		if alias != None:
			s.set('alias', alias.get('code'))
		vnode = spot.xpath('PROP[@id="2"]')[0]

                g = re.compile('\d+')
                streamId = g.findall(vnode.text)[1]
                video = encoder.xpath("MODULE[@id='125']")[0].xpath('TAG[@id="' + streamId + '"]')[0]
                audio = encoder.xpath("MODULE[@id='126']")[0].xpath('TAG[@id="' + streamId + '"]')[0]

                for vp in self.VIDEO_PROPS:
                	value = video.xpath("PROP[@id='" + vp['id'] + "']")[0].text
                	if value == None:
                        	value = ''
                	s.set('v_' + vp['field'],value)

              	for ap in self.AUDIO_PROPS:
                 	value = audio.xpath("PROP[@id='" + ap['id'] + "']")[0].text
                 	if value == None:
                        	value = ''
                	s.set('a_' + ap['field'],value)
		return s
	

	def list(self):
		capacity = "512";
		if os.path.isfile('/etc/capacity'):
			file = open('/etc/capacity', 'r')
			line = file.readline()
			file.close()	
			capacity = line.strip()
		spots = self.gw_node.xpath("MODULE[@id='1']")[0]
		encoders = etree.Element("Encoders", name=u'编码器', capacity=capacity)
		for encoder in self.info.xpath("OBJECT[@id!='0']"):
			encoder_id = encoder.get('id')
			en = self.to_xml(encoder)
			encoders.append(en)
			
			for vnode in spots.xpath('TAG/PROP[contains(text(),"/DEVICE' + encoder_id + '/VIDEO")]'):
				spot = vnode.getparent()
				en.append(self.spot_to_xml(encoder, spot))
		if self.rewrite:
                       self.write()
		return encoders

  	def generate_seq(self, node, path):
        	for i in range(1, self.OBJECT_MAX):
        		if len(node.xpath(path + "[@id='" + str(i) + "']")) == 0:
                		return str(i)

  	def generate_url(self, id):
        	return 'sip:' + id.strip() + '@' + self.gw_info['host'] + ':' + self.gw_info['port']

	def generate_global_id(self, seq):
		r_id = to_bin('0', 7)
		gw_id = to_bin(self.gw_info['id'],7)
		type_id = to_bin('13', 4)
		spots = self.gw_node.xpath("MODULE[@id='1']")[0]
		spot_id = to_bin(seq, 14)
		return str(int(r_id + gw_id + type_id + spot_id, 2))

	def generate_import_global_id(self, encoderId, spotId):
		r_id = to_bin(encoderId, 7)
		mg_id = to_bin('125',7)
		type_id = to_bin('13', 4)
		spot_id = to_bin(spotId, 14)
		return str(int(r_id + mg_id + type_id + spot_id, 2))

	def add(self, props):
		seq = self.generate_seq(self.info, "OBJECT")
        	encoder = etree.Element('OBJECT',id=seq)

        	for prop in self.PROPS:
                	p = etree.SubElement(encoder, 'PROP', name=prop['name'], id=prop['id'])
                	if props.has_key(prop['field']) and props[prop['field']].strip() != '':
                        	p.text = props[prop['field']].strip()

        	self.info.getroot().append(encoder)
        	self.write()
		return self.to_xml(encoder)

	def update(self, props):
        	id = props['id']
		encoder = self.find(id)
		for prop in self.PROPS:
			for p in encoder.findall("PROP"):
				if props.has_key(prop['field']) and p.get('id') == prop['id']:
					p.text = props[prop['field']].strip()
        	self.write()

	def find(self, id):
		encoder = self.info.xpath("OBJECT[@id='" + id + "']")[0]
		return encoder

	def find_spot(self, id):
		return self.gw_node.xpath('MODULE[@id="1"]')[0].xpath('TAG[@id="' + id + '"]')[0]

	def get_spot_ids(self, spot):
		vnode = spot.xpath('PROP[@id="2"]')[0]
                g = re.compile('\d+')
                return g.findall(vnode.text)

	def write(self):
        	self.gw.write(self.info)

	def write_extra(self):
        	self.gw.write_extra()
	
	def update_spot(self, props):
		id = props['id']
		encoderId = props['encoder_id']
		spot = self.find_spot(id)
		ids = self.get_spot_ids(spot)	
		vId = ids[1]
		aId = ids[1]
		spot_name = spot.xpath('PROP[@id="1"]')[0]
		spot_name.text = props['name'].strip()
		relay = spot.xpath('PROP[@id="6"]')[0]
		if props.has_key('relay'):
                        relay.text = props['relay'].strip()
                else:
                        relay.text = '0'
		encoder = self.find(encoderId)
		videoStream = encoder.xpath('MODULE[@id="125"]')[0].xpath('TAG[@id="' + vId + '"]')[0]
		audioStream = encoder.xpath('MODULE[@id="126"]')[0].xpath('TAG[@id="' + aId + '"]')[0]
		for prop in self.VIDEO_PROPS:
			for p in videoStream.findall('PROP'):
				if props.has_key('v_' + prop['field']) and p.get('id') == prop['id']:
					p.text = props['v_' + prop['field']].strip()
		for prop in self.AUDIO_PROPS:
			for p in audioStream.findall('PROP'):
				if props.has_key('a_' + prop['field']) and p.get('id') == prop['id']:
					p.text = props['a_' + prop['field']].strip()
		self.write()
		if props.has_key('alias'):
			self.update_alias(id, props['alias'].strip())
			self.write_extra()

	def add_spot(self, props):
		encoderId = props['encoder_id']
		encoder = self.find(encoderId)
		
		videos = encoder.xpath('MODULE[@id="125"]')
		audios = encoder.xpath('MODULE[@id="126"]')
		coms = encoder.xpath('MODULE[@id="127"]')
		if len(videos) == 0:
			videos = etree.SubElement(encoder,'MODULE', id='125')
			audios = etree.SubElement(encoder,'MODULE', id='126')
			#coms = etree.SubElement(encoder,'MODULE', id='127')
		else:
			videos = videos[0]
			audios = audios[0]
		if len(coms) == 0:
			coms = etree.SubElement(encoder,'MODULE', id='127')
		else:	
			coms = coms[0]
			
		seq = self.generate_seq(videos, "TAG")
        	videoStream = etree.SubElement(videos, 'TAG', type='13', id=seq)
        	audioStream = etree.SubElement(audios, 'TAG', type='13', id=seq)
        	com = etree.SubElement(coms, 'TAG', type='13', id=seq)

        	for prop in self.VIDEO_PROPS:
                	p = etree.SubElement(videoStream, 'PROP', name=prop['name'], id=prop['id'])
			if props.has_key('v_' + prop['field']):
				p.text = props['v_' + prop['field']]
			elif prop.has_key('default'):
				p.text = prop['default']
			

        	for prop in self.AUDIO_PROPS:
                	p = etree.SubElement(audioStream, 'PROP', name=prop['name'], id=prop['id'])
			if props.has_key('a_' + prop['field']):
				p.text = props['a_' + prop['field']]
			elif prop.has_key('default'):
				p.text = prop['default']

		module1 = self.gw_node.xpath('MODULE[@id="1"]')[0]
		id = self.generate_seq(module1,"TAG")
        	spot = etree.SubElement(module1, "TAG", type="13")
		spot.set('id',id)
        	p11 = etree.SubElement(spot, "PROP", name=u"名称", id="1")
        	p12 = etree.SubElement(spot, "PROP", name=u"VideoIn", id="2")
        	p13 = etree.SubElement(spot, "PROP", name=u"AudioIn", id="3")
        	p14 = etree.SubElement(spot, "PROP", name=u"运行状态", id="4")
        	p15 = etree.SubElement(spot, "PROP", name=u"URL", id="5")
        	p16 = etree.SubElement(spot, "PROP", name=u"转发", id="6")
        	p11.text = props['name'].strip()
        	p12.text = "/DEVICE" + encoderId + "/VIDEO" + seq
        	p13.text = "/DEVICE" + encoderId + "/AUDIO" + seq
        	p14.text = "0"
        	p15.text = self.generate_url(self.generate_global_id(id))
        	if props.has_key('relay'):
                        p16.text = props['relay'].strip()
        	else:
                	p16.text = '0'

		module2 = self.gw_node.xpath('MODULE[@id="2"]')[0]
	        com = etree.SubElement(module2, "TAG", type="13", id=self.generate_seq(module2,"TAG"))
        	p21 = etree.SubElement(com, "PROP", name=u"名称", id="1")
        	p22 = etree.SubElement(com, "PROP", name=u"COM输入端口", id="2")
        	p23 = etree.SubElement(com, "PROP", name=u"状态", id="3")
        	p21.text = 'COM' + seq
        	p22.text = '/DEVICE' + encoderId + '/COM' + seq
		p23.text = '0'
		
		self.write()
		if props.has_key('alias'):
			self.add_alias(id, props['alias'].strip())
			self.write_extra()
		return self.spot_to_xml(encoder, spot)

	def remove(self, id):
		encoder = self.find(id)
		spots = self.gw_node.xpath("MODULE[@id='1']")[0]
		for vnode in spots.xpath('TAG/PROP[contains(text(),"/DEVICE' + id + '/VIDEO")]'):
			spot = vnode.getparent()
			self.remove_alias(spot.get('id'))
			spots.remove(spot)
		coms = self.gw_node.xpath("MODULE[@id='2']")[0]
		for cnode in coms.xpath('TAG/PROP[contains(text(),"/DEVICE' + id + '/COM")]'):
			com = cnode.getparent()
			coms.remove(com)
		encoder.getparent().remove(encoder)	
		self.write()
		self.write_extra()

	def remove_spot(self, id):
                spot = self.find_spot(id)
		ids = self.get_spot_ids(spot)
		
		com_module = self.gw_node.xpath('MODULE[@id="2"]')[0]
		com = com_module.xpath('TAG/PROP[text()="/DEVICE' + ids[0] + '/COM' + ids[1] + '"]')
		if len(com) == 1:
			com_module.remove(com[0].getparent())
		
		encoder = self.find(ids[0])
		vmodule = encoder.xpath('MODULE[@id="125"]')[0]
		amodule = encoder.xpath('MODULE[@id="126"]')[0]
		cmodule = encoder.xpath('MODULE[@id="127"]')
		
		vmodule.remove(vmodule.xpath('TAG[@id="' + ids[1] + '"]')[0])	
		amodule.remove(amodule.xpath('TAG[@id="' + ids[1] + '"]')[0])	
		
		if len(cmodule) > 0:
                        cmodule = cmodule[0]
                        tags = cmodule.xpath('TAG[@id="' + ids[1] + '"]')
			if len(tags) > 0:
                                cmodule.remove(tags[0])	

		spot.getparent().remove(spot)
		self.write()
		self.remove_alias(id)
		self.write_extra()

	def import_spots(self, id, xml, ids):
                encoder = self.find(id)
                i_xml = etree.fromstring(xml)
                i_gw = i_xml.xpath("/LIBRARY/OBJECT[@id='0']")[0]
                i_module = i_gw.xpath("MODULE[@id='1']")[0]
                new_spots = []
                for spot_id in ids:
                        i_spot = i_module.xpath("TAG[@id='" + spot_id + "']")[0]
                        vnode = i_spot.xpath('PROP[@id="2"]')[0]
                        urlnode = i_spot.xpath('PROP[@id="5"]')[0]
                        
                        g = re.compile('\d+')
                        i_ids = g.findall(vnode.text)
                        i_encoder = i_xml.xpath("OBJECT[@id='" + i_ids[0] + "']")[0]
                        i_video = i_encoder.xpath("MODULE[@id='125']")[0].xpath('TAG[@id="' + i_ids[1] + '"]')[0]
                        i_audio = i_encoder.xpath("MODULE[@id='126']")[0].xpath('TAG[@id="' + i_ids[1] + '"]')[0]

                        i_com = i_encoder.xpath("MODULE[@id='127']")
                        if len(i_com) > 0:
                                icom = i_com[0].xpath('TAG[@id="' + i_ids[1] + '"]')
                                if len(i_com) == 0:
                                        i_com = etree.Element("TAG")
                                        i_com.set("type","13")
                                else:
                                        i_com = i_com[0][0]
                        else:
                                i_com = etree.Element("TAG")
                                i_com.set("type","13")

                        videos = encoder.xpath('MODULE[@id="125"]')
                        audios = encoder.xpath('MODULE[@id="126"]')
                        coms = encoder.xpath('MODULE[@id="127"]')
                        if len(videos) == 0:
                                videos = etree.SubElement(encoder,'MODULE', id='125')
                                audios = etree.SubElement(encoder,'MODULE', id='126')
                                coms = etree.SubElement(encoder,'MODULE', id='127')
                        else:
                                videos = videos[0]
                                audios = audios[0]
                        if len(coms) == 0:
                                coms = etree.SubElement(encoder,'MODULE', id='127')
                        else:	
                                coms = coms[0]
			
                        seq = self.generate_seq(videos, "TAG")
                        videoStream = etree.SubElement(videos, 'TAG', type='13', id=seq)
                        audioStream = etree.SubElement(audios, 'TAG', type='13', id=seq)
                        com = etree.SubElement(coms, 'TAG', type='13', id=seq)
                        
                        for prop in i_video.getchildren():
                                videoStream.append(prop)

                        for prop in i_audio.getchildren():
                                audioStream.append(prop)

                        for prop in i_com.getchildren():
                                com.append(prop)

                        module1 = self.gw_node.xpath('MODULE[@id="1"]')[0]
                        new_spot_id = self.generate_seq(module1,"TAG")
                        spot = etree.SubElement(module1, "TAG", type="13")
                        spot.set('id',new_spot_id)
                        p11 = etree.SubElement(spot, "PROP", name=u"名称", id="1")
                        p12 = etree.SubElement(spot, "PROP", name=u"VideoIn", id="2")
                        p13 = etree.SubElement(spot, "PROP", name=u"AudioIn", id="3")
                        p14 = etree.SubElement(spot, "PROP", name=u"运行状态", id="4")
                        p15 = etree.SubElement(spot, "PROP", name=u"URL", id="5")
                        p16 = etree.SubElement(spot, "PROP", name=u"转发", id="6")
                        p11.text = i_spot.xpath('PROP[@id="1"]')[0].text
                        p12.text = "/DEVICE" + id + "/VIDEO" + seq
                        p13.text = "/DEVICE" + id + "/AUDIO" + seq
                        p14.text = "0"
                        p15.text = self.generate_url(self.generate_global_id(new_spot_id))
                        p16.text = "true"
                        
                        module2 = self.gw_node.xpath('MODULE[@id="2"]')[0]
                        com = etree.SubElement(module2, "TAG", type="13", id=self.generate_seq(module2,"TAG"))
                        p21 = etree.SubElement(com, "PROP", name=u"名称", id="1")
                        p22 = etree.SubElement(com, "PROP", name=u"COM输入端口", id="2")
                        p23 = etree.SubElement(com, "PROP", name=u"状态", id="3")
                        p21.text = 'COM' + seq
                        p22.text = '/DEVICE' + id + '/COM' + seq
                        p23.text = '0'
                        #i_global_id = self.generate_import_global_id(i_ids[0],i_ids[1])
                        i_global_id = urlnode.text.split('@')[0].split(':')[1]
                        self.add_alias(new_spot_id, i_global_id)
                        new_spots.append(spot)

                self.write()
                self.write_extra()
                        
                en = self.to_xml(encoder)
		for spot in new_spots:
			en.append(self.spot_to_xml(encoder, spot))
                                
		return en
Ejemplo n.º 3
0
class Spot(object):

    OBJECT_MAX = 127

    OBJECT_PROPS = [
        {"id": "1", "name": u"名称", "field": "name", "unique": True, "validate": ".+", "long_name": u"监控点名称"},
        {
            "id": "2",
            "name": u"设备地址",
            "field": "address",
            "unique": True,
            "validate": "^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$",
        },
        {"id": "3", "name": u"服务端口", "field": "service_port", "validate": "^\d+$", "min": 1, "max": 65535},
        {"id": "4", "name": u"设备名称", "field": "device_name"},
        {"id": "5", "name": u"生产厂家", "field": "vendor"},
        {"id": "6", "name": u"设备类型", "field": "device_type"},
        {"id": "7", "name": u"GUID", "field": "guid"},
        {"id": "8", "name": u"PTZProtocal", "field": "ptz_protocal"},
        {
            "id": "9",
            "name": u"IO Addr",
            "field": "io_addr",
            "validate": "^\d+$",
            "min": 0,
            "max": 255,
            "long_name": u"IO地址",
        },
        {"id": "10", "name": u"音频端口", "field": "audio_port", "validate": "^\d+$", "min": 1, "max": 65535},
        {"id": "16383", "name": u"驱动程序名", "field": "driver"},
        {"id": "", "name": u"标识", "field": "unique_id", "unique": True, "validate": "^\w+$"},
        {"id": "", "name": u"在线", "field": "online"},
    ]

    MODULE125_PROPS = [
        {"id": "1", "name": u"名称", "field": "name"},
        {"id": "2", "name": u"编码类型", "field": "encode_type"},
        {"id": "3", "name": u"通道号", "field": "channel"},
        {"id": "4", "name": u"通讯模式", "field": "com_method"},
        {"id": "5", "name": u"源地址", "field": "src_address"},
        {"id": "6", "name": u"源端口", "field": "src_port"},
        {"id": "7", "name": u"协议类型", "field": "protocal_type"},
        {"id": "8", "name": u"码率", "field": "encode_rate"},
        {"id": "9", "name": u"分辨率", "field": "resolution"},
    ]

    MODULE126_PROPS = [
        {"id": "1", "name": u"名称", "field": "name"},
        {"id": "2", "name": u"编码类型", "field": "encode_type"},
        {"id": "3", "name": u"通道号", "field": "channel"},
        {"id": "4", "name": u"通讯模式", "field": "com_method"},
        {"id": "5", "name": u"源地址", "field": "src_address"},
        {"id": "6", "name": u"源端口", "field": "src_port"},
        {"id": "7", "name": u"协议类型", "field": "protocal_type"},
        {"id": "8", "name": u"码率", "field": "encode_rate"},
    ]

    gw_info = Gateway().get_info()

    def __init__(self):
        self.gw = Gateway()
        self.info = self.gw.get_config_root()
        self.gw_node = self.gw.get_node()

    def short_list(self):
        module = self.gw_node.xpath("MODULE[@id='1']")[0]
        spot_list = []
        state = open("/tmp/gateway.state")
        states = state.read().split("\n")
        state.close()
        pending = open("/tmp/online")
        pendings = pending.read().split("\n")
        pending.close()
        for tag in module.getchildren():
            spot_attrs = tag.getchildren()
            spot = {"name": spot_attrs[0].text, "global_id": spot_attrs[4].text, "video_in": spot_attrs[2].text}
            spot["id"] = re.search("(?<=sip:).*?(?=@)", spot["global_id"]).group()
            spot["global_id"] = (
                "sip:" + spot["id"] + "@" + self.gw.get_info()["host"] + ":" + self.gw.get_info()["port"]
            )
            spot["online"] = str(((spot["id"] + "=1" in states) or (spot["id"] + "=1" in pendings)) + 0)
            spot_list.append(spot)
        return spot_list

    def get_onlines(self):
        spot_list = []
        state = open("/tmp/gateway.state")
        states = state.read().split("\n")
        state.close()
        pending = open("/tmp/online")
        pendings = pending.read().split("\n")
        pending.close()

        for s in states:
            s = s.split("=")
            if len(s) == 2 and s[1] == "1":
                spot_list.append(s[0])
        for s in pendings:
            s = s.split("=")
            if len(s) == 2 and s[1] == "1" and s[0] not in spot_list:
                spot_list.append(s[0])
        return ",".join(spot_list)

    def short_list1(self):
        module = self.gw_node.xpath("MODULE[@id='1']")[0]
        spot_list = []
        gis = open("/tmp/gis")
        gis_array = gis.read().split("\n")
        gis.close()
        for tag in module.getchildren():
            spot_attrs = tag.getchildren()
            spot = {"name": spot_attrs[0].text.encode("utf-8"), "global_id": spot_attrs[4].text}
            # spot['id'] = re.search('(?<=sip:).*?(?=@)',spot['global_id']).group()
            spot["global_id"] = (
                "sip:" + spot["id"] + "@" + self.gw.get_info()["host"] + ":" + self.gw.get_info()["port"]
            )
            spot["gis"] = 0
            for gisinf in gis_array:
                if gisinf.startswith(spot["id"] + "="):
                    spot["gis"] = gisinf
                    spot_list.append(spot)
        return spot_list

    def getGis(self, id):
        gis = open("/tmp/gis")
        gis_array = gis.read().split("\n")
        gis.close()
        for gisinf in gis_array:
            if gisinf.startswith(id + "="):
                return gisinf
        return ""

    #  def xml_list(self):
    # module = self.gw_node.xpath("MODULE")[0]
    # spots = etree.Element('Spots')
    # for tag in module.getchildren():
    # 	spot_attrs = tag.getchildren()
    # 	spot = etree.SubElement(spots, 'Spot', id=tag.get('id'))
    # 	spot.set('name',spot_attrs[0].text)
    # return spots

    def xml_list(self):
        list = self.short_list()
        spots = etree.Element("Spots")
        spots.set("gateway", self.gw_info["id"])
        for item in list:
            spot = etree.SubElement(spots, "Spot")
            for key in item.keys():
                spot.set(key, item[key])
        return spots

    def all(self, ip=""):
        if ip == "":
            ip = netconf.get_ip()
        state = open("/tmp/gateway.state")
        states = state.read().split("\n")
        state.close()
        module = self.gw_node.xpath("MODULE[@id='1']")[0]
        spots = etree.Element("Spots")
        for tag in module.getchildren():
            spot_attrs = tag.getchildren()
            spot = etree.SubElement(spots, "Spot", id=tag.get("id"))
            spot.set("name", spot_attrs[0].text)
            gid = re.search("(?<=sip:).*?(?=@)", spot_attrs[4].text).group()
            spot.set("url", gid + "@" + ip + ":" + self.gw.get_info()["port"])
            spot.set("state", str((gid + "=1" in states) + 0))
        return spots

    def list(self):
        spot_list = self.short_list()
        for spot in spot_list:
            spot["unique_id"] = spot["id"]
            seq = re.search("\d+", spot["video_in"]).group()
            obj = self.info.xpath("OBJECT[@id='" + seq + "']")[0]
            spot["seq"] = seq
            for prop in obj.getchildren():
                for p in Spot.OBJECT_PROPS:
                    if prop.get("id") == p["id"]:
                        spot[p["field"]] = prop.text

        return spot_list

    @staticmethod
    def generate_seq(node, path):
        for i in range(1, Spot.OBJECT_MAX):
            if len(node.xpath(path + "[@id='" + str(i) + "']")) == 0:
                return str(i)

    @staticmethod
    def generate_url(id):
        return "sip:" + id.strip() + "@" + Spot.gw_info["host"] + ":" + Spot.gw_info["port"]

    @staticmethod
    def log_xml(node):
        return etree.tostring(node, encoding="UTF-8", pretty_print=True)

    def is_unique(self, key, value, id):
        for spot in self.list():
            if id != spot["id"] and spot[key] == value:
                return False
        return True

    def validate_props(self, props):
        messages = {}
        for key, value in props.items():
            for p in Spot.OBJECT_PROPS:
                if key == p["field"]:
                    long_name = p["name"]
                    if p.has_key("long_name"):
                        long_name = p["long_name"]

                    if p.has_key("validate") and not re.match(p["validate"], value.strip()):  # 验证未通过
                        messages["error_" + key] = u"请填写正确的" + long_name
                        continue

                    if p.has_key("min") and (int(value.strip()) < p["min"] or int(value.strip()) > p["max"]):  # 范围不符合要求
                        messages["error_" + key] = u"请填写正确的" + long_name
                        continue

                    if p.has_key("unique") and not self.is_unique(key, value, props["id"]):  # 重复唯一
                        messages["error_" + key] = long_name + u"重复"

        return messages

    def f(self):
        return self.info.xpath('OBJECT/MODULE/TAG/PROP[contains(text(),"sip:")]')

    def update(self, props):
        messages = self.validate_props(props)
        if len(messages) > 0:  # 有字段验证没通过
            return {"spot": props, "messages": messages}

        id = props["id"]
        tag = self.info.xpath('OBJECT/MODULE/TAG/PROP[contains(text(),"sip:' + id + '@")]')[0]
        tag = tag.getparent()
        object = self.find(id)["node"]

        tag_props = tag.getchildren()
        object_props = object.getchildren()

        tag_props[0].text = props["name"].strip()
        tag_props[4].text = Spot.generate_url(props["unique_id"])

        for prop in object_props:
            for p in Spot.OBJECT_PROPS:
                if p["id"] == prop.get("id") and props.has_key(p["field"]):
                    prop.text = props[p["field"]].strip()

        self.write()
        return {"spot": props, "messages": {"success": True}}

    def add(self, props):
        messages = self.validate_props(props)
        if len(messages) > 0:  # 有字段验证没通过
            return {"spot": props, "messages": messages}

        seq = Spot.generate_seq(self.info, "OBJECT")

        module1 = self.gw_node.xpath('MODULE[@id="1"]')[0]
        tag1 = etree.SubElement(module1, "TAG", type="13", id=Spot.generate_seq(module1, "TAG"))
        p11 = etree.SubElement(tag1, "PROP", name=u"名称", id="1")
        p12 = etree.SubElement(tag1, "PROP", name=u"VideoIn", id="2")
        p13 = etree.SubElement(tag1, "PROP", name=u"AudioIn", id="3")
        p14 = etree.SubElement(tag1, "PROP", name=u"运行状态", id="4")
        p15 = etree.SubElement(tag1, "PROP", name=u"URL", id="5")
        p11.text = props["name"].strip()
        p12.text = "/DEVICE" + seq + "/VIDEO1"
        p13.text = "/DEVICE" + seq + "/AUDIO1"
        p14.text = "0"
        p15.text = Spot.generate_url(props["unique_id"])

        module2 = self.gw_node.xpath('MODULE[@id="2"]')[0]
        tag2 = etree.SubElement(module2, "TAG", type="13", id=Spot.generate_seq(module2, "TAG"))
        p21 = etree.SubElement(tag2, "PROP", name=u"名称", id="1")
        p22 = etree.SubElement(tag2, "PROP", name=u"COM输入端口", id="2")
        p23 = etree.SubElement(tag2, "PROP", name=u"状态", id="3")
        p21.text = "COM" + seq
        p22.text = "/DEVICE" + seq + "/COM1"
        p23.text = "0"

        object = etree.Element("OBJECT", id=seq)

        for prop in Spot.OBJECT_PROPS:
            p = etree.SubElement(object, "PROP", name=prop["name"], id=prop["id"])
            if props.has_key(prop["field"]) and props[prop["field"]].strip() != "":
                p.text = props[prop["field"]].strip()

        module125 = etree.SubElement(object, "MODULE", id="125")
        tag125 = etree.SubElement(module125, "TAG", type="13", id="1")

        module126 = etree.SubElement(object, "MODULE", id="126")
        tag126 = etree.SubElement(module126, "TAG", type="13", id="1")

        module127 = etree.SubElement(object, "MODULE", id="127")
        tag127 = etree.SubElement(module127, "TAG", type="13", id="1")

        for prop in Spot.MODULE125_PROPS:
            p = etree.SubElement(tag125, "PROP", name=prop["name"], id=prop["id"])

        for prop in Spot.MODULE126_PROPS:
            p = etree.SubElement(tag126, "PROP", name=prop["name"], id=prop["id"])

        self.info.getroot().append(object)
        self.write()
        return {"spot": props, "messages": {"success": True}}

    def write(self):
        self.gw.write(self.info)

    def find(self, unique_id):
        spot = {}
        for s in self.list():
            if s["id"] == unique_id:
                spot = s
                break
        if spot == {}:
            return {"info": spot, "node": None}

        object = self.info.xpath('OBJECT[@id="' + spot["seq"] + '"]')[0]
        for prop in object.getchildren():
            for p in Spot.OBJECT_PROPS:
                if prop.get("id") == p["id"]:
                    spot[p["field"]] = prop.text

        return {"info": spot, "node": object}

    def get_gateway(self):
        return self.gw

    def remove(self, id_list):
        module1 = self.gw_node.xpath('MODULE[@id="1"]')[0]
        module2 = self.gw_node.xpath('MODULE[@id="2"]')[0]
        for id in id_list:
            found = self.find(id)
            self.info.getroot().remove(found["node"])
            module1.remove(module1.xpath('TAG/PROP[contains(text(),"sip:' + id + '@")]')[0].getparent())
            module2.remove(module2.xpath('TAG[PROP="COM' + found["info"]["seq"] + '"]')[0])
        self.write()