cleanup for new backend
This commit is contained in:
		
							
								
								
									
										59
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								README.md
									
									
									
									
									
								
							| @ -1,13 +1,54 @@ | |||||||
| # msv-webcam-frontend | # msv-webcam-frontend | ||||||
|  |  | ||||||
| - `zypper install avif-tools` | 0) Get [backend running](https://git.mosad.xyz/localhorst/msv-webcam-backend) | ||||||
|  | 1) copy WebApp to `/var/www/html/msv-buehl-moos.de/webcam/` | ||||||
|  | 2) Import following nginx config: | ||||||
|  |  | ||||||
| - `mkdir /opt/msv-webcam-frontend/` | ``` | ||||||
| - `cd /opt/msv-webcam-frontend/` | server | ||||||
| - import `msv_webcam_frontend.py` | { | ||||||
| - `chmod +x /opt/msv-webcam-frontend/msv_webcam_frontend.py`  | 	listen 80; | ||||||
| - `nano /etc/systemd/system/msv-webcam-frontend.service` | 	listen [::]:80; | ||||||
| - create dst dir `mkdir -p /var/www/html/msv-buehl-moos.de/webcam/data/camera/` | 	server_name msv-buehl-moos.de www.msv-buehl-moos.de; | ||||||
| - `systemctl daemon-reload && systemctl enable --now msv-webcam-frontend.service` | 	return 301 https://$host$request_uri; | ||||||
|  | } | ||||||
|  |  | ||||||
| - copy WebApp to `/var/www/html/msv-buehl-moos.de/webcam/` | server | ||||||
|  | { | ||||||
|  | 	server_name msv-buehl-moos.de www.msv-buehl-moos.de; | ||||||
|  | 	listen 443 ssl; | ||||||
|  | 	listen [::]:443 ssl; | ||||||
|  | 	add_header Strict-Transport-Security max-age=31536000; | ||||||
|  | 	ssl_certificate /etc/letsencrypt/live/msv-buehl-moos.de/fullchain.pem; | ||||||
|  | 	ssl_certificate_key /etc/letsencrypt/live/msv-buehl-moos.de/privkey.pem; | ||||||
|  |  | ||||||
|  | 	location / | ||||||
|  | 	{ | ||||||
|  | 		client_max_body_size 10G; | ||||||
|  | 		proxy_buffering off; | ||||||
|  | 		proxy_pass http://127.0.0.1:27964; | ||||||
|  | 		proxy_set_header Accept-Encoding ""; | ||||||
|  | 		proxy_set_header Host $host; | ||||||
|  | 		proxy_set_header X-Real-IP $remote_addr; | ||||||
|  | 		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
|  | 		proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	# Serve /webcam/data/camera/ from the FTPS current folder | ||||||
|  | 	location /webcam/data/camera/ | ||||||
|  | 	{ | ||||||
|  | 		alias /home/dockeruser/ftps_server/files/current/; | ||||||
|  | 		autoindex on; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	# Generic /webcam location for the rest of the content | ||||||
|  | 	location /webcam | ||||||
|  | 	{ | ||||||
|  | 		root /var/www/html/msv-buehl-moos.de; | ||||||
|  | 		index index.html; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | 3) Test config with `nginx -t` | ||||||
|  | 4) Restart nginx with `systemctl restart nginx.service` | ||||||
| @ -1,16 +0,0 @@ | |||||||
| [Unit] |  | ||||||
| Description=MSV-Webcam-Frontend |  | ||||||
| After=syslog.target |  | ||||||
| After=network.target |  | ||||||
|  |  | ||||||
| [Service] |  | ||||||
| Type=simple |  | ||||||
| User=wwwrun |  | ||||||
| Group=wwwrun |  | ||||||
| Restart=on-failure |  | ||||||
| RestartSec=5s |  | ||||||
| WorkingDirectory=/opt/msv-webcam-frontend/ |  | ||||||
| ExecStart=/usr/bin/python3 /opt/msv-webcam-frontend/msv_webcam_frontend.py source_dir=/tmp/msv_webcam_current destination_dir=/var/www/html/msv-buehl-moos.de/webcam/data/camera/ timeout=540 min_size=100000 |  | ||||||
|  |  | ||||||
| [Install] |  | ||||||
| WantedBy=multi-user.target  |  | ||||||
| @ -1,127 +0,0 @@ | |||||||
| #!/usr/bin/env python3 |  | ||||||
| # -*- coding: utf-8 -*- |  | ||||||
| """ Author:                     Hendrik Schutter, mail@hendrikschutter.com |  | ||||||
| """ |  | ||||||
|  |  | ||||||
| import os |  | ||||||
| import errno |  | ||||||
| import time |  | ||||||
| from datetime import datetime |  | ||||||
| import shutil |  | ||||||
| import sys |  | ||||||
| import subprocess |  | ||||||
| import threading |  | ||||||
|  |  | ||||||
| signal_pipe_path = "/tmp/msv-webcam-signal-pipe" |  | ||||||
| signal_pipe_msg = "msv-webcam-new-images" |  | ||||||
|  |  | ||||||
| def copy_image(src, destination_dir_path): |  | ||||||
|     #print("src: " + str(src)) |  | ||||||
|     #print("dst: " + str(destination_dir_path)) |  | ||||||
|     shutil.copyfile(src, destination_dir_path) |  | ||||||
|  |  | ||||||
| def convert_to_avif(input, output): |  | ||||||
|     #print("input: " + str(input)) |  | ||||||
|     #print("output: " + str(output)) |  | ||||||
|     temp = subprocess.Popen(['avifenc', '--jobs', 'all', input, output], stdout = subprocess.PIPE)  |  | ||||||
|     # get the output as a string |  | ||||||
|     #output = str(temp.communicate())  |  | ||||||
|     #print(output) |  | ||||||
|     temp = subprocess.Popen(['sync',], stdout = subprocess.PIPE)  |  | ||||||
|  |  | ||||||
| def process_new_images(source_dir, destination_dir_path, min_size): |  | ||||||
|     images = os.listdir(source_dir) |  | ||||||
|     for image in images: |  | ||||||
|         if ((os.path.splitext(os.path.basename(os.path.normpath(image)))[1] != ".avif")): |  | ||||||
|  |  | ||||||
|             if(os.stat(os.path.join(source_dir, image)).st_size >= min_size): |  | ||||||
|  |  | ||||||
|                 converted_file_name = (os.path.splitext(os.path.basename(os.path.normpath(image)))[0] + ".avif") |  | ||||||
|                 converted_file_path = os.path.join("/tmp/", converted_file_name)  |  | ||||||
|  |  | ||||||
|                 convert_to_avif(os.path.join(source_dir, image), converted_file_path) |  | ||||||
|              |  | ||||||
|                 copy_image(converted_file_path, os.path.join(destination_dir_path, converted_file_name)) |  | ||||||
|  |  | ||||||
|             else: |  | ||||||
|                 print("Image " + str(image)  + " too small.") |  | ||||||
|  |  | ||||||
| def remove_old_image(path): |  | ||||||
|     print("Removing following outdated image: " + str(path)) |  | ||||||
|     os.remove(path) |  | ||||||
|  |  | ||||||
| def watchdog(timeout, source_dir, destination_dir_path): |  | ||||||
|     known_images = list() |  | ||||||
|  |  | ||||||
|     while True: |  | ||||||
|         images = os.listdir(destination_dir_path) |  | ||||||
|         for image in images: |  | ||||||
|             if ((os.path.splitext(os.path.basename(os.path.normpath(image)))[1] == ".avif")): |  | ||||||
|                 current_image = (image, os.stat(os.path.join(destination_dir_path, image)).st_size) |  | ||||||
|                 if current_image in known_images: |  | ||||||
|                     print("This image is old: " + str(image)) |  | ||||||
|                     remove_old_image(os.path.join(destination_dir_path, image)) |  | ||||||
|  |  | ||||||
|         known_images.clear() |  | ||||||
|  |  | ||||||
|         images = os.listdir(destination_dir_path) |  | ||||||
|         for image in images: |  | ||||||
|             if ((os.path.splitext(os.path.basename(os.path.normpath(image)))[1] == ".avif")): |  | ||||||
|                 current_image = (image, os.stat(os.path.join(destination_dir_path, image)).st_size) |  | ||||||
|                 known_images.append(current_image) |  | ||||||
|  |  | ||||||
|         time.sleep(timeout) |  | ||||||
|  |  | ||||||
| def main(): |  | ||||||
|     print("starting ...") |  | ||||||
|  |  | ||||||
|     source_dir = -1 |  | ||||||
|     destination_dir_path = -1 |  | ||||||
|     timeout = -1 |  | ||||||
|     min_size = -1 |  | ||||||
|  |  | ||||||
|     for argument in sys.argv: |  | ||||||
|         if argument.startswith('destination_dir'): |  | ||||||
|             destination_dir_path = argument.split("=")[1] |  | ||||||
|         if argument.startswith('source_dir'): |  | ||||||
|             source_dir = argument.split("=")[1] |  | ||||||
|         if argument.startswith('timeout'): |  | ||||||
|             timeout = int(argument.split("=")[1]) |  | ||||||
|         if argument.startswith('min_size'): |  | ||||||
|             min_size = int(argument.split("=")[1]) |  | ||||||
|          |  | ||||||
|     if ((source_dir == -1) or (destination_dir_path == -1)): |  | ||||||
|         print("Unable to parse config!") |  | ||||||
|         print("Example usage:") |  | ||||||
|         print("     python msv_webcam_frontend.py source_dir=/tmp/msv_webcam_current destination_dir=www/camera/ timeout=540 min_size=100000") |  | ||||||
|         sys.exit(-1) |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     watchdog_thread = threading.Thread(target=watchdog, args=((timeout, source_dir, destination_dir_path))) |  | ||||||
|     watchdog_thread.start() |  | ||||||
|  |  | ||||||
|     #process_new_images(source_dir, destination_dir_path) |  | ||||||
|     #sys.exit(-1) |  | ||||||
|  |  | ||||||
|     while True: |  | ||||||
|         try: |  | ||||||
|             if not os.path.exists(signal_pipe_path): |  | ||||||
|                 os.mkfifo(signal_pipe_path) |  | ||||||
|             pipe_fd = os.open(signal_pipe_path, os.O_RDONLY | os.O_NONBLOCK) |  | ||||||
|             with os.fdopen(pipe_fd) as pipe: |  | ||||||
|                 while True: |  | ||||||
|                     #print("reading pipe") |  | ||||||
|                     message = pipe.read() |  | ||||||
|                     if message: |  | ||||||
|                         #print("Received: " + str(message)) |  | ||||||
|                         if(message == signal_pipe_msg): |  | ||||||
|                             print("received signal about new images") |  | ||||||
|                             process_new_images(source_dir, destination_dir_path, min_size) |  | ||||||
|                     time.sleep(1) |  | ||||||
|         except Exception as e: |  | ||||||
|             print(e) |  | ||||||
|  |  | ||||||
|     watchdog_thread.join()         |  | ||||||
|  |  | ||||||
| if __name__ == "__main__": |  | ||||||
|         main() |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 244 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 352 KiB | 
| @ -46,7 +46,7 @@ | |||||||
|          <div class="w3-panel w3-card w3-dark-gray"> |          <div class="w3-panel w3-card w3-dark-gray"> | ||||||
|             <div class="w3-center-align w3-text-black infobox"> |             <div class="w3-center-align w3-text-black infobox"> | ||||||
|                   <a style="text-decoration: none" href="mailto:pressewart@msv-buehl-moos.de?subject=MSV%20Webcam"><h6>pressewart@msv-buehl-moos.de</h6></a> |                   <a style="text-decoration: none" href="mailto:pressewart@msv-buehl-moos.de?subject=MSV%20Webcam"><h6>pressewart@msv-buehl-moos.de</h6></a> | ||||||
|                   <p>Last update: 2023/07/18<p> |                   <p>Last update: 2025/08/15<p> | ||||||
|                   <a style="text-decoration: none" href="https://git.mosad.xyz/localhorst/msv-webcam-frontend" target="_blank" rel="noopener noreferrer"><h6>View code in GIT</h6></a> |                   <a style="text-decoration: none" href="https://git.mosad.xyz/localhorst/msv-webcam-frontend" target="_blank" rel="noopener noreferrer"><h6>View code in GIT</h6></a> | ||||||
|             </div> |             </div> | ||||||
|          </div> |          </div> | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user