forked from protonphoton/LJ
		
	[enh] adds a command line runner for clitools
This commit is contained in:
		
							parent
							
								
									adca2e4502
								
							
						
					
					
						commit
						f9e0db4499
					
				
							
								
								
									
										1
									
								
								clitools/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								clitools/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
playlists
 | 
			
		||||
							
								
								
									
										11
									
								
								clitools/_run.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								clitools/_run.sh
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
killexit(){
 | 
			
		||||
  pkill -9 -s $$
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
trap killexit SIGTERM SIGINT SIGKILL SIGSTOP
 | 
			
		||||
 | 
			
		||||
bash -c "$@"
 | 
			
		||||
 | 
			
		||||
killbill(){ pkill -9 -s $(awk '{print $6}' /proc/$1/stat) }
 | 
			
		||||
							
								
								
									
										116
									
								
								clitools/runner.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										116
									
								
								clitools/runner.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,116 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import os
 | 
			
		||||
import signal
 | 
			
		||||
import subprocess
 | 
			
		||||
import time
 | 
			
		||||
import tty,termios
 | 
			
		||||
import re
 | 
			
		||||
import json
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import runner_lib as runner
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bindings={
 | 
			
		||||
    "Show playlist"     : "l",
 | 
			
		||||
    "Launch [0-x] cmd"  : "0-x",
 | 
			
		||||
    "Previous command"  : "p",
 | 
			
		||||
    "Next command"      : "o",
 | 
			
		||||
    "New command"       : "a",
 | 
			
		||||
    "Edit command"      : "e",
 | 
			
		||||
    "Delete command"    : "d",
 | 
			
		||||
    "Load playlist"     : "L",
 | 
			
		||||
    "Save playlist"     : "S",
 | 
			
		||||
    "Save as new"      : "A",
 | 
			
		||||
    "New playlist"      : "N",
 | 
			
		||||
    "Command help"      : "H",
 | 
			
		||||
    "Kill process Id"   : "K",
 | 
			
		||||
    "Edit Laser Id"     : "i",
 | 
			
		||||
    "Edit Laser Scene"  : "s",
 | 
			
		||||
    "Information"       : "I",
 | 
			
		||||
    "Help"              : "h",
 | 
			
		||||
    "Quit"              : "q",
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Init user contact
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Main Loop
 | 
			
		||||
runner.action_info()
 | 
			
		||||
runner.action_help()
 | 
			
		||||
print("\n\nLoad a playlist? [Y/n]: ")
 | 
			
		||||
if "y" == runner.inkey() :
 | 
			
		||||
  runner.action_loadPlaylist()
 | 
			
		||||
 | 
			
		||||
while True:
 | 
			
		||||
    # Fuck zombies
 | 
			
		||||
    runner._killBill()
 | 
			
		||||
    runner._ok("> Next Action?")
 | 
			
		||||
    k = runner.inkey()
 | 
			
		||||
 | 
			
		||||
    if bindings["Next command"] == k:
 | 
			
		||||
        runner.action_changeCommand( 1 )
 | 
			
		||||
        runner.action_runCommand()
 | 
			
		||||
    elif bindings["Previous command"] == k:
 | 
			
		||||
        runner.action_changeCommand( -1 )
 | 
			
		||||
        runner.action_runCommand()
 | 
			
		||||
    elif re.match( r'^\d+$',k):
 | 
			
		||||
        runner.action_match(k)
 | 
			
		||||
        runner.action_runCommand()
 | 
			
		||||
    elif bindings["New command"] == k:
 | 
			
		||||
        runner.action_newCommand()
 | 
			
		||||
        continue
 | 
			
		||||
    elif bindings["Show playlist"] == k:
 | 
			
		||||
        runner.action_listAll()
 | 
			
		||||
        continue
 | 
			
		||||
    elif bindings["Delete command"] == k:
 | 
			
		||||
        runner.action_deleteCommand()
 | 
			
		||||
        continue
 | 
			
		||||
    elif bindings["Edit command"] == k:
 | 
			
		||||
      runner.action_listAll()
 | 
			
		||||
      runner.action_edit()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Load playlist"] == k:
 | 
			
		||||
      if runner.action_loadPlaylist():
 | 
			
		||||
        runner.action_listAll()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Save playlist"] == k:
 | 
			
		||||
      runner.action_savePlaylist()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Save as new"] == k:
 | 
			
		||||
      runner.action_savePlaylist()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["New playlist"] == k:
 | 
			
		||||
      runner.action_newPlaylist()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Command help"] == k:
 | 
			
		||||
      runner.action_commandHelp()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Edit Laser Id"] == k:
 | 
			
		||||
      runner.action_laserId()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Edit Laser Scene"] == k:
 | 
			
		||||
      runner.action_laserScene()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Kill process Id"] == k:
 | 
			
		||||
      runner.action_killPid()
 | 
			
		||||
      continue
 | 
			
		||||
    elif bindings["Help"] == k:
 | 
			
		||||
        runner.action_help()
 | 
			
		||||
        continue
 | 
			
		||||
    elif bindings["Information"] == k:
 | 
			
		||||
        runner.action_info()
 | 
			
		||||
        continue
 | 
			
		||||
    elif bindings["Quit"] == k:
 | 
			
		||||
        runner.action_quit()
 | 
			
		||||
    else:
 | 
			
		||||
        runner._err("Unexpected key:{}".format(k))
 | 
			
		||||
        continue
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										374
									
								
								clitools/runner_lib.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										374
									
								
								clitools/runner_lib.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,374 @@
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import os
 | 
			
		||||
import signal
 | 
			
		||||
import subprocess
 | 
			
		||||
import time
 | 
			
		||||
import tty,termios
 | 
			
		||||
import re
 | 
			
		||||
import json
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import redis
 | 
			
		||||
 | 
			
		||||
class bcolors:
 | 
			
		||||
    HL = '\033[31m'
 | 
			
		||||
    OKBLUE = '\033[94m'
 | 
			
		||||
    OKGREEN = '\033[92m'
 | 
			
		||||
    ENDC = '\033[0m'
 | 
			
		||||
    BOLD = '\033[1m'
 | 
			
		||||
    UNDERLINE = '\033[4m'
 | 
			
		||||
 | 
			
		||||
class _Getch:
 | 
			
		||||
    def __call__(self):
 | 
			
		||||
            fd = sys.stdin.fileno()
 | 
			
		||||
            old_settings = termios.tcgetattr(fd)
 | 
			
		||||
            try:
 | 
			
		||||
                tty.setraw(sys.stdin.fileno())
 | 
			
		||||
                ch = sys.stdin.read(1)
 | 
			
		||||
            finally:
 | 
			
		||||
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
 | 
			
		||||
            return ch
 | 
			
		||||
inkey = _Getch()
 | 
			
		||||
 | 
			
		||||
def intkey():
 | 
			
		||||
  try:
 | 
			
		||||
     i = int( inkey() )
 | 
			
		||||
     return(i)
 | 
			
		||||
  except ValueError:
 | 
			
		||||
    print("Error.")
 | 
			
		||||
 | 
			
		||||
current_id=0
 | 
			
		||||
current_cmd=""
 | 
			
		||||
process = None
 | 
			
		||||
current_filename = ""
 | 
			
		||||
currentPlayList = []
 | 
			
		||||
playlistsDir = Path("./playlists")
 | 
			
		||||
if not playlistsDir.is_dir() : playlistsDir.mkdir()
 | 
			
		||||
 | 
			
		||||
def ask(q):
 | 
			
		||||
  print(q)
 | 
			
		||||
  return inkey()
 | 
			
		||||
 | 
			
		||||
def _ok(msg):
 | 
			
		||||
    print( bcolors.BOLD+bcolors.OKBLUE+ msg + bcolors.ENDC)
 | 
			
		||||
 | 
			
		||||
def _err(msg):
 | 
			
		||||
  print( bcolors.HL + msg + bcolors.ENDC)
 | 
			
		||||
 | 
			
		||||
def _kill(process):
 | 
			
		||||
    if process :
 | 
			
		||||
      try:
 | 
			
		||||
        pid = os.getpgid(process.pid)
 | 
			
		||||
        os.killpg(pid, signal.SIGTERM)
 | 
			
		||||
        os.killpg(pid, signal.SIGKILL)
 | 
			
		||||
        os.kill(pid, signal.SIGTERM)
 | 
			
		||||
        os.kill(pid, signal.SIGKILL)
 | 
			
		||||
        process.terminate()
 | 
			
		||||
        process.kill()
 | 
			
		||||
      except Exception as e:
 | 
			
		||||
        print("woops:{}".format(e))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _killBill():
 | 
			
		||||
  subprocess.run("ps --ppid 1 -fo pid,sess,ppid,cmd | grep 'toRedis.py' | while read pid sid other; do pkill -9 -s $sid; done", shell=True,executable='/bin/bash')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_info():
 | 
			
		||||
  print("""
 | 
			
		||||
Welcome to LJ playlist manager
 | 
			
		||||
 | 
			
		||||
Currently running on
 | 
			
		||||
 | 
			
		||||
IP      : {}
 | 
			
		||||
Port    : {}
 | 
			
		||||
Key     : {}
 | 
			
		||||
Scene   : {}
 | 
			
		||||
Laser   : {}
 | 
			
		||||
""".format(
 | 
			
		||||
  environ["REDIS_IP"],
 | 
			
		||||
  environ["REDIS_PORT"],
 | 
			
		||||
  environ["REDIS_KEY"],
 | 
			
		||||
  environ["REDIS_SCENE"],
 | 
			
		||||
  environ["REDIS_LASER"]
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_changeCommand( inc ):
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  global current_id
 | 
			
		||||
  if 0 == len(currentPlayList):
 | 
			
		||||
    _err("Empty playlist")
 | 
			
		||||
    return False
 | 
			
		||||
  current_id = (current_id + 1) % len(currentPlayList)
 | 
			
		||||
  return True
 | 
			
		||||
 | 
			
		||||
def action_match( k ):
 | 
			
		||||
    if int(k) > (len(currentPlayList) - 1):
 | 
			
		||||
      print( bcolors.HL + "This key does not exist" + bcolors.ENDC )
 | 
			
		||||
      return False
 | 
			
		||||
    else :
 | 
			
		||||
      current_id = int(k)
 | 
			
		||||
 | 
			
		||||
def action_runCommand():
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  global current_id
 | 
			
		||||
  global process
 | 
			
		||||
 | 
			
		||||
  # Get new command
 | 
			
		||||
  try:
 | 
			
		||||
    current_cmd = currentPlayList[current_id]
 | 
			
		||||
  except IndexError as e:
 | 
			
		||||
     _err("woops:{}".format(e))
 | 
			
		||||
     return False
 | 
			
		||||
 | 
			
		||||
  print("\n[!]New command:'{}'\n".format(current_cmd))
 | 
			
		||||
 | 
			
		||||
  # Start subprocess
 | 
			
		||||
  try :
 | 
			
		||||
      _kill(process)
 | 
			
		||||
      process = subprocess.Popen("./_run.sh '"+current_cmd+" | exports/toRedis.py -i $REDIS_IP -k $REDIS_KEY'", shell=True, executable='/bin/bash', stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,  env=environ, preexec_fn=os.setsid)
 | 
			
		||||
 | 
			
		||||
  except Exception as e:
 | 
			
		||||
      print("woops:{}".format(e))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_newCommand():
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  print("Enter new command or e(x)it.")
 | 
			
		||||
  k = input()
 | 
			
		||||
  # Exit early
 | 
			
		||||
  if "x" == k:
 | 
			
		||||
    return(False)
 | 
			
		||||
  currentPlayList.append(k)
 | 
			
		||||
  print(bcolors.OKBLUE + "Command added" + bcolors.ENDC)
 | 
			
		||||
  return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_deleteCommand():
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  print("Select sequence to delete or e(x)it.")
 | 
			
		||||
  action_listAll()
 | 
			
		||||
  key = int(input())
 | 
			
		||||
  # Exit early
 | 
			
		||||
  if "x" == k:
 | 
			
		||||
    return(False)
 | 
			
		||||
  del currentPlayList[key]
 | 
			
		||||
  return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_listAll():
 | 
			
		||||
  global currentPlayList, current_cmd
 | 
			
		||||
  print("\n--------------------------------------")
 | 
			
		||||
  for i,seq in enumerate(currentPlayList):
 | 
			
		||||
    pre=""
 | 
			
		||||
    suf=""
 | 
			
		||||
    if current_cmd == seq :
 | 
			
		||||
      pre     = bcolors.HL
 | 
			
		||||
      suf     = bcolors.ENDC
 | 
			
		||||
    print( pre + "{}\t{}".format(i,seq) + suf )
 | 
			
		||||
  print("--------------------------------------\n")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_help():
 | 
			
		||||
  global bindings
 | 
			
		||||
  print("\nKey\tAction\n--------------------------------------")
 | 
			
		||||
  for i in bindings:
 | 
			
		||||
    print(" {}\t{}".format(bindings[i],i))
 | 
			
		||||
  print("--------------------------------------\n")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_edit():
 | 
			
		||||
  print("Enter the command number to edit, or 'x' to abort.")
 | 
			
		||||
  k = intkey()
 | 
			
		||||
  if 'x' == k:
 | 
			
		||||
      return
 | 
			
		||||
  print("Enter the next value, or 'x' to abort.")
 | 
			
		||||
  value = input()
 | 
			
		||||
  if 'x' == value:
 | 
			
		||||
      return
 | 
			
		||||
  currentPlayList[k] = value
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_loadPlaylist():
 | 
			
		||||
 | 
			
		||||
  global playlistsDir
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  global current_playlist_name
 | 
			
		||||
  # list files
 | 
			
		||||
  i=0
 | 
			
		||||
  file_list = [x for x in playlistsDir.glob("*json")]
 | 
			
		||||
  if 0 == len(file_list ):
 | 
			
		||||
    print( bcolors.HL + "Error. No file in path '{}'\n".format(playlistsDir.name))
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
  print("\n Id\tName")
 | 
			
		||||
  for k,name in enumerate(file_list) :
 | 
			
		||||
    print(" {}\t{}".format(k,name),flush=True)
 | 
			
		||||
 | 
			
		||||
  # ask file
 | 
			
		||||
  print("\nChoose a file or e(x)it:")
 | 
			
		||||
  k = intkey()
 | 
			
		||||
  if '' == k:
 | 
			
		||||
    print("Invalid choice: '{}'".format(k))
 | 
			
		||||
    return
 | 
			
		||||
 | 
			
		||||
  # Exit early
 | 
			
		||||
  if "x" == k: return(False)
 | 
			
		||||
 | 
			
		||||
  # todo : helper for detecting invalid keys
 | 
			
		||||
  try:
 | 
			
		||||
    if k > (len(file_list) - 1):
 | 
			
		||||
      print( bcolors.HL + "This key '{}' does not exist".format(k) + bcolors.ENDC )
 | 
			
		||||
      return False
 | 
			
		||||
  except TypeError:
 | 
			
		||||
      print( bcolors.HL + "This key '{}' is not valid".format(k) + bcolors.ENDC )
 | 
			
		||||
      return False
 | 
			
		||||
 | 
			
		||||
  # Load file
 | 
			
		||||
  playlistFile = Path("./playlists/"+file_list[k].name)
 | 
			
		||||
  currentPlayList = json.loads(playlistFile.read_text())
 | 
			
		||||
  current_playlist_name = file_list[k].name
 | 
			
		||||
  current_id = 0
 | 
			
		||||
  print( bcolors.OKBLUE + "Playlist loaded: {}\n".format(current_playlist_name)+ bcolors.ENDC)
 | 
			
		||||
  return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_newPlaylist():
 | 
			
		||||
  global playlistsDir
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  # ask for name
 | 
			
		||||
  print("Enter new playlist name (without.json) or e(x)it question?")
 | 
			
		||||
  k = input()
 | 
			
		||||
 | 
			
		||||
  # Exit early
 | 
			
		||||
  if "x" == k:
 | 
			
		||||
    return(False)
 | 
			
		||||
 | 
			
		||||
  # save file
 | 
			
		||||
  currentPlayList = []
 | 
			
		||||
  _savePlaylist( k+".json" )
 | 
			
		||||
  currentPlayList = []
 | 
			
		||||
 | 
			
		||||
  pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _savePlaylist( playlistname ):
 | 
			
		||||
  global currentPlayList
 | 
			
		||||
  filepath = Path("playlists/{}".format(playlistname))
 | 
			
		||||
  with filepath.open("w", encoding ="utf-8") as f:
 | 
			
		||||
      f.write(json.dumps(currentPlayList, indent=4, sort_keys=True))
 | 
			
		||||
  return(True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_savePlaylist( name=False ):
 | 
			
		||||
  global current_playlist_name
 | 
			
		||||
  playlist_name = name if name else current_playlist_name
 | 
			
		||||
  if not playlist_name :
 | 
			
		||||
    _err("No name found.")
 | 
			
		||||
    return False
 | 
			
		||||
  try:
 | 
			
		||||
     _savePlaylist(playlist_name)
 | 
			
		||||
     print( bcolors.OKBLUE + "\nSaved as '{}'.\n".format(playlist_name) + bcolors.ENDC)
 | 
			
		||||
  except Exception as e:
 | 
			
		||||
      print("woops:{}".format(e))
 | 
			
		||||
      return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_commandHelp():
 | 
			
		||||
  global playlistsDir
 | 
			
		||||
 | 
			
		||||
  # iterate through files
 | 
			
		||||
  file_list=[]
 | 
			
		||||
  for folder in ["generators","filters","exports"]:
 | 
			
		||||
    p = Path("./"+folder)
 | 
			
		||||
    for plFile in Path("./"+folder).iterdir() :
 | 
			
		||||
      if re.match("^.*py$",plFile.name):
 | 
			
		||||
        file_list.append(os.path.join(folder,plFile.name))
 | 
			
		||||
  print("\n Id\tFile")
 | 
			
		||||
  for k,filename in  enumerate(file_list):
 | 
			
		||||
    print(" {}\t{}".format(k,filename))
 | 
			
		||||
  print("\nChoose a file:")
 | 
			
		||||
  k = int(input())
 | 
			
		||||
  print("\n-----------------------------------------------\n")
 | 
			
		||||
  subprocess.run("python3 "+file_list[k]+" -h", shell=True, executable='/bin/bash')
 | 
			
		||||
  print("\n-----------------------------------------------\n")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _setKey( laser=0, scene=0 ):
 | 
			
		||||
  global environ
 | 
			
		||||
  laser = laser if laser else environ["REDIS_LASER"]
 | 
			
		||||
  scene = scene if scene else environ["REDIS_SCENE"]
 | 
			
		||||
  new_key                   = "/pl/{}/{}".format(scene,laser)
 | 
			
		||||
  environ["REDIS_KEY"]      = new_key
 | 
			
		||||
  print("Sending new key '{}'".format(new_key))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_laserId():
 | 
			
		||||
  k = int(ask("Enter the LJ Laser id [0-3]"))
 | 
			
		||||
  _setKey( laser = k )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_laserScene():
 | 
			
		||||
  k = int(ask("Enter the LJ Scene id [0-3]"))
 | 
			
		||||
  _setKey( scene = k )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_killPid():
 | 
			
		||||
  print("Enter pid to kill")
 | 
			
		||||
  kill_pid = input()
 | 
			
		||||
  subprocess.run("pkill -9 -s $(awk '{print $6}' /proc/$kill_pid/stat)", shell=True,executable='/bin/bash', env={"kill_pid":kill_pid})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def action_quit():
 | 
			
		||||
    print("Quit [Y/n]?")
 | 
			
		||||
    quit = inkey()
 | 
			
		||||
    if quit != "n":
 | 
			
		||||
        _kill(process)
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
environ = {
 | 
			
		||||
#  "REDIS_IP"    : "127.0.0.1",
 | 
			
		||||
  "REDIS_IP"      : "192.168.2.44",
 | 
			
		||||
  "REDIS_PORT"    : "6379",
 | 
			
		||||
  "REDIS_KEY"     : "/pl/0/0",
 | 
			
		||||
  "REDIS_SCENE"   : "0",
 | 
			
		||||
  "REDIS_LASER"   : "0"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								clitools/runner_midi.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								clitools/runner_midi.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
import os
 | 
			
		||||
import signal
 | 
			
		||||
import subprocess
 | 
			
		||||
import time
 | 
			
		||||
import tty,termios
 | 
			
		||||
import re
 | 
			
		||||
import json
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import runner_lib as runner
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user