205 lines
5.4 KiB
Python
Executable File
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.")
|