예제 #1
0
    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)
예제 #2
0
 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
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
파일: ssdp.py 프로젝트: buzztiaan/mediabox
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
예제 #6
0
 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
예제 #7
0
파일: ssdp.py 프로젝트: buzztiaan/mediabox
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
예제 #8
0
 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")
예제 #9
0
    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()
예제 #10
0
    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)
예제 #11
0
def on_boot_up():
    message = "SocietyBot is alive at %s" % network.get_ip()
    print message
    speak.speak(message)
예제 #12
0
def on_boot_up():
    message = "SocietyBot is alive at %s" % network.get_ip()
    print message
    speak.speak(message)