LJ/plugins.py
2019-03-10 23:06:04 +01:00

182 lines
4.6 KiB
Python

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
# -*- mode: Python -*-
'''
LJ Laser Server v0.8.1
Plugins Handler.
'''
from OSC import OSCServer, OSCClient, OSCMessage
from websocket_server import WebsocketServer
import gstt
import os
import subprocess
import sys
def Init(wserver):
global WSserver
WSserver = wserver
def sendWSall(message):
#if gstt.debug >0:
#print("WS sending %s" % (message))
WSserver.send_message_to_all(message)
# What is plugin's OSC port ?
def Port(name):
data = gstt.plugins.get(name)
return data.get("OSC")
# How to start the plugin ?
def Command(name):
data = gstt.plugins.get(name)
return data.get("command")
# Get all plugin current state
def Data(name):
return gstt.plugins.get(name)
def Start(name):
# get Plugin configuration.
command = Command(name)
# Maybe it's not fully started
data = Data(name)
if command != "" and "pid" not in data :
sendWSall("/status Starting...")
# Get LJ path
ljpath = r'%s' % os.getcwd().replace('\\','/')
print ""
print "Starting plugin :", name
print "LJ path :", ljpath
# Construct the command with absolute path.
PluginPath = command.split(" ")
# Launch as a subprocess
PluginProcess = subprocess.Popen([PluginPath[0], ljpath + "/" + PluginPath[1]])
print "New process pid for ", name, ":", PluginProcess.pid
data = Data(name)
data["pid"] = PluginProcess.pid
data["process"] = PluginProcess
# Process can be terminated with :
# PluginProcess.terminate()
def OSCsend(name, oscaddress, oscargs =''):
PluginPort = Port(name)
sendWSall("/status Checking "+ name + "...")
if gstt.debug >0:
print ""
print "Checking plugin ",name, "..."
print "Plugin ", name, "is at", gstt.LjayServerIP, "and has OSC port : " + str(PluginPort)
print "Sending", oscaddress, oscargs,"to plugin ", name
osclientplugin = OSCClient()
osclientplugin.connect((gstt.LjayServerIP, PluginPort))
oscmsg = OSCMessage()
oscmsg.setAddress(oscaddress)
oscmsg.append(oscargs)
try:
osclientplugin.sendto(oscmsg, (gstt.LjayServerIP, PluginPort))
oscmsg.clearData()
if gstt.debug >0:
print oscaddress, oscargs, "was sent to",name
return True
except:
print ""
print 'Connection to plugin IP', gstt.LjayServerIP ,'port', PluginPort,' refused : died ?'
#sendWSall("/status No plugin.")
sendWSall("/status No plugin.")
#PluginStart(name)
return False
def Ping(name):
return OSCsend(name,"/ping")
def Kill(name):
data = Data(name)
print ""
if data["process"] != None:
print name, "plugin is owned by LJ."
print "Killing plugin", name
OSCsend(name,"/quit")
#data["process"].terminate()
sendWSall("/status Killing "+ name +".")
else:
print "Killing asked but plugin is not owned by LJ"
sendWSall("/status Not own plugin")
# Send a command to given plugin. Will also start it if command contain /start 1
def Send(name,oscpath):
if oscpath[0].find(name) != -1:
# Plugin is online ?
if Ping(name):
# Light up the plugin button
sendWSall("/" + name + "/start 1")
sendWSall("/status " + name + " online")
if gstt.debug >0:
print "Plugin " + name + " online."
print "Command", oscpath
# If start 0, try to kill plugin
if oscpath[0].find("start") != -1 and oscpath[1] == "0":
if gstt.debug >0:
print "start 0, so killing", name, "..."
Kill(name)
# Send osc command
elif len(oscpath) == 1:
OSCsend(name,oscpath[0], oscargs='noargs')
else:
OSCsend(name,oscpath[0], oscargs=oscpath[1])
return True
# Plugin not online..
else:
if gstt.debug >0:
print "Plugin " + name + " offline."
print "Command", oscpath
sendWSall("/status Plugin " + name + " offline")
sendWSall("/"+ name + "/start 0")
# Try to Start it if /start 1
if oscpath[0].find("start") != -1 and oscpath[1] == "1":
if gstt.debug >0:
print "Trying to start", name, "..."
Start(name)
return False