ladish/ladish_control

291 lines
11 KiB
Python
Executable File

#!/usr/bin/env python
#
# LADI Session Handler (ladish)
#
# Copyright (C) 2008, 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
#
#*************************************************************************
# This file contains code of the commandline control app
#*************************************************************************
#
# LADI Session Handler is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LADI Session Handler is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LADI Session Handler. If not, see <http://www.gnu.org/licenses/>
# or write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
service_name = 'org.ladish'
control_object_path = "/org/ladish/Control"
studio_object_path = "/org/ladish/Studio"
control_interface_name = 'org.ladish.Control'
studio_interface_name = 'org.ladish.Studio'
import sys
import os
import time
from traceback import print_exc
import dbus
def bool_convert(str_value):
if str_value.lower() == "false":
return False
if str_value.lower() == "off":
return False
if str_value.lower() == "no":
return False
if str_value == "0":
return False
if str_value.lower() == "(null)":
return False
return bool(str_value)
def dbus_type_to_python_type(dbus_value):
if type(dbus_value) == dbus.Boolean:
return bool(dbus_value)
if type(dbus_value) == dbus.Int32 or type(dbus_value) == dbus.UInt32:
return int(dbus_value)
return dbus_value
def dbus_type_to_type_string(dbus_value):
if type(dbus_value) == dbus.Boolean:
return "bool"
if type(dbus_value) == dbus.Int32:
return "sint"
if type(dbus_value) == dbus.UInt32:
return "uint"
if type(dbus_value) == dbus.Byte:
return "char"
if type(dbus_value) == dbus.String:
return "str"
return None # throw exception here?
def dbus_typesig_to_type_string(type_char):
type_char = str(type_char)
if type_char == 'i':
return "sint"
if type_char == 'u':
return "uint"
if type_char == 'y':
return "char"
if type_char == 's':
return "str"
if type_char == 'b':
return "bool"
print('unknown dbus typesig')
return None # throw exception here?
def main():
if len(sys.argv) == 1:
print("Usage: %s [command] [command] ..." % os.path.basename(sys.argv[0]))
print("Commands:")
print(" exit - exit ladish dbus service")
print(" slist - list studios")
print(" alist - list apps")
print(" sload <studioname> - load studio")
print(" sdel <studioname> - delete studio")
print(" snew [studioname] - new studio")
print(" sisloaded - is studio loaded?")
print(" sname - get studio name")
print(" ssave - save studio")
print(" sunload - unload studio")
print(" srename <studioname> - rename studio")
print(" sstart - start studio")
print(" sstop - stop studio")
print(" rtlist - list room templates")
print(" rtdel <roomtemplatename> - delete room template")
print(" rtnew <roomtemplatename> - create new room template")
print(" snewroom <rname> <rtname> - create new studio room")
print(" srlist - list studio rooms")
print(" sdelroom <rname> - delete studio room")
sys.exit(0)
bus = dbus.SessionBus()
control_obj = None
studio_obj = None
# check arguments
index = 1
while index < len(sys.argv):
arg = sys.argv[index]
index += 1
try:
if not control_obj:
control_obj = bus.get_object(service_name, control_object_path)
control_iface = dbus.Interface(control_obj, control_interface_name)
if arg == "exit":
print("--- exit")
control_iface.Exit()
time.sleep(1)
# we have deactivated the object and we need to get new connection if there are more commands
control_obj = None
control_iface = None
elif arg == 'slist':
print("--- studio list")
for studio in control_iface.GetStudioList():
name = studio[0]
mtime = studio[1]['Modification Time']
print('"%s" last modified on %s' % (name, time.ctime(mtime)))
elif arg == 'alist':
print("--- app list")
for app in control_iface.GetApplicationList():
print(app)
elif arg == 'sload':
print("--- studio load")
if index >= len(sys.argv):
print("load studio command requires studio name argument")
sys.exit()
arg = sys.argv[index]
index += 1
open_options = {}
#open_options["option1"] = "asd"
#open_options["option2"] = True
control_iface.LoadStudio(arg, open_options)
elif arg == 'sdel':
print("--- studio delete")
if index >= len(sys.argv):
print("delete studio command requires studio name argument")
sys.exit()
arg = sys.argv[index]
index += 1
control_iface.DeleteStudio(arg)
elif arg == 'snew':
print("--- studio new")
name = ""
if index < len(sys.argv):
name = sys.argv[index]
index += 1
control_iface.NewStudio(name)
elif arg == 'sisloaded':
print("--- studio is loaded")
if control_iface.IsStudioLoaded():
print("yes")
else:
print("no")
elif arg == 'rtlist':
print("--- list room templates")
for studio in control_iface.GetRoomTemplateList():
name = studio[0]
print('"%s"' % name)
elif arg == 'rtnew':
print("--- create new room template")
if index >= len(sys.argv):
print("create new room template command requires room template name argument")
sys.exit()
arg = sys.argv[index]
index += 1
control_iface.CreateRoomTemplate(arg)
elif arg == 'rtdel':
print("--- delete room template")
if index >= len(sys.argv):
print("delete room template command requires room template name argument")
sys.exit()
arg = sys.argv[index]
index += 1
control_iface.DeleteRoomTemplate(arg)
else:
if not studio_obj:
studio_obj = bus.get_object(service_name, studio_object_path)
studio_iface = dbus.Interface(studio_obj, studio_interface_name)
if arg == 'sname':
print("--- studio get name")
print("\"%s\"" % studio_iface.GetName())
elif arg == 'ssave':
print("--- studio save")
studio_iface.Save()
elif arg == 'sunload':
print("--- studio unload")
studio_iface.Unload()
studio_obj = None
studio_iface = None
elif arg == 'srename':
print("--- studio rename")
if index >= len(sys.argv):
print("rename studio command requires studio name argument")
sys.exit()
arg = sys.argv[index]
index += 1
studio_iface.Rename(arg)
elif arg == 'sstart':
print("--- studio start")
studio_iface.Start()
elif arg == 'sstop':
print("--- studio stop")
studio_iface.Stop()
elif arg == 'snewroom':
print("--- create new studio room")
if index + 1 >= len(sys.argv):
print("creation of studio room requires room name and room template name arguments")
sys.exit()
room_name = sys.argv[index]
index += 1
room_template_name = sys.argv[index]
index += 1
studio_iface.CreateRoom(room_name, room_template_name)
elif arg == 'srlist':
print("--- list studio rooms")
for room in studio_iface.GetRoomList():
#print repr(room)
opath = room[0]
name = room[1]["name"]
if room[1].has_key("template"):
template = str(room[1]["template"])
else:
template = None
if template:
print('"%s" from template "%s" (%s)' % (name, template, opath))
else:
print('"%s" (%s)' % (name, opath))
elif arg == 'sdelroom':
print("--- delete studio room")
if index >= len(sys.argv):
print("delete studio room command requires room name argument")
sys.exit()
arg = sys.argv[index]
index += 1
studio_iface.DeleteRoom(arg)
else:
print("Unknown command '%s'" % arg)
except dbus.DBusException, e:
print("DBus exception: %s" % str(e))
if __name__ == '__main__':
main()