#!/usr/bin/env python
from __future__ import with_statement
from os.path import exists
from os.path import join
from subprocess import PIPE
from subprocess import Popen
from subprocess import call
from sys import version_info
from sys import stdout
import threading

class WebServer(threading.Thread):
    def __init__(self, pycore):
        threading.Thread.__init__(self)
        self.pycore = pycore
        self.running = True
        self.server = pycore.config['webinterface']['server']
        self.https = pycore.config['webinterface']['https']
        self.setDaemon(True)
    
    def run(self):
        avail = ["builtin"]
        host = self.pycore.config['webinterface']['host']
        port = self.pycore.config['webinterface']['port']
        path = join(self.pycore.path, "module", "web")
        
        if not exists(join(self.pycore.path, "module", "web", "pyload.db")):
            print "########## IMPORTANT ###########"
            print "###        Database for Webinterface doesnt exitst, it will not be available."
            print "###        Please run: python %s syncdb" % join(self.pycore.path, "module", "web", "manage.py")
            print "###        You have to add at least one User, to gain access to webinterface: python %s createsuperuser" % join(self.pycore.path, "module", "web", "manage.py")
            print "###        Dont forget to restart pyLoad if you are done."
            print "################################"
            return None

        try:
            import flup
            avail.append("fastcgi")
        except:
            pass

        try:
            call(["lighttpd", "-v"], stdout=PIPE, stderr=PIPE)
            import flup
            avail.append("lighttpd")

        except:
            pass

        try:
            call(["nginx", "-v"], stdout=PIPE, stderr=PIPE)
            import flup
            avail.append("nginx")
        except:
            pass


        try:
            if exists(self.pycore.config["ssl"]["cert"]) and exists(self.pycore.config["ssl"]["key"]):
                if not exists("ssl.pem"):
                    key = file(self.pycore.config["ssl"]["key"], "rb")
                    cert = file(self.pycore.config["ssl"]["cert"], "rb")

                    pem = file("ssl.pem", "wb")
                    pem.writelines(key.readlines())
                    pem.writelines(cert.readlines())

                    key.close()
                    cert.close()
                    pem.close()

            else:
                self.https = False
        except:
            self.https = False


        if not self.server in avail:
            self.server = "builtin"


        if self.server == "nginx":

            self.pycore.logger.info("Starting nginx Webserver: %s:%s" % (host, port))
            config = file(join(path, "servers", "nginx_default.conf"), "rb")
            content = config.readlines()
            config.close()
            content = "".join(content)

            content = content.replace("%(path)", join(path, "servers"))
            content = content.replace("%(host)", host)
            content = content.replace("%(port)", port)
            content = content.replace("%(media)", join(path, "media"))
            content = content.replace("%(version)", ".".join(map(str, version_info[0:2])))

            if self.https:
                content = content.replace("%(ssl)", """
            ssl    on;
            ssl_certificate    %s;
            ssl_certificate_key    %s;
            """ % (self.pycore.config["ssl"]["cert"], self.pycore.config["ssl"]["key"]))
            else:
                content = content.replace("%(ssl)", "")
            
            new_config = file(join(path, "servers", "nginx.conf"), "wb")
            new_config.write(content)
            new_config.close()

            command = ['python', join(self.pycore.path, "module", "web", "manage.py"), "runfcgi", "daemonize=false", "method=threaded", "host=127.0.0.1", "port=9295"]
            self.p = Popen(command, stderr=PIPE, stdin=PIPE, stdout=Output(stdout))

            command2 = ['nginx', '-c', join(path, "servers", "nginx.conf"),]
            self.p2 = Popen(command2, stderr=PIPE, stdin=PIPE, stdout=Output(stdout))


        elif self.server == "lighttpd":
            self.pycore.logger.info("Starting lighttpd Webserver: %s:%s" % (host, port))
            config = file(join(path, "servers", "lighttpd_default.conf"), "rb")
            content = config.readlines()
            config.close()
            content = "".join(content)

            content = content.replace("%(path)", join(path, "servers"))
            content = content.replace("%(host)", host)
            content = content.replace("%(port)", port)
            content = content.replace("%(media)", join(path, "media"))
            content = content.replace("%(version)", ".".join(map(str, version_info[0:2])))

            if self.https:
                content = content.replace("%(ssl)", """
            ssl.engine = "enable"
            ssl.pemfile = "%s"
            ssl.ca-file = "%s"
            """ % (join(self.pycore.path, "ssl.pem"), self.pycore.config["ssl"]["cert"]))
            else:
                content = content.replace("%(ssl)", "")
            new_config = file(join(path, "servers", "lighttpd.conf"), "wb")
            new_config.write(content)
            new_config.close()

            command = ['python', join(self.pycore.path, "module", "web", "manage.py"), "runfcgi", "daemonize=false", "method=threaded", "host=127.0.0.1", "port=9295"]
            self.p = Popen(command, stderr=PIPE, stdin=PIPE, stdout=Output(stdout))

            command2 = ['lighttpd', '-D', '-f', join(path, "servers", "lighttpd.conf")]
            self.p2 = Popen(command2, stderr=PIPE, stdin=PIPE, stdout=Output(stdout))

         
        elif self.server == "builtin":
            self.pycore.logger.info("Starting django builtin Webserver: %s:%s" % (host, port))
            
            command = ['python', join(self.pycore.path, "module", "web", "run_server.py"), "%s:%s" % (host, port)]
            self.p = Popen(command, stderr=Output(stdout), stdin=PIPE, stdout=Output(stdout))
        else:
            #run fastcgi on port
            command = ['python', join(self.pycore.path, "module", "web", "manage.py"), "runfcgi", "daemonize=false", "method=threaded", "host=127.0.0.1", "port=%s" % port]
            self.p = Popen(command, stderr=PIPE, stdin=PIPE, stdout=Output(stdout))

    def quit(self):

        try:
            if self.server == "lighttpd" or self.server == "nginx":
                self.p.kill()
                self.p2.kill()
                return True

            else:
                self.p.kill()
                return True
        except:
            pass

        
        self.running = False

class Output:
     def __init__(self, stream):
        self.stream = stream
     def write(self, data): # Do nothing
        return None
         #self.stream.write(data)
         #self.stream.flush()
     def __getattr__(self, attr):
        return getattr(self.stream, attr)