def handle_HTTPSERVER_EV_REQUEST(self, owner, req): if (owner != self): return method = req.get_method() if (method == "M-SEARCH"): self.emit_message(msgs.SSDP_EV_MSEARCH, req) elif (method == "NOTIFY"): if (req.get_header("X-MEDIABOX-IGNORE") == network.get_ip()): return max_age = ssdp.parse_max_age(req.get_header("CACHE-CONTROL")) location = req.get_header("LOCATION") usn = req.get_header("USN") nts = req.get_header("NTS") if ("::" in usn): uuid, urn = usn.split("::") else: uuid = usn urn = "" if (nts == "ssdp:alive"): self.__handle_ssdp_alive(uuid, location, max_age) elif (nts == "ssdp:byebye"): self.__handle_ssdp_byebye(uuid)
def get(self): """ :return: 获取所有的设置字段{} """ sd = col_settings.get() settings_data = {} for s in sd: settings_data[s['key']] = s['value'] # 注入代理ip地址 from utils.network import get_ip settings_data['proxy_server'] = get_ip() return settings_data
def handle_COM_EV_APP_STARTED(self): ip = network.get_ip() port = self.get_prop(self.PROP_UPNP_SERVICE_PORT) error = self.call_service(msgs.HTTPSERVER_SVC_BIND, self, ip, port) location = "http://%s:%d/Description.xml" % (ip, port) caps = self.__get_capabilities() for notification_type, unique_service_name in caps: ssdp.broadcast_alive(location, notification_type, unique_service_name)
def __make_device_description(self): """ Returns the device description in XML format. """ ip = network.get_ip() port = self.get_prop(self.PROP_UPNP_SERVICE_PORT) url_base = "http://%s:%d" % (ip, port) service_list = "<serviceList>" for svc in self.__services: svc_name = str(hash(svc)) scpd_url = "/scpd/%s.xml" % svc_name ctrl_url = "/control/%s.xml" % svc_name ev_url = "/event/%s.xml" % svc_name service_list += _SERVICE \ .replace("@@SERVICE_TYPE@@", svc.get_prop(svc.PROP_UPNP_SERVICE_TYPE)) \ .replace("@@SERVICE_ID@@", svc.get_prop(svc.PROP_UPNP_SERVICE_ID)) \ .replace("@@SCPD_URL@@", scpd_url) \ .replace("@@CONTROL_URL@@", ctrl_url) \ .replace("@@EVENT_URL@@", ev_url) #end for service_list += "</serviceList>" return _DEVICE_DESCRIPTION \ .replace("@@URL_BASE@@", url_base) \ .replace("@@DEVICE_TYPE@@", self.get_prop(self.PROP_UPNP_DEVICE_TYPE)) \ .replace("@@FRIENDLY_NAME@@", self.get_prop(self.PROP_UPNP_FRIENDLY_NAME)) \ .replace("@@MANUFACTURER@@", self.get_prop(self.PROP_UPNP_MANUFACTURER)) \ .replace("@@MANUFACTURER_URL@@", self.get_prop(self.PROP_UPNP_MANUFACTURER_URL)) \ .replace("@@MODEL_DESCRIPTION@@", self.get_prop(self.PROP_UPNP_MODEL_DESCRIPTION)) \ .replace("@@MODEL_NAME@@", self.get_prop(self.PROP_UPNP_MODEL_NAME)) \ .replace("@@MODEL_NUMBER@@", self.get_prop(self.PROP_UPNP_MODEL_NUMBER)) \ .replace("@@MODEL_URL@@", self.get_prop(self.PROP_UPNP_MODEL_URL)) \ .replace("@@SERIAL@@", self.get_prop(self.PROP_UPNP_SERIAL_NUMBER)) \ .replace("@@UDN@@", self.get_prop(self.PROP_UPNP_UDN)) \ .replace("@@UPC@@", self.get_prop(self.PROP_UPNP_UPC)) \ .replace("@@SERVICE_LIST@@", service_list)
def broadcast_alive(location, notification_type, unique_service_name, max_age=1800): """ Broadcasts a SSDP ALIVE notification. @since: 2010.10.03 """ logging.debug("[ssdp] broadcasting ALIVE: %s", unique_service_name) data = _SSDP_ALIVE % (max_age, location, notification_type, unique_service_name, network.get_ip()) network.send_datagram(SSDP_IP, SSDP_PORT, data) return max_age
def __create_gena_socket(self): """ Creates an asynchronous socket for listening to GENA events. """ self.__gena_url = "http://%s:%d" % (network.get_ip(), _PORT) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(("", _PORT)) sock.listen(1) gobject.io_add_watch(sock, gobject.IO_IN, self.__on_new_client) return sock
def respond_to_msearch(host, port, location, search_target, unique_service_name, max_age=1800): """ Sends a response to the sender of a M-SEARCH message. """ logging.debug("[ssdp] M-SEARCH response to: %s:%d", host, port) data = _M_SEARCH_RESPONSE % (max_age, location, search_target, unique_service_name, network.get_ip()) network.send_datagram(host, port, data) return max_age
def __discovery_thread(self): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) for i in range(3): ssdp.broadcast_msearch(sock) while (True): r_socks, w_socks, x_socks = select.select([sock], [], [], 6) if (r_socks): # process response r_sock = r_socks[0] data, addr = r_sock.recvfrom(1024) if (not "\r\n\r\n" in data): continue headers = network.HTTPHeaders(data) if (headers.http_type == headers.TYPE_INVALID or headers.status != 200): continue # ignore MediaBox from the same IP (i.e. myself) if (headers["X-MEDIABOX-IGNORE"] == network.get_ip()): continue uuid = headers["USN"] location = headers["LOCATION"] max_age = ssdp.parse_max_age(headers["CACHE-CONTROL"]) gobject.timeout_add(0, self.__handle_ssdp_alive, uuid, location, max_age) else: # timeout break #end while #end for logging.debug("[ssdp monitor] discovering finished")
def __on_toggle_webaccess(self, value): """ Reacts on toggling the WebAccess in the configurator. """ ip = network.get_ip() if (value == "on"): error = self.call_service(msgs.HTTPSERVER_SVC_BIND, self, ip, _PORT) if (error): self.__lbl_info.set_text("Error: %s" % error) else: self.__lbl_info.set_text("WebAccess-URL: http://%s:%d" % (ip, _PORT)) self.__list.render() else: self.call_service(msgs.HTTPSERVER_SVC_UNBIND, self, ip, _PORT) self.__lbl_info.set_text("") self.__list.invalidate() self.__list.render()
def __handle_msearch(self, req): """ Handles M-SEARCH discovery requests. """ if (req.get_header("MAN") == "\"ssdp:discover\""): src_host, src_port = req.get_source() mx = int(req.get_header("MX")) ip = network.get_ip() port = self.get_prop(self.PROP_UPNP_SERVICE_PORT) location = "http://%s:%s/Description.xml" % (ip, port) requested_search_target = req.get_header("ST") # announce capabilities caps = self.__get_capabilities() for search_target, unique_service_name in caps: if (requested_search_target in ("ssdp:all", search_target)): max_age = ssdp.respond_to_msearch(src_host, src_port, location, search_target, unique_service_name)
def on_boot_up(): message = "SocietyBot is alive at %s" % network.get_ip() print message speak.speak(message)
def on_boot_up(): message = "SocietyBot is alive at %s" % network.get_ip() print message speak.speak(message)