• phpserver.py
  • import subprocess, os, pexpect
    from time import sleep
    from inners.classes import *
    import sys
    import threading
    if os.name == "nt": 
        import multiprocess as mp
    else: 
        import multiprocessing as mp
    
    class Server:
        def serverCheck(self, alive = True): 
            while alive: 
                if not self.isAlive(): 
                    print(f"\n{msgHeaders.WARNING} Server stopped!")
                    alive = False
                sleep(1)
    
        def isAlive(self):
            try: 
                return self.serverProc.isalive()
            except: 
                return self.elevator.is_alive()
    
        def elevatedProc(self, cmd, passw):
            self.serverProc = pexpect.spawn(cmd, encoding='utf8', timeout=None, env=os.environ.copy())
            try: 
                self.serverProc.expect("sudo", 1)
                self.serverProc.sendline(passw)
            except: 
                pass
            self.serverProc.expect(pexpect.EOF)
    
        def setLogDestination(self,stream): 
            self.serverProc.logfile = stream
    
        def startServer(self, _root: str = "",php_path: str =  "", ip_addr: str = "127.0.0.1", port: str = "80"): 
            if os.name == "nt": 
                if php_path == "": 
                    php_path = "C:\\xampp\\php\\php.exe"  
            else: 
                if php_path == "":
                    php_path = "./inners/phpFiles/php -c ./inners/phpFiles/php.ini"
            args = [_root, php_path, ip_addr, port]
            defaults = ["", "", "127.0.0.1", "80"]
    
            for i, arg in enumerate(args):
                if arg == "": 
                    args[i] = defaults[i]
    
            echo = subprocess.Popen([f"echo {_root}"], shell=True, stdout=subprocess.PIPE)
            _root = echo.communicate()[0].decode().replace('\n', "")
            try: 
                cmd = f"sudo {php_path} -S {args[2]}:{args[3]}" + (" -t " if not _root == "" else "") + (f"{_root}" if not _root == "" else "")
                passw = input("[sudo] password: ")
                self.elevator = Thread(target=self.elevatedProc, args=(cmd, passw))
                self.elevator.start()
            except Exception as e: 
                print(e)
                pass
            return
        
        def stopServer(self): 
            self.serverProc.terminate()
        
        def getError(self): 
            return
            
    
    if __name__ == "__main__":
        server = Server()
        server.startServer()
        sleep(5)
        server.stopServer()