Добавлена обработка заголовков запроса X-Forwarded...
authorRoman Bazalevsky <rvb@rvb.name>
Tue, 3 Nov 2015 08:55:26 +0000 (11:55 +0300)
committerRoman Bazalevsky <rvb@rvb.name>
Tue, 3 Nov 2015 08:55:26 +0000 (11:55 +0300)
Переделан вывод статистики соединений.
Убран лишний отладочный вывод в stdout.

plugins/stat_plugin.py
vlcclient/vlcclient.py
vpconfig.py
vphttp.py

index 1cf9b5efeb2f979fd37d4a85b97a4fa8345f56c4..99e6e0a6ad6fb9316fbdca5f0ad6bc925ef91dea 100644 (file)
@@ -21,7 +21,12 @@ class Stat(VPProxyPlugin):
             '<html><body><h4>Connected clients: ' + str(self.stuff.clientcounter.total) + '</h4>')
         connection.wfile.write(
             '<h5>Concurrent connections limit: ' + str(self.config.maxconns) + '</h5>')
+        connection.wfile.write('<table border="1"><tr><th>url</th><th>count</th><th>clients</th></tr>')
         for i in self.stuff.clientcounter.clients:
-            connection.wfile.write(str(i) + ' : ' + str(self.stuff.clientcounter.clients[i][0]) + ' ' +
-                                   str(self.stuff.clientcounter.clients[i][1]) + '<br>')
+          connection.wfile.write('<tr>')
+          connection.wfile.write('<td>' + str(i) + ' </td><td> ' + str(self.stuff.clientcounter.clients[i][0]) + '</td><td>')
+          for client in self.stuff.clientcounter.clients[i][1]:
+            connection.wfile.write(str(client) + '<br>')
+          connection.wfile.write('</td></tr>')
+        connection.wfile.write('</table>')
         connection.wfile.write('</body></html>')
index 80fc0f7850974d3aea32ffd03107a368d29a8b26..1fa5e4330d5feb7640febe5c42575956efea45ed 100644 (file)
@@ -9,7 +9,6 @@ import telnetlib
 import logging
 from vlcmessages import *
 import time
-from pprint import pprint
 
 class VlcException(Exception):
 
@@ -181,7 +180,6 @@ class VlcClient(object):
       self._resultlock.acquire()
       to_stop=set()
       for stream,lasttime in self.streams.iteritems():
-        print stream,lasttime
         if time.time()-lasttime>timeout:
           to_stop.add(stream)
       for stream in to_stop:    
index 97d24fb1c5c99fb46d0ba7b42ec54d22ffbe8cb3..f26c8ee8b2c86d9633abf5a69f44d6752e72d279 100644 (file)
@@ -8,7 +8,7 @@ import logging
 class VPConfig():
 
     # Message level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
-    debug = logging.INFO
+    debug = logging.WARNING
     # HTTP Server host
     httphost = '0.0.0.0'
     # HTTP Server port
@@ -39,7 +39,7 @@ class VPConfig():
     # ----------------------------------------------------
     #
     # VLC cmd line (use `--file-logging --logfile=filepath` to write log)
-    vlccmd = "vlc -I telnet --clock-jitter 0 --network-caching 500 --sout-mux-caching 2000 --telnet-password admin --telnet-port 4212"
+    vlccmd = "cvlc -I telnet --clock-jitter 0 --network-caching 500 --sout-mux-caching 2000 --telnet-password admin --telnet-port 4212 --http-user-agent=\"SmartLabs/1.5.9\""
     # VLC spawn timeout
     # Adjust this if you get error 'Cannot spawn VLC!'
     vlcspawntimeout = 15
@@ -66,9 +66,9 @@ class VPConfig():
     vlcforceffmpeg = False
     # Delay before closing connection when client disconnects
     # In seconds.
-    videodestroydelay = 5
+    videodestroydelay = 30
     # Pre-buffering timeout. In seconds.
-    videotimeout = 30
+    videotimeout = 45
     #
     # Some video players (mostly STBs and Smart TVs) can generate dummy requests
     # to detect MIME-type or something before playing.
