KiBot/kibot/resources/kiri/kiri-server

205 lines
5.4 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import os
import shutil
import re
import sys
import signal
import subprocess
from http.server import SimpleHTTPRequestHandler
import webbrowser
import socketserver
from subprocess import PIPE, Popen
from typing import List, Tuple
from urllib.parse import unquote
www_dir_path = None
httpd = None
default_port = 8080
class WebServerHandler(SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(
*args, directory=os.path.realpath(www_dir_path, **kwargs)
)
def log_message(self, format, *args):
pass
def do_GET(self):
super().do_GET()
def do_POST(self):
try:
self.send_response(200)
# self.send_header('Location', self.path)
self.end_headers()
content_len = int(self.headers.get('content-length', 0))
post_body = unquote(self.rfile.read(content_len)).split("&")
# with open("post.txt","a") as f:
# f.write(str(post_body))
# f.write("\n")
commit_hash = post_body[0].split("=")[1]
kicad_pro_path = post_body[1].split("=")[1]
cmd = "kicad_rev {}".format(kicad_pro_path)
print("Cmd:", cmd)
process = subprocess.Popen(cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# self._set_response()
# self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
except:
pass
def signal_handler(sig, frame):
httpd.server_close()
sys.exit(0)
def parse_cli_args():
parser = argparse.ArgumentParser(description="Kicad PCB visual diffs.")
parser.add_argument(
"-d", "--display", type=str, help="Set DISPLAY value, default :1.0", default=":1.0",
)
parser.add_argument(
"-n", "--nested", action='store_true', help="Fix paths when it was a nested project"
)
parser.add_argument(
"-p", "--port", type=int, help="Force the weverver on an specific port"
)
parser.add_argument(
"-r", "--port_range", type=int, default=10, help="Port range to try"
)
parser.add_argument(
"-S", "--server-only", action='store_true', help="Port range to try"
)
parser.add_argument(
"-w",
"--webserver-disable",
action="store_true",
help="Does not execute webserver (just generate images)",
)
parser.add_argument(
"-v", "--verbose", action="count", default=0, help="Increase verbosity (-vvv)"
)
parser.add_argument(
"-i", "--ip", type=str, help="Override default IP address", default="127.0.0.1",
)
parser.add_argument(
"www_dir", metavar="WWW_DIR", help="A folder with web/index.html inside"
)
args = parser.parse_args()
if args.verbose >= 3:
print("")
print("Command Line Arguments")
print(args)
return args
def launch_webserver(ip, request_handler, port, kicad_project, server_only):
global httpd
httpd = socketserver.TCPServer(("", port), request_handler)
with httpd:
if args.nested:
url = "{ip}:{port}/{nested_project}/web/index.html".format(
ip=ip,
port=str(port),
nested_project=kicad_project
)
else:
url = "http://{ip}:{port}/web/index.html".format(
ip=ip,
port=str(port)
)
print("")
print("Starting webserver at {}".format(url))
print("(Hit Ctrl+C to exit)")
if not server_only:
webbrowser.open(url)
httpd.serve_forever()
def run_cmd(path: str, cmd: List[str]) -> Tuple[str, str]:
p = Popen(
cmd,
stdin=PIPE,
stdout=PIPE,
stderr=PIPE,
close_fds=True,
encoding="utf-8",
cwd=path,
)
stdout, stderr = p.communicate()
p.wait()
return stdout.strip("\n "), stderr
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal_handler)
args = parse_cli_args()
if args.www_dir:
www_dir_path = os.path.abspath(args.www_dir)
kicad_project = ".."
# Assume it is running outside of the webserver the folder
index_html = os.path.realpath(os.path.join(www_dir_path, "web", "index.html"))
if not os.path.exists(index_html):
print("Could not find index.html")
exit(1)
if args.verbose:
print("")
print("www_dir_path:", www_dir_path)
print("kicad_project:", kicad_project)
print("index_html:", index_html)
print("")
else:
print("www directory is missing")
exit(1)
if not args.webserver_disable:
socketserver.TCPServer.allow_reuse_address = True
request_handler = WebServerHandler
if args.port:
try:
launch_webserver(args.ip, request_handler, args.port, kicad_project, args.server_only)
except Exception:
print("Specified port {port} is in use".format(port=port))
pass
else:
for i in range(args.port_range):
try:
port = default_port + i
launch_webserver(args.ip, request_handler, port, kicad_project, args.server_only)
except Exception:
# print("Specified port {port} is in use".format(port=port))
pass
print("Specified ports are in use.")