Loading .dockerignore 0 → 100644 +2 −0 Original line number Diff line number Diff line printer/ .vscode/ No newline at end of file back/myfab/api.py +26 −0 Original line number Diff line number Diff line Loading @@ -28,8 +28,10 @@ from flask_cors import CORS from myfab.queue import ( get_printers_from_db, get_printers, get_printer_by_name, get_printer_by_id, get_printers_for_queue, register_printer, get_queue_by_id, delete_printer ) Loading Loading @@ -543,6 +545,30 @@ def add_new_printer(): config=printer_info['config']) return jsonify({}) @app.route("/printers/announce/<name>/<key>") def announce_printer(name, key): cfg = json.dumps({ 'hostname': request.client_ip, 'port': 5000, 'key': key }) printer = get_printer_by_name(name) if printer == None: register_printer(Printer.create(name=name, model='octoprint', config=cfg)) return jsonify({}) printer.printer_obj.config = cfg printer.printer_obj.save() printer.reload_printer_connection_settings() return jsonify({}) @app.route("/printers/everyone_go_home") @jwt_required def home_all(): for p in get_printers(): if p.model == 'octoprint' and p.ready_state: p.goto_home() return jsonify({}) @app.route("/printers/<printer_id>", methods=["DELETE"]) @jwt_required def remove_printer(printer_id): Loading back/myfab/queue.py +38 −20 Original line number Diff line number Diff line Loading @@ -130,12 +130,23 @@ def get_printer_by_id(printer_id): return p return None def get_printer_by_name(printer_name): for p in get_printers(): if p.name == printer_name: return p return None def pull_printers(): # Called once to fetch printers from db global PRINTERS PRINTERS = get_printers_from_db() def register_printer(printer): global PRINTERS if get_printer_by_id(printer.id) != None: raise Exception("Printer already exists") PRINTERS.append(build_printer(printer)) def get_printers(): global PRINTERS Loading @@ -153,6 +164,7 @@ def delete_printer(printer_id): class PrinterBase: def __init__(self, printer_obj): self.printer_obj: Printer = printer_obj self.name = printer_obj.name # self.id = printer_obj.id # self.name = printer_obj.name self.queues = [] Loading Loading @@ -231,20 +243,8 @@ class FakePrinter(PrinterBase): class OctoPrinter(PrinterBase): def __init__(self, printer_obj): super().__init__(printer_obj) config = printer_obj.config """ { 'hostname': 'hostname or ip', 'port': port 'key': the api-key } """ self._version = "Unknown" self.hostname = config.hostname self.port = config.port self.key = config.key self.ready_for_printing = False # can accept new print self.test_and_pull_printer_global_info() self.reload_printer_connection_settings() self.load_queues() self.printer_state = { "temperatures": {"bed": float("nan"), "tip": float("nan")}, Loading @@ -266,6 +266,28 @@ class OctoPrinter(PrinterBase): } self.reset_current_print() def reload_printer_settings(self): self.printer_obj = type(self.printer_obj).get(self.printer_obj._pk_expr()) log.info(f'Printer #{self.id} ({self.name}): Reloaded base object') self.reload_printer_connection_settings() def reload_printer_connection_settings(self): config = json.loads(self.printer_obj.config) """ { 'hostname': 'hostname or ip', 'port': port 'key': the api-key, } """ self._version = "Unknown" self.hostname = config.hostname self.port = config.port self.key = config.key self.name = config.name log.info(f'Printer #{self.id} ({self.name}): Changed connection settings ({self.hostname})') self.test_and_pull_printer_global_info() def start_print(self, print_obj: PrintRequest): self._refresh_printer_status() self._refresh_ready_state() Loading Loading @@ -313,7 +335,7 @@ class OctoPrinter(PrinterBase): f"http://{self.hostname}:{self.port}{path}", headers={"X-Api-Key": self.key}, payload=data, files=None files=files ).text ) Loading @@ -328,9 +350,7 @@ class OctoPrinter(PrinterBase): })) def _refresh_printer_status(self): log.info( f'Printer #{self.id} ({self.name}) @ {self.hostname}: refreshing status' ) log.info(f'Printer #{self.id} ({self.name}) @ {self.hostname}: refreshing status') status = self._make_octoprint_raw_request("/api/printer") self.printer_state = { "temperatures": { Loading @@ -354,9 +374,7 @@ class OctoPrinter(PrinterBase): def test_and_pull_printer_global_info(self): versions = self._make_octoprint_raw_request("/api/version") log.info( f"Printer #{self.id} ({self.name}) @ {self.hostname}: connected to octoprint" ) log.info(f"Printer #{self.id} ({self.name}) @ {self.hostname}: connected to octoprint") log.info(f'Version info: {versions["text"]} API v{versions["text"]})') self._version = versions["text"] Loading ci/Dockerfile 0 → 100644 +16 −0 Original line number Diff line number Diff line FROM ubuntu:18.04 RUN apt update RUN apt install -y python3.8 python3-pip mysql-client nodejs nginx curl sudo RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt update && apt install -y yarn COPY . /app RUN cd /app/back && pip3 install -r requirements.txt RUN cd /app/ui && yarn && yarn build RUN cp /app/ci/nginx.conf /etc/nginx RUN nginx -t CMD /app/ci/start.sh No newline at end of file ci/nginx.conf 0 → 100644 +43 −0 Original line number Diff line number Diff line worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; gzip on; client_max_body_size 10M; server { server_name _; listen 80; client_max_body_size 0; client_body_buffer_size 1m; access_log /dev/stdout; error_log /dev/stderr; proxy_redirect off; location /api { proxy_pass http://localhost:8080/; } location / { root /app/ui/public; try_files $uri /index.html; } } } Loading
.dockerignore 0 → 100644 +2 −0 Original line number Diff line number Diff line printer/ .vscode/ No newline at end of file
back/myfab/api.py +26 −0 Original line number Diff line number Diff line Loading @@ -28,8 +28,10 @@ from flask_cors import CORS from myfab.queue import ( get_printers_from_db, get_printers, get_printer_by_name, get_printer_by_id, get_printers_for_queue, register_printer, get_queue_by_id, delete_printer ) Loading Loading @@ -543,6 +545,30 @@ def add_new_printer(): config=printer_info['config']) return jsonify({}) @app.route("/printers/announce/<name>/<key>") def announce_printer(name, key): cfg = json.dumps({ 'hostname': request.client_ip, 'port': 5000, 'key': key }) printer = get_printer_by_name(name) if printer == None: register_printer(Printer.create(name=name, model='octoprint', config=cfg)) return jsonify({}) printer.printer_obj.config = cfg printer.printer_obj.save() printer.reload_printer_connection_settings() return jsonify({}) @app.route("/printers/everyone_go_home") @jwt_required def home_all(): for p in get_printers(): if p.model == 'octoprint' and p.ready_state: p.goto_home() return jsonify({}) @app.route("/printers/<printer_id>", methods=["DELETE"]) @jwt_required def remove_printer(printer_id): Loading
back/myfab/queue.py +38 −20 Original line number Diff line number Diff line Loading @@ -130,12 +130,23 @@ def get_printer_by_id(printer_id): return p return None def get_printer_by_name(printer_name): for p in get_printers(): if p.name == printer_name: return p return None def pull_printers(): # Called once to fetch printers from db global PRINTERS PRINTERS = get_printers_from_db() def register_printer(printer): global PRINTERS if get_printer_by_id(printer.id) != None: raise Exception("Printer already exists") PRINTERS.append(build_printer(printer)) def get_printers(): global PRINTERS Loading @@ -153,6 +164,7 @@ def delete_printer(printer_id): class PrinterBase: def __init__(self, printer_obj): self.printer_obj: Printer = printer_obj self.name = printer_obj.name # self.id = printer_obj.id # self.name = printer_obj.name self.queues = [] Loading Loading @@ -231,20 +243,8 @@ class FakePrinter(PrinterBase): class OctoPrinter(PrinterBase): def __init__(self, printer_obj): super().__init__(printer_obj) config = printer_obj.config """ { 'hostname': 'hostname or ip', 'port': port 'key': the api-key } """ self._version = "Unknown" self.hostname = config.hostname self.port = config.port self.key = config.key self.ready_for_printing = False # can accept new print self.test_and_pull_printer_global_info() self.reload_printer_connection_settings() self.load_queues() self.printer_state = { "temperatures": {"bed": float("nan"), "tip": float("nan")}, Loading @@ -266,6 +266,28 @@ class OctoPrinter(PrinterBase): } self.reset_current_print() def reload_printer_settings(self): self.printer_obj = type(self.printer_obj).get(self.printer_obj._pk_expr()) log.info(f'Printer #{self.id} ({self.name}): Reloaded base object') self.reload_printer_connection_settings() def reload_printer_connection_settings(self): config = json.loads(self.printer_obj.config) """ { 'hostname': 'hostname or ip', 'port': port 'key': the api-key, } """ self._version = "Unknown" self.hostname = config.hostname self.port = config.port self.key = config.key self.name = config.name log.info(f'Printer #{self.id} ({self.name}): Changed connection settings ({self.hostname})') self.test_and_pull_printer_global_info() def start_print(self, print_obj: PrintRequest): self._refresh_printer_status() self._refresh_ready_state() Loading Loading @@ -313,7 +335,7 @@ class OctoPrinter(PrinterBase): f"http://{self.hostname}:{self.port}{path}", headers={"X-Api-Key": self.key}, payload=data, files=None files=files ).text ) Loading @@ -328,9 +350,7 @@ class OctoPrinter(PrinterBase): })) def _refresh_printer_status(self): log.info( f'Printer #{self.id} ({self.name}) @ {self.hostname}: refreshing status' ) log.info(f'Printer #{self.id} ({self.name}) @ {self.hostname}: refreshing status') status = self._make_octoprint_raw_request("/api/printer") self.printer_state = { "temperatures": { Loading @@ -354,9 +374,7 @@ class OctoPrinter(PrinterBase): def test_and_pull_printer_global_info(self): versions = self._make_octoprint_raw_request("/api/version") log.info( f"Printer #{self.id} ({self.name}) @ {self.hostname}: connected to octoprint" ) log.info(f"Printer #{self.id} ({self.name}) @ {self.hostname}: connected to octoprint") log.info(f'Version info: {versions["text"]} API v{versions["text"]})') self._version = versions["text"] Loading
ci/Dockerfile 0 → 100644 +16 −0 Original line number Diff line number Diff line FROM ubuntu:18.04 RUN apt update RUN apt install -y python3.8 python3-pip mysql-client nodejs nginx curl sudo RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt update && apt install -y yarn COPY . /app RUN cd /app/back && pip3 install -r requirements.txt RUN cd /app/ui && yarn && yarn build RUN cp /app/ci/nginx.conf /etc/nginx RUN nginx -t CMD /app/ci/start.sh No newline at end of file
ci/nginx.conf 0 → 100644 +43 −0 Original line number Diff line number Diff line worker_processes auto; pid /run/nginx.pid; events { worker_connections 768; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; gzip on; client_max_body_size 10M; server { server_name _; listen 80; client_max_body_size 0; client_body_buffer_size 1m; access_log /dev/stdout; error_log /dev/stderr; proxy_redirect off; location /api { proxy_pass http://localhost:8080/; } location / { root /app/ui/public; try_files $uri /index.html; } } }