#!/usr/bin/env python3 # # Copyright (c) 2013,Thibault Saunier # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301, USA. import os import time from . import loggable import subprocess import sys import urllib.request import urllib.error import urllib.parse from .utils import printc, Colors logcat = "httpserver" class HTTPServer(loggable.Loggable): """ Class to run a SimpleHttpServer in a process.""" def __init__(self, options): loggable.Loggable.__init__(self) self.options = options self._process = None self._logsfile = None def _check_is_up(self, timeout=60): """ Check if the server is up, running a simple test based on wget. """ start = time.time() while True: try: response = urllib.request.urlopen('http://127.0.0.1:%s' % ( self.options.http_server_port)) return True except urllib.error.URLError as e: pass if time.time() - start > timeout: return False time.sleep(1) def start(self): """ Start the server in a subprocess """ self._logsfile = open(os.path.join(self.options.logsdir, "httpserver.logs"), 'w+') if self.options.http_server_dir is not None: if self._check_is_up(timeout=2): return True printc("-> Starting HTTP server... ", end='') try: self.debug("Launching http server") cmd = "%s %s %d %s" % (sys.executable, os.path.join(os.path.dirname(__file__), "RangeHTTPServer.py"), self.options.http_server_port, self.options.http_bandwith, ) curdir = os.path.abspath(os.curdir) os.chdir(self.options.http_server_dir) # cmd = "twistd -no web --path=%s -p %d" % ( # self.options.http_server_dir, self.options.http_server_port) self.debug( "Launching server: %s (logs in %s)", cmd, self._logsfile) self._process = subprocess.Popen(cmd.split(" "), stderr=self._logsfile, stdout=self._logsfile) os.chdir(curdir) self.debug("Launched http server") # Dirty way to avoid eating to much CPU... # good enough for us anyway. time.sleep(1) if self._check_is_up(): printc("OK", Colors.OKGREEN) return True else: printc("FAILURE", Colors.FAIL) self._process.terminate() self._process = None except OSError as ex: printc("FAILURE", Colors.FAIL) self.warning(logcat, "Could not launch server %s" % ex) return False def stop(self): """ Stop the server subprocess if running. """ if self._process: self._process.terminate() self._process = None self.debug("Server stopped")