From 90306b2be04e7149c24664378f643543d2f66754 Mon Sep 17 00:00:00 2001 From: "andrew.vanderbye" Date: Fri, 22 Dec 2023 00:12:15 -0600 Subject: [PATCH] Updated code to v0.1.0 --- README => README.md | 0 osc-2-bat.py | 144 ++++++++++++++++++++++++++++++++++++++++++++ server.py | 8 +++ snippet.py | 10 +++ 4 files changed, 162 insertions(+) rename README => README.md (100%) create mode 100644 osc-2-bat.py create mode 100644 snippet.py diff --git a/README b/README.md similarity index 100% rename from README rename to README.md diff --git a/osc-2-bat.py b/osc-2-bat.py new file mode 100644 index 0000000..af700c9 --- /dev/null +++ b/osc-2-bat.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +OSC-2-BAT +-------------------------- +v0.1.0 +-------------------------- + +OSC server that receives commands on /script/* and runs batch files + +-i [IP ADDRESS] --ip [IP ADDRESS] IP Address to listen on +-p [PORT] --port [PORT] Port to listen on +-s [FOLDER] --scripts [SCRIPTS] Folder containing batch script files +-l [LEVEL] --log-level [LEVEL] Log Level [CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET] +-nl --no-logging Disable logging + +""" + +"""------------------------------------------------------------------------------------------- +-- IMPORTS +-------------------------------------------------------------------------------------------""" + +# ARGUMENT PARSING +import argparse + +# PYTHON OSC +from pythonosc.dispatcher import Dispatcher +from pythonosc.osc_server import BlockingOSCUDPServer + +# SUBPROCESS +import os +import subprocess +from subprocess import Popen + +# LOGGING +import logging +import datetime + +"""------------------------------------------------------------------------------------------- +-- ARGUMENT PARSING +-------------------------------------------------------------------------------------------""" + +parser = argparse.ArgumentParser() + +parser.add_argument("-i", "--ip", dest="ip", default="127.0.0.1", help="IP Address to listen on") +parser.add_argument("-p", "--port", dest="port", default="1337", type=int, help="Port to listen on") +parser.add_argument("-s", "--scripts", dest="scripts", default=".", help="Folder containing batch script files") +parser.add_argument("-l", "--log-level", dest="loglevel", default='info', help="Log Level [CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET]") +parser.add_argument("-nl", "--no-logging", dest="logaction", action='store_false', help="Disable logging") + +args = parser.parse_args() + +server_ip = args.ip +server_port = args.port +scripts_path = args.scripts +logging_level = args.loglevel + +batch_files = [] + +"""------------------------------------------------------------------------------------------- +-- LOGGING +-------------------------------------------------------------------------------------------""" + +# LOGGING FILE LOCATION +log_filename = "osc-2-script." + datetime.datetime.now().strftime('%m-%d-%Y') + ".log" + +# SET LEVEL +return_loglevel_error = False +if logging_level.upper() not in list(logging._nameToLevel.keys()): + return_loglevel_error = True + logging_level = 'WARNING' + +if args.logaction: + logging.basicConfig(filename=log_filename, level=logging_level.upper(), format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S') + +if return_loglevel_error: + print(f"{args.loglevel.upper()} not a valid logging level - defaulting to WARNING") + if args.logaction: + logging.warning(f"{args.loglevel.upper()} not a valid logging level - defaulting to WARNING") + + print(f"Logging level set to {logging_level}") + if args.logaction: + logging.info(f"Logging level set to {logging_level}") + print(f"Logging to file: {log_filename}") + if args.logaction: + logging.info(f"Logging to file: {log_filename}") + +"""------------------------------------------------------------------------------------------- +-- SERVER - HANDLER FUNCTIONS +-------------------------------------------------------------------------------------------""" + +# DEFAULT HANDLER + +def default_handler(address, *args): + print(f"DEFAULT - {address}: {args}") + +# SCRIPT HANDLER + +def script_handler(address, *args): + + if args.logaction: + logging.debug("Running Script Handler") + + script_to_run = address.split("/") + + script_name = script_to_run[-1] + script_location = script_to_run[2:-1] + + print(f"SCRIPT LOCATION: {script_location} - SCRIPT NAME {script_name}") + if args.logaction: + logging.debug(f"SCRIPT LOCATION: {script_location} - SCRIPT NAME: {script_name}") + + file_path = os.path.join(scripts_path, *script_location, script_name) + + if os.path.isfile(file_path): + print(f"RUNNING SCRIPT: {file_path}") + if args.logaction: + logging.info(f"RUNNING SCRIPT: {file_path}") + Popen(file_path,creationflags=subprocess.CREATE_NEW_CONSOLE) + else: + print(f"FILE NOT FOUND: {file_path}") + if args.logaction: + logging.error(f"FILE NOT FOUND: {file_path}") + +"""------------------------------------------------------------------------------------------- +-- SERVER +-------------------------------------------------------------------------------------------""" + +# DISPATCHER +dispatcher = Dispatcher() + +dispatcher.map("/script/*", script_handler) +dispatcher.set_default_handler(default_handler) + +# SERVER START +if __name__ == '__main__': + + print(f"Starting server on interface {server_ip} port {server_port}") + if args.logaction: + logging.info(f"Starting server on interface {server_ip} port {server_port}") + + server = BlockingOSCUDPServer((server_ip, server_port), dispatcher) + server.serve_forever() \ No newline at end of file diff --git a/server.py b/server.py index 9120376..d2d71c2 100644 --- a/server.py +++ b/server.py @@ -4,6 +4,14 @@ from pythonosc.osc_server import BlockingOSCUDPServer import subprocess from subprocess import Popen +import argparse +parser = argparse.ArgumentParser() + +parser.add_argument("-ip", "--osc-ip", help="OSC Device IP Address") +parser.add_argument("-p", "--port", help="OSC Device Port") + +args = parser.parse_args() + def default_handler(address, *args): print(f"DEFAULT {address}: {args}") diff --git a/snippet.py b/snippet.py new file mode 100644 index 0000000..1705ed3 --- /dev/null +++ b/snippet.py @@ -0,0 +1,10 @@ + +import argparse +parser = argparse.ArgumentParser() + +parser.add_argument("-ip", "--osc-ip", dest="ip", default="127.0.0.1", help="IP To Listen On") +parser.add_argument("-p", "--port", dest="port", default="1337", help="Port to Listen On") + +args = parser.parse_args() + +print(f"IP: {args.ip} - PORT: {args.port}") \ No newline at end of file