index 7ed52f787296d6cfc382be6e5b4938be851af4b3..040e94cf3555e667292fa14105d69b7850e3cfdf 100644 (file)
--- a/vphttp.py
+++ b/vphttp.py
@@ -138,6 +138,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         '''
         GET request handler
         '''
+
         logger = logging.getLogger('http_HTTPHandler')
         self.clientconnected = True
         # Don't wait videodestroydelay if error happened
@@ -149,6 +150,14 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         # Connected client IP address
         self.clientip = self.request.getpeername()[0]
 
+        req_headers = self.headers 
+        self.client_data = { 
+          'ip': self.clientip, 
+          'forwarded-for': req_headers.get('X-Forwarded-For'),
+          'client-agent': req_headers.get('User-Agent'),
+          'uuid': uuid.uuid4()
+          }
+          
         if VPConfig.firewall:
             # If firewall enabled
             self.clientinrange = any(map(lambda i: ipaddr.IPAddress(self.clientip) \
@@ -190,8 +199,6 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
     def handleRequest(self, headers_only):
       
-        self.unic = uuid.uuid4()  
-
         # Limit concurrent connections
         if 0 < VPConfig.maxconns <= VPStuff.clientcounter.total:
             logger.debug("Maximum connections reached, can't serve this")
@@ -222,19 +229,19 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
                 self.params.append('0')
 
         # Adding client to clientcounter
-        clients = VPStuff.clientcounter.add(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic)
+        clients = VPStuff.clientcounter.add(self.reqtype+'/'+self.path_unquoted, self.client_data)
         # If we are the one client, but sucessfully got vp instance from clientcounter,
         # then somebody is waiting in the videodestroydelay state
 
         # Check if we are first client
-        if VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted)==1:
+        if VPStuff.clientcounter.get(self.reqtype+'/'+self.path_unquoted)==1:
             logger.debug("First client, should create VLC session")
             shouldcreatevp = True
         else:
             logger.debug("Can reuse existing session")
             shouldcreatevp = False
 
-        self.vlcid = hashlib.md5(self.reqtype+'\\'+self.path_unquoted).hexdigest()
+        self.vlcid = hashlib.md5(self.reqtype+'/'+self.path_unquoted).hexdigest()
 
         # Send fake headers if this User-Agent is in fakeheaderuas tuple
         if fakeua:
@@ -338,19 +345,7 @@ class HTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         finally:
             logger.debug("END REQUEST")
             logger.info("Closed connection from " + self.clientip + " path " + self.path)
-            VPStuff.clientcounter.delete(self.reqtype+'\\'+self.path_unquoted, self.clientip, self.unic)
-#            if not VPStuff.clientcounter.get(self.reqtype+'\\'+self.path_unquoted):
-#                try:
-#                    logger.debug("That was the last client, destroying VPClient")
-#                    logger.info("Stopping broadcasting " + self.path)
-#                    VPStuff.vlcclient.stopBroadcast(self.vlcid)
-#                except vlcclient.VlcException:    
-#                  logger.error("VLC connection problem, %s client(s)!" % VPStuff.clientcounter.total)
-#                  if VPStuff.clientcounter.total == 0:
-#                      logger.error("Probably VLC hang")
-#                      VPStuff.vlc.kill()
-#                except:
-#                    pass
+            VPStuff.clientcounter.delete(self.reqtype+'/'+self.path_unquoted, self.client_data)
             self.vp.destroy()
 
 class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
@@ -525,7 +520,7 @@ sched = BackgroundScheduler()
 sched.start()
 
 def clean_streams():
-  VPStuff.vlcclient.clean_streams(15)
+  VPStuff.vlcclient.clean_streams(VPConfig.videodestroydelay)
 
 job = sched.add_job(clean_streams, 'interval', seconds=15)
 
@@ -562,4 +557,5 @@ try:
         # Return to our server tasks
         server.handle_request()
 except (KeyboardInterrupt, SystemExit):
+    sched.shutdown()
     shutdown()