Repository URL to install this package:
|
Version:
5.0-r2 ▾
|
enigma2-plugin-extensions-userscripts
/
usr
/
lib
/
enigma2
/
python
/
Plugins
/
Extensions
/
UserScripts
/
UserScripts.py
|
|---|
from __future__ import print_function
from __future__ import division
#
# User Scripts Plugin (c) gutemine
#
import sys
import gm
userscripts_version = gm.version()
import gettext
from Components.ActionMap import ActionMap, HelpableActionMap
import Screens.Standby
from os import (
path as os_path,
listdir as os_listdir,
mkdir as os_mkdir,
remove as os_remove,
environ as os_environ,
)
from RecordTimer import RecordTimerEntry
from Components.ScrollLabel import ScrollLabel
from enigma import eSize, eConsoleAppContainer, eTimer
from Plugins.Plugin import PluginDescriptor
from Components.config import KEY_OK, KEY_NUMBERS
from Components.ConfigList import ConfigListScreen, ConfigList
from Components.config import (
config,
configfile,
ConfigSubsection,
ConfigText,
ConfigBoolean,
ConfigInteger,
ConfigSelection,
ConfigYesNo,
getConfigListEntry,
)
from Components.MenuList import MenuList
from Components.Pixmap import Pixmap
from Components.Label import Label
from Components.Input import Input
from Screens.ChoiceBox import ChoiceBox
from Screens.InputBox import InputBox
if os_path.exists("/var/lib/dpkg/status"):
from Screens.InfoBarGenerics import InfoBarAutoSleepTimer
from Screens.MessageBox import MessageBox
from Screens.Screen import Screen
from Screens.HelpMenu import HelpableScreen
from enigma import quitMainloop, eActionMap, getDesktop
if os_path.exists("/var/lib/dpkg/status"):
from enigma import eNetworkManager
userscripts_plugindir = "/usr/lib/enigma2/python/Plugins/Extensions/UserScripts"
userscripts_path = "/usr/script"
data_userscripts_path = "/data/script"
global userscripts_first
userscripts_first = True
userscripts_log = "/tmp/userscripts.log"
sz_w = getDesktop(0).size().width()
sz_h = getDesktop(0).size().height()
os_environ["LANGUAGE"] = "en"
userscripts_language = "en"
REDC = "\033[31m"
ENDC = "\033[m"
def cprint(text):
print(REDC + "[USERSCRIPTS] " + text + ENDC)
if os_path.exists("/etc/enigma2/settings") == True:
f = open("/etc/enigma2/settings")
line = f.readline()
while line:
line = f.readline().replace("\n", "")
sp = line.split("=")
if sp[0] == "config.osd.language":
sp2 = sp[1].split("_")
userscripts_language = sp2[0]
if (
os_path.exists(
"%s/locale/%s" % (userscripts_plugindir, userscripts_language)
)
== True
):
os_environ["LANGUAGE"] = sp[1]
else:
os_environ["LANGUAGE"] = "en"
f.close
if (
os_path.exists("%s/locale/%s" % (userscripts_plugindir, userscripts_language))
== True
):
_ = gettext.Catalog("userscripts", "%s/locale" % userscripts_plugindir).gettext
else:
pass
yes_no_descriptions = {False: _("no"), True: _("yes")}
config.plugins.userscripts = ConfigSubsection()
userscript_inactivity_options = []
userscript_inactivity_options.append(("standby", _("Standby")))
userscript_inactivity_options.append(("idlemode", _("Idle Mode")))
config.usage.inactivity_action = ConfigSelection(
default="standby", choices=userscript_inactivity_options
)
config.plugins.userscripts.confirm = ConfigBoolean(
default=False, descriptions=yes_no_descriptions
)
config.plugins.userscripts.scriptsave = ConfigBoolean(
default=False, descriptions=yes_no_descriptions
)
userscriptlist_options = []
userscriptlist_options.append(("none", _("none")))
userscriptlist_options.append(("execute", _("Execute")))
userscriptlist_options.append(("install", _("Install")))
userscriptlist_options.append(("both", _("Execute") + " & " + _("Install")))
config.plugins.userscripts.list = ConfigSelection(
default="none", choices=userscriptlist_options
)
userscriptshow_options = []
userscriptshow_options.append(("plugin", _("Pluginlist")))
userscriptshow_options.append(("extension", _("Extension")))
userscriptshow_options.append(("both", _("Pluginlist") + " & " + _("Extension")))
config.plugins.userscripts.show = ConfigSelection(
default="both", choices=userscriptshow_options
)
config.plugins.userscripts.startupdelay = ConfigInteger(default=2, limits=(0, 60))
config.plugins.userscripts.sdcard = ConfigBoolean(
default=False, descriptions=yes_no_descriptions
)
config.plugins.userscripts.leaving = ConfigBoolean(
default=True, descriptions=yes_no_descriptions
)
def shutdown_userscripts(self, aborted):
cprint("InfoBarAutoSleepTimer.shutdown")
if aborted or Screens.Standby.inTryQuitMainloop:
cprint("aborted")
self.keypress(None, 1) # restart the timer
return
if not Screens.Standby.inStandby is None:
if config.usage.inactivity_action.value == "standby":
cprint("RecordTimer.TryQuitMainloop")
RecordTimerEntry.TryQuitMainloop(True)
else:
cprint("already Screens.Standby.Standby")
else:
if config.usage.inactivity_action.value == "idlemode":
cprint("Screens.Standby.TryQuitMainloop")
self.session.open(Screens.Standby.Standby)
else:
cprint("Screens.Standby.Standby")
self.session.open(Screens.Standby.TryQuitMainloop, 1)
if os_path.exists("/var/lib/dpkg/status"):
Screens.InfoBarGenerics.InfoBarAutoSleepTimer.shutdown = shutdown_userscripts
# let's have our own Console with logging ...
class Console(Screen):
# TODO move this to skin.xml
if sz_w == 2560:
skin = """
<screen position="200,200" size="1100,800" title="Command execution..." >
<widget name="text" position="0,0" size="1100,800" font="Console;28" />
</screen>"""
elif sz_w == 1920:
skin = """
<screen position="150,150" size="800,600" title="Command execution..." >
<widget name="text" position="0,0" size="800,600" font="Console;20" />
</screen>"""
else:
skin = """
<screen position="100,100" size="550,400" title="Command execution..." >
<widget name="text" position="0,0" size="550,400" font="Console;14" />
</screen>"""
def __init__(
self,
session,
title="Console",
cmdlist=None,
finishedCallback=None,
closeOnSuccess=False,
logfile=None,
):
Screen.__init__(self, session)
self.finishedCallback = finishedCallback
self.closeOnSuccess = closeOnSuccess
self["text"] = ScrollLabel("")
self["actions"] = ActionMap(
["WizardActions", "DirectionActions"],
{
"ok": self.cancel,
"back": self.cancel,
"up": self["text"].pageUp,
"down": self["text"].pageDown,
},
-1,
)
self.cmdlist = cmdlist
self.newtitle = title
self.logfile = logfile
self.onShown.append(self.updateTitle)
self.container = eConsoleAppContainer()
self.run = 0
if os_path.exists("/var/lib/dpkg/status"):
self.appClosed_conn = self.container.appClosed.connect(self.runFinished)
self.dataAvail_conn = self.container.dataAvail.connect(self.dataAvail)
else:
self.container.appClosed.append(self.runFinished)
self.container.dataAvail.append(self.dataAvail)
# dont start before gui is finished
self.onLayoutFinish.append(self.startRun)
def updateTitle(self):
self.setTitle(self.newtitle)
def startRun(self):
self["text"].setText(_("Execution Progress:") + "\n\n")
if not self.logfile is None:
if os_path.exists(self.logfile):
os_remove(self.logfile)
self.output = open(self.logfile, "w")
cprint(
"console: executing in run %s the command: %s"
% (self.run, self.cmdlist[self.run])
)
# start of container application failed...
if self.container.execute(self.cmdlist[self.run]):
self.runFinished(-1) # so we must call runFinished manual
def runFinished(self, retval):
self.run += 1
if self.run != len(self.cmdlist):
# start of container application failed...
if self.container.execute(self.cmdlist[self.run]):
self.runFinished(-1) # so we must call runFinished manual
else:
str = self["text"].getText()
str += _("Execution finished!!")
self["text"].setText(str)
self["text"].lastPage()
if not self.finishedCallback is None:
self.finishedCallback()
if not retval and self.closeOnSuccess:
self.cancel()
def cancel(self):
if self.run == len(self.cmdlist):
if not self.logfile is None:
self.output.close()
self.close()
if os_path.exists("/var/lib/dpkg/status"):
self.appClosed_conn = None
self.dataAvail_conn = None
def dataAvail(self, strRec):
message = self["text"].getText()
try:
message = message + strRec
except:
message = message + strRec.decode("utf-8")
self["text"].setText(str(message))
if not self.logfile is None:
self.output.write(str(message))
class UserScriptsStartup(Screen):
def __init__(self, session):
self.session = session
Screen.__init__(self, session)
try:
if config.plugins.userscripts.startupdelay.value > 0:
cprint("doing autostart")
self.TimerUserScriptsDoStartup = eTimer()
self.TimerUserScriptsDoStartup.stop()
if os_path.exists("/var/lib/dpkg/status"):
self.TimerUserScriptsDoStartup_conn = (
self.TimerUserScriptsDoStartup.timeout.connect(
self.UserScriptsExecuteStartup
)
)
else:
self.TimerUserScriptsDoStartup.callback.append(
self.UserScriptsExecuteStartup
)
self.TimerUserScriptsDoStartup.start(
config.plugins.userscripts.startupdelay.value * 1000, True
)
else:
cprint("autostart disabled")
except:
pass
def UserScriptsExecuteStartup(self):
self.UserStartupScripts = []
if os_path.exists(userscripts_path):
for script in os_listdir(userscripts_path):
if script.startswith("S"):
self.UserStartupScripts.append(
"%s/%s start" % (userscripts_path, script)
)
if os_path.exists(data_userscripts_path):
for script in os_listdir(data_userscripts_path):
if script.startswith("S"):
self.UserStartupScripts.append(
"%s/%s start" % (data_userscripts_path, script)
)
self.UserStartupScripts.sort()
if len(self.UserStartupScripts) > 0:
cprint("starting %s" % self.UserStartupScripts)
self.TimerUserScriptsDoStartup.stop()
self.container = eConsoleAppContainer()
if os_path.exists("/var/lib/dpkg/status"):
self.container_appClosed_conn = self.container.appClosed.connect(
self.runNext
)
else:
self.container.appClosed.append(self.runNext)
cprint("is executing %s" % self.UserStartupScripts[0])
self.container.execute(self.UserStartupScripts[0].rstrip())
else:
cprint("no startup execution found")
def runNext(self, retval):
if len(self.UserStartupScripts) > 1:
self.UserStartupScripts.remove(self.UserStartupScripts[0])
cprint("is executing %s" % self.UserStartupScripts[0])
self.container.execute(self.UserStartupScripts[0].rstrip())
else:
cprint("startup execution finished")
class UserScriptsPlugin(Screen, HelpableScreen, ConfigListScreen):
if sz_w == 2560:
skin = """
<screen position="center,240" size="1640,780" title="User Script Plugin">
<widget name="logo" position="20,10" size="200,80" />
<widget backgroundColor="#9f1313" font="Regular;38" halign="center" name="buttonred" position="240,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget backgroundColor="#1f771f" font="Regular;38" halign="center" name="buttongreen" position="560,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget backgroundColor="#a08500" font="Regular;38" halign="center" name="buttonyellow" position="880,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget backgroundColor="#18188b" font="Regular;38" halign="center" name="buttonblue" position="1200,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget name="info" position="1530,10" size="80,40" alphatest="on" />
<widget name="menu" position="1530,50" size="80,40" alphatest="on" />
<eLabel position="20,100" size="1600,2" backgroundColor="grey" />
<widget name="config" position="20,120" size="1600,240" enableWrapAround="1" scrollbarMode="showOnDemand" />
</screen>"""
elif sz_w == 1920:
skin = """
<screen position="center,170" size="1200,280" title="User Script Plugin" >
<widget name="logo" position="20,10" size="150,60" />
<widget backgroundColor="#9f1313" font="Regular;30" halign="center" name="buttonred" position="190,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget backgroundColor="#1f771f" font="Regular;30" halign="center" name="buttongreen" position="425,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget backgroundColor="#a08500" font="Regular;30" halign="center" name="buttonyellow" position="660,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget backgroundColor="#18188b" font="Regular;30" halign="center" name="buttonblue" position="895,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget name="info" position="1135,10" size="60,30" alphatest="on" />
<widget name="menu" position="1135,40" size="60,30" alphatest="on" />
<eLabel backgroundColor="grey" position="20,80" size="1170,1" />
<widget enableWrapAround="1" name="config" position="20,90" scrollbarMode="showOnDemand" size="1170,180" />
</screen>"""
else:
skin = """
<screen position="center,120" size="820,190" title="User Script Plugin">
<widget name="logo" position="10,5" size="100,40" />
<widget backgroundColor="#9f1313" font="Regular;19" halign="center" name="buttonred" position="120,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget backgroundColor="#1f771f" font="Regular;19" halign="center" name="buttongreen" position="280,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget backgroundColor="#a08500" font="Regular;19" halign="center" name="buttonyellow" position="440,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget backgroundColor="#18188b" font="Regular;19" halign="center" name="buttonblue" position="600,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget name="info" position="765,5" size="40,20" alphatest="on" />
<widget name="menu" position="765,25" size="40,20" alphatest="on" />
<eLabel position="10,50" size="800,1" backgroundColor="grey" />
<widget name="config" position="10,60" size="800,120" enableWrapAround="1" scrollbarMode="showOnDemand" />
</screen>"""
def __init__(self, session):
Screen.__init__(self, session)
HelpableScreen.__init__(self)
self.skin = UserScriptsPlugin.skin
self.setup_title = _("User Script Plugin")
global userscripts_first
if not userscripts_first and config.plugins.userscripts.scriptsave.value:
cprint("using previous save value")
oldscript = config.plugins.userscripts.script.value
oldoption = config.plugins.userscripts.option.value
else:
oldscript = "none"
oldoption = "none"
if config.plugins.userscripts.scriptsave.value:
# let's check settings too
if os_path.exists("/etc/enigma2/settings") == True:
f = open("/etc/enigma2/settings")
line = f.readline()
while line:
line = f.readline().replace("\n", "")
sp = line.split("=")
if sp[0] == "config.plugins.userscripts.script":
oldscript = sp[1]
if sp[0] == "config.plugins.userscripts.option":
oldoption = sp[1]
f.close()
userscripts_first = False
config.plugins.userscripts.script = ConfigSelection(
default="none", choices=self.getscripts(True)
)
config.plugins.userscripts.option = ConfigSelection(
default="none", choices=self.getscriptoptions(True)
)
config.plugins.userscripts.kit = ConfigSelection(
default="none", choices=self.getkits(True)
)
config.plugins.userscripts.script.value = oldscript
config.plugins.userscripts.option.value = oldoption
self.list = []
ConfigListScreen.__init__(
self, self.list, session=self.session, on_change=self.changedEntry
)
self.createSetup()
self.onShown.append(self.setWindowTitle)
self.onLayoutFinish.append(self.byLayoutEnd)
self.OK = False
# explizit check on every entry
self.onChangedEntry = []
self.onConfigEntryChanged = []
self["buttonred"] = Label(_("Exit"))
self["buttongreen"] = Label(_("Execute"))
self["buttonyellow"] = Label(_("Install"))
self["buttonblue"] = Label(_("Setup"))
self["logo"] = Pixmap()
self["menu"] = Pixmap()
self["info"] = Pixmap()
self["ColorActions"] = HelpableActionMap(
self,
"ColorActions",
{
"green": (self.script, _("Execute")),
"red": (self.cancel, _("Exit")),
"yellow": (self.install, _("Installation")),
"blue": (self.config, _("Configuration")),
},
-5,
)
self["ChannelSelectEPGActions"] = HelpableActionMap(
self,
"ChannelSelectEPGActions",
{
"showEPGList": (self.logging, _("Script") + " " + _("Information")),
},
-4,
)
self["InfobarMenuActions"] = HelpableActionMap(
self,
"InfobarMenuActions",
{
"mainMenu": (self.config, _("Configuration")),
},
-4,
)
self["SetupActions"] = HelpableActionMap(
self,
"SetupActions",
{
"cancel": (self.cancel, _("Exit")),
"ok": (self.script, _("Execute")),
},
-5,
)
#
# for new RC use Audio key as Help key alternative
#
self["InfobarAudioSelectionActions"] = HelpableActionMap(
self,
"InfobarAudioSelectionActions",
{
"audioSelection": (self.audioPressed, _("Help")),
},
-3,
)
def audioPressed(self):
cprint("AUDIO pressed")
# Device Types
TYPE_STANDARD = "dreambox remote control (native)"
TYPE_ADVANCED = "dreambox advanced remote control (native)"
TYPE_KEYBOARD = "dreambox ir keyboard"
# Advanced remote or standard?
if config.misc.rcused.value == 0:
self.remotetype = TYPE_ADVANCED
else:
self.remotetype = TYPE_STANDARD
self.eam = eActionMap.getInstance()
# press the key with the desired flag
keycode = 138 # HELP key
cprint("NOW WRITES OUT: %i = HELP" % (keycode))
self.eam.keyPressed(self.remotetype, keycode, 0)
# release the key
self.eam.keyPressed(self.remotetype, keycode, 1)
def createSetup(self):
self.list = []
if config.plugins.userscripts.list.value != "both":
if (
config.plugins.userscripts.list.value != "execute"
and config.plugins.userscripts.list.value != "both"
):
self.list.append(
getConfigListEntry(
_("select User Script"), config.plugins.userscripts.script
)
)
self.list.append(
getConfigListEntry(
_("select User Script option"),
config.plugins.userscripts.option,
)
)
if (
config.plugins.userscripts.list.value != "install"
and config.plugins.userscripts.list.value != "both"
):
if os_path.exists("/var/lib/dpkg/status"):
message = _("select deb kit")
else:
message = _("select deb kit").replace("deb", "ipk")
self.list.append(
getConfigListEntry(message, config.plugins.userscripts.kit)
)
self["config"].list = self.list
self["config"].l.setList(self.list)
def changedEntry(self):
self.createSetup()
def setWindowTitle(self):
self["logo"].instance.setPixmapFromFile(
"%s/userscripts.png" % userscripts_plugindir
)
self["menu"].instance.setPixmapFromFile(gm.getpicon("menu"))
self["info"].instance.setPixmapFromFile(gm.getpicon("info"))
self.setTitle(_("User Script Plugin") + " %s" % userscripts_version)
def byLayoutEnd(self, status=None):
if sz_w == 2560:
w = 1640
if config.plugins.userscripts.list.value == "execute":
h = 200
elif config.plugins.userscripts.list.value == "install":
h = 260
elif config.plugins.userscripts.list.value == "none":
h = 400
else:
h = 120
elif sz_w == 1920:
w = 1200
if config.plugins.userscripts.list.value == "execute":
h = 160
elif config.plugins.userscripts.list.value == "install":
h = 200
elif config.plugins.userscripts.list.value == "none":
h = 300
else:
h = 80
else:
w = 820
if config.plugins.userscripts.list.value == "execute":
h = 100
elif config.plugins.userscripts.list.value == "install":
h = 130
elif config.plugins.userscripts.list.value == "none":
h = 200
else:
h = 60
self.instance.resize(eSize(*(w, h)))
self.createSetup()
def getscriptoptions(self, order):
userscripts_options = []
if order:
userscripts_options.append(("none", _("none")))
userscripts_options.append(("start", _("start")))
userscripts_options.append(("stop", _("stop")))
userscripts_options.append(("restart", _("restart")))
userscripts_options.append(("info", _("info")))
userscripts_options.append(("enable", _("enable autostart")))
userscripts_options.append(("disable", _("disable autostart")))
userscripts_options.append(
("enable & start", _("enable autostart") + " & " + _("start"))
)
userscripts_options.append(
("stop & disable", _("stop") + " & " + _("disable autostart"))
)
userscripts_options.append(("userdefined", _("userdefined:")))
# add further option here
# userscripts_options.append(( "dummy",_("dummy") ))
else:
userscripts_options.append((_("none"), "none"))
userscripts_options.append((_("start"), "start"))
userscripts_options.append((_("stop"), "stop"))
userscripts_options.append((_("restart"), "restart"))
userscripts_options.append((_("info"), "info"))
userscripts_options.append((_("enable autostart"), "enable"))
userscripts_options.append((_("disable autostart"), "disable"))
userscripts_options.append(
(_("start") + " & " + _("enable autostart"), "start & enable")
)
userscripts_options.append(
(_("stop") + " & " + _("disable autostart"), "stop & disable")
)
userscripts_options.append((_("userdefined:"), "userefined"))
# add further option here
# userscripts_options.append(( _("dummy"), "dummy" ))
return userscripts_options
def getlistoptions(self, order):
userscriptlist_options = []
if order:
userscriptlist_options.append(("none", _("none")))
userscriptlist_options.append(("execute", _("Execute")))
userscriptlist_options.append(("install", _("Install")))
userscriptlist_options.append(("both", _("Execute") + " & " + _("Install")))
else:
userscriptlist_options.append((_("none"), "none"))
userscriptlist_options.append((_("Execute"), "execute"))
userscriptlist_options.append((_("Install"), "install"))
userscriptlist_options.append((_("Execute") + " & " + _("Install"), "both"))
return userscriptlist_options
def getscripts(self, order):
userscripts = []
if order:
userscripts.append(("none", _("none")))
else:
userscripts.append((_("none"), "none"))
if os_path.exists(userscripts_path) is True:
for script in os_listdir(userscripts_path):
if script.endswith(".sh") and not script.startswith("."):
if order:
userscripts.append(
(
"%s/%s" % (userscripts_path, script),
script.replace(".sh", ""),
)
)
else:
userscripts.append(
(
script.replace(".sh", ""),
"%s/%s" % (userscripts_path, script),
)
)
if os_path.exists(data_userscripts_path) is True:
for script in os_listdir(data_userscripts_path):
if script.endswith(".sh") and not script.startswith("."):
if order:
userscripts.append(
(
"%s/%s" % (data_userscripts_path, script),
script.replace(".sh", ""),
)
)
else:
userscripts.append(
(
script.replace(".sh", ""),
"%s/%s" % (data_userscripts_path, script),
)
)
return userscripts
def getkits(self, order):
userkits = []
if os_path.exists("/var/lib/dpkg/status"):
extension = ".deb"
else:
extension = ".ipk"
if order:
userkits.append(("none", _("none")))
if os_path.exists("/var/lib/dpkg/status"):
userkits.append(("/tmp/*.deb", _("/tmp")))
userkits.append(("/data/*.deb", _("/data")))
else:
userkits.append(("/tmp/*.ipk", _("/tmp")))
userkits.append(("/data/*.ipk", _("/data")))
else:
userkits.append((_("none"), "none"))
if os_path.exists("/var/lib/dpkg/status"):
userkits.append((_("/tmp"), "/tmp/*.deb"))
userkits.append((_("/data"), "/data/*.deb"))
else:
userkits.append((_("/tmp"), "/tmp/*.ipk"))
userkits.append((_("/data"), "/data/*.ipk"))
for kitfile in os_listdir("/tmp"):
if kitfile.endswith(extension) is True:
if order:
userkits.append(("/tmp/%s" % kitfile, kitfile))
else:
userkits.append((kitfile, "/tmp/%s" % kitfile))
if not os_path.exists("/data"):
os_mkdir("/data")
for kitfile in os_listdir("/data"):
if kitfile.endswith(extension) is True:
if order:
userkits.append(("/data/%s" % kitfile, kitfile))
else:
userkits.append((kitfile, "/data/%s" % kitfile))
if os_path.exists("/media/hdd") is True:
for kitfile in os_listdir("/media/hdd"):
if kitfile.endswith(extension) is True:
if order:
userkits.append(("/media/hdd/%s" % kitfile, kitfile))
else:
userkits.append((kitfile, "/media/hdd/%s" % kitfile))
if os_path.exists("/media/hdd/backup") is True:
for kitfile in os_listdir("/media/hdd/backup"):
if kitfile.endswith(extension) is True:
if order:
userkits.append(("/media/hdd/backup/%s" % kitfile, kitfile))
else:
userkits.append((kitfile, "/media/hdd/backup/%s" % kitfile))
return userkits
def saving(self):
config.plugins.userscripts.script.save()
config.plugins.userscripts.leaving.save()
config.plugins.userscripts.option.save()
# doesn't make sense to save last kit and have it in the settings
config.plugins.userscripts.kit.value = "none"
config.plugins.userscripts.kit.save()
def leave(self):
self.saving()
self.close(True)
def leave2(self):
self.saving()
if config.plugins.userscripts.leaving.value:
self.close(True)
def cancel(self):
config.plugins.userscripts.script.cancel()
config.plugins.userscripts.option.cancel()
self.close(False)
def config(self):
self.session.openWithCallback(self.byLayoutEnd, UserScriptsConfiguration)
def logging(self):
if os_path.exists(userscripts_log):
cmd = "cat %s" % userscripts_log
self.session.open(Console, userscripts_log, [cmd])
else:
self.session.open(
MessageBox, _("none") + " " + userscripts_log, MessageBox.TYPE_ERROR
)
def script(self):
if (
config.plugins.userscripts.list.value == "execute"
or config.plugins.userscripts.list.value == "both"
):
options = self.getscripts(False)
select = 0
i = 0
for option in options:
cprint("option: %s" % option[1])
if option[1] == config.plugins.userscripts.script.value:
select = i
i = i + 1
self.session.openWithCallback(
self.doscript, ChoiceBox, _("select User Script"), options, None, select
)
else:
self.doscript2(config.plugins.userscripts.script.value)
def doscript(self, scriptname):
if scriptname is None or scriptname[0] == "none" or scriptname[1] == "none":
self.skipscript(_("script is none"))
else:
self.scriptname = scriptname[1]
options = self.getscriptoptions(False)
select = 0
i = 0
for option in options:
cprint("option: %s" % option[1])
if option[1] == config.plugins.userscripts.option.value:
select = i
i = i + 1
self.session.openWithCallback(
self.dooption,
ChoiceBox,
_("select User Script option"),
options,
None,
select,
)
def dooption(self, scriptoption):
if scriptoption == None:
self.skipscript(_("option is none"))
else:
if scriptoption == "none":
self.option = ""
else:
self.option = scriptoption[1]
if self.option == "userdefined":
self.option = "restart"
self.session.openWithCallback(
self.enteroption,
InputBox,
title=_("Please enter option for %s") % self.scriptname,
text="%s " % self.option,
maxSize=35,
type=Input.TEXT,
)
else:
if config.plugins.userscripts.confirm.value:
self.session.openWithCallback(
self.execute,
MessageBox,
_("are you sure to %s %s ?") % (self.scriptname, self.option),
MessageBox.TYPE_YESNO,
)
else:
self.execute(True)
def doscript2(self, scriptname):
if scriptname == "none":
self.skipscript(_("no user script selected"))
else:
self.scriptname = scriptname
self.option = config.plugins.userscripts.option.value
if self.option == "none":
self.option = ""
if config.plugins.userscripts.confirm.value:
self.session.openWithCallback(
self.execute,
MessageBox,
_("are you sure to %s %s ?") % (self.scriptname, self.option),
MessageBox.TYPE_YESNO,
)
else:
self.execute(True)
elif self.option == "userdefined":
self.option = "restart"
self.session.openWithCallback(
self.enteroption,
InputBox,
title=_("Please enter option for %s") % self.scriptname,
text="%s " % self.option,
maxSize=35,
type=Input.TEXT,
)
else:
if config.plugins.userscripts.confirm.value:
self.session.openWithCallback(
self.execute,
MessageBox,
_("are you sure to %s %s ?") % (self.scriptname, self.option),
MessageBox.TYPE_YESNO,
)
else:
self.execute(True)
def enteroption(self, option):
if option is None:
self.skipscript(_("option is none"))
else:
self.option = option.rstrip()
if config.plugins.userscripts.confirm.value:
self.session.openWithCallback(
self.execute,
MessageBox,
_("are you sure to %s %s ?") % (self.scriptname, self.option),
MessageBox.TYPE_YESNO,
)
else:
self.execute(True)
def execute(self, answer):
if answer is None:
self.skipscript(_("answer is None"))
elif answer is False:
self.skipscript(_("you were not confirming"))
else:
title = _("executing User Script %s %s" % (self.scriptname, self.option))
if self.option.find("&") != -1:
options = []
options = self.option.split("&")
# print options[0].rstrip().lstrip()
# print options[1].rstrip().lstrip()
cmd = "%s %s; %s %s" % (
self.scriptname,
options[0],
self.scriptname,
options[1],
)
else:
cmd = "%s %s" % (self.scriptname, self.option)
cprint("command %s" % cmd)
if config.plugins.userscripts.scriptsave.value:
config.plugins.userscripts.script.value = self.scriptname
config.plugins.userscripts.option.value = self.option
self.session.openWithCallback(
self.leave2, Console, _(title), [cmd], None, False, userscripts_log
)
else:
self.session.openWithCallback(
self.cancel, Console, _(title), [cmd], None, False, userscripts_log
)
def skipscript(self, reason):
self.session.open(
MessageBox,
_("User Script was canceled, because %s") % reason,
MessageBox.TYPE_ERROR,
)
def install(self):
if (
config.plugins.userscripts.list.value == "install"
or config.plugins.userscripts.list.value == "both"
):
options = self.getkits(False)
if os_path.exists("/var/lib/dpkg/status"):
message = _("select deb kit")
else:
message = _("select deb kit").replace("deb", "ipk")
self.session.openWithCallback(self.doinstall, ChoiceBox, message, options)
else:
self.doinstall2(config.plugins.userscripts.kit.value)
def doinstall(self, userscriptkit):
if (
userscriptkit is None
or userscriptkit[0] == "none"
or userscriptkit[1] == "none"
):
self.skipinstall(_("no kit selected"))
else:
self.kit = userscriptkit[1]
if config.plugins.userscripts.confirm.value:
self.session.openWithCallback(
self.debinstall,
MessageBox,
_("install %s ?") % self.kit,
MessageBox.TYPE_YESNO,
)
else:
self.debinstall(True)
def doinstall2(self, userscriptkit):
if userscriptkit == "none":
self.skipinstall(_("no kit selected"))
else:
self.kit = userscriptkit
if config.plugins.userscripts.confirm.value:
self.session.openWithCallback(
self.debinstall,
MessageBox,
_("install %s ?") % self.kit,
MessageBox.TYPE_YESNO,
)
else:
self.debinstall(True)
def skipinstall(self, reason):
message = _("deb install was canceled, because %s") % reason
if not os_path.exists("/var/lib/dpkg/status"):
message = message.replace("deb", "ipk")
self.session.open(MessageBox, message, MessageBox.TYPE_ERROR)
def debinstall(self, answer):
if answer is None:
self.skipinstall(_("answer is None"))
elif answer is False:
self.skipinstall(_("you were not confirming"))
else:
title = _("installing %s" % (self.kit))
if os_path.exists("/var/lib/dpkg/status"):
cmd = (
"apt-get update; dpkg -i %s; apt-get install -f -y --force-yes"
% (self.kit)
)
else:
if os_path.exists("/run/opkg.lock"):
os_remove("/run/opkg.lock")
cmd = "opkg install %s" % (self.kit)
self.session.open(Console, _(title), [cmd], None, False, userscripts_log)
class UserScriptsConfiguration(Screen, ConfigListScreen):
if sz_w == 2560:
skin = """
<screen position="center,240" size="1640,780" title="User Script Plugin">
<widget name="logo" position="20,10" size="200,80" />
<widget backgroundColor="#9f1313" font="Regular;38" halign="center" name="buttonred" position="240,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget backgroundColor="#1f771f" font="Regular;38" halign="center" name="buttongreen" position="560,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget backgroundColor="#a08500" font="Regular;38" halign="center" name="buttonyellow" position="880,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget backgroundColor="#18188b" font="Regular;38" halign="center" name="buttonblue" position="1200,10" foregroundColor="white" shadowColor="black" shadowOffset="-3,-3" size="300,80" valign="center" />
<widget name="info" position="1530,10" size="80,40" alphatest="on" />
<widget name="menu" position="1530,50" size="80,40" alphatest="on" />
<eLabel position="20,100" size="1600,2" backgroundColor="grey" />
<widget name="config" position="20,120" size="1600,640" enableWrapAround="1" scrollbarMode="showOnDemand" />
</screen>"""
elif sz_w == 1920:
skin = """
<screen position="center,170" size="1200,570" title="User Script Plugin" >
<widget name="logo" position="20,10" size="150,60" />
<widget backgroundColor="#9f1313" font="Regular;30" halign="center" name="buttonred" position="190,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget backgroundColor="#1f771f" font="Regular;30" halign="center" name="buttongreen" position="425,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget backgroundColor="#a08500" font="Regular;30" halign="center" name="buttonyellow" position="660,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget backgroundColor="#18188b" font="Regular;30" halign="center" name="buttonblue" position="895,10" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="225,60" valign="center" />
<widget name="info" position="1135,10" size="60,30" alphatest="on" />
<widget name="menu" position="1135,40" size="60,30" alphatest="on" />
<eLabel backgroundColor="grey" position="20,80" size="1170,1" />
<widget enableWrapAround="1" name="config" position="20,90" scrollbarMode="showOnDemand" size="1170,470" />
</screen>"""
else:
skin = """
<screen position="center,120" size="820,400" title="User Script Plugin">
<widget name="logo" position="10,5" size="100,40" />
<widget backgroundColor="#9f1313" font="Regular;19" halign="center" name="buttonred" position="120,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget backgroundColor="#1f771f" font="Regular;19" halign="center" name="buttongreen" position="280,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget backgroundColor="#a08500" font="Regular;19" halign="center" name="buttonyellow" position="440,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget backgroundColor="#18188b" font="Regular;19" halign="center" name="buttonblue" position="600,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="150,40" valign="center" />
<widget name="info" position="765,5" size="40,20" alphatest="on" />
<widget name="menu" position="765,25" size="40,20" alphatest="on" />
<eLabel position="10,50" size="800,1" backgroundColor="grey" />
<widget name="config" position="10,60" size="800,330" enableWrapAround="1" scrollbarMode="showOnDemand" />
</screen>"""
def __init__(self, session):
self.skin = UserScriptsConfiguration.skin
Screen.__init__(self, session)
self.list = []
self.list.append(
getConfigListEntry(_("select from list"), config.plugins.userscripts.list)
)
self.list.append(
getConfigListEntry(
_("save script and option"), config.plugins.userscripts.scriptsave
)
)
if os_path.exists("/var/lib/dpkg/status"):
self.list.append(
getConfigListEntry(_("Exit"), config.plugins.userscripts.leaving)
)
self.list.append(
getConfigListEntry(_("show plugin"), config.plugins.userscripts.show)
)
self.list.append(
getConfigListEntry(_("confirm"), config.plugins.userscripts.confirm)
)
self.list.append(
getConfigListEntry(_("Inactive"), config.usage.inactivity_action)
)
if os_path.exists("/var/lib/dpkg/status"):
self.list.append(
getConfigListEntry(
_("Transponder") + " " + _("Time"), config.misc.useTransponderTime
)
)
# NTP Timer updates is strange ...
self._nm = eNetworkManager.getInstance()
choices_timeupdates = {
eNetworkManager.TIME_UPDATES_AUTO: _("auto"),
eNetworkManager.TIME_UPDATES_MANUAL: _("manual"),
}
self._config_timeupdates = ConfigSelection(
choices_timeupdates, default=self._nm.timeUpdates()
)
self.list.append(
getConfigListEntry(_("NTP Time Updates"), self._config_timeupdates)
)
self.list.append(
getConfigListEntry(_("Recordings"), config.misc.recording_allowed)
)
self.list.append(
getConfigListEntry(
_("enable autostart")
+ " "
+ _("Delay")
+ " [0 = "
+ _("disabled")
+ "]",
config.plugins.userscripts.startupdelay,
)
)
boxtype = gm.boxtype()
if os_path.exists("/dev/mmcblk1") and os_path.exists("/var/lib/dpkg/status"):
if (
boxtype == "dreamone"
or boxtype == "dreamtwo"
or boxtype == "dreamseven"
or boxtype == "dm900"
or boxtype == "dm920"
):
self.list.append(
getConfigListEntry("SD Card", config.plugins.userscripts.sdcard)
)
self.onShown.append(self.setWindowTitle)
self.oldlist = config.plugins.userscripts.list.value
self.oldshow = config.plugins.userscripts.show.value
ConfigListScreen.__init__(self, self.list)
self.OK = False
# explizit check on every entry
self.onChangedEntry = []
self["buttonred"] = Label(_("Exit"))
self["buttongreen"] = Label(_("Save"))
self["buttonyellow"] = Label(_("Cleanup"))
self["buttonblue"] = Label(_("About"))
self["logo"] = Pixmap()
self["menu"] = Pixmap()
self["info"] = Pixmap()
self["actions"] = ActionMap(
[
"WizardActions",
"ColorActions",
"ChannelSelectEPGActions",
"ChannelSelectEditActions",
],
{
"red": self.cancel,
"green": self.leave,
"blue": self.about,
"yellow": self.clean,
"back": self.cancel,
"showEPGList": self.about,
"contextMenu": self.cancel,
},
-1,
)
def setWindowTitle(self):
self["logo"].instance.setPixmapFromFile(
"%s/userscripts.png" % userscripts_plugindir
)
self["menu"].instance.setPixmapFromFile(gm.getpicon("menu"))
self["info"].instance.setPixmapFromFile(gm.getpicon("info"))
self.setTitle(_("User Script Plugin") + " " + _("Configuration") + " "+ userscripts_version)
def saving(self):
config.plugins.userscripts.confirm.save()
config.plugins.userscripts.leaving.save()
config.plugins.userscripts.list.save()
config.plugins.userscripts.scriptsave.save()
config.plugins.userscripts.show.save()
config.plugins.userscripts.startupdelay.save()
config.plugins.userscripts.sdcard.save()
config.usage.inactivity_action.save()
if os_path.exists("/var/lib/dpkg/status"):
config.misc.recording_allowed.save()
config.misc.useTransponderTime.save()
self._nm.setTimeUpdates(self._config_timeupdates.value)
try:
if config.plugins.userscripts.sdcard.value:
if not os_path.exists("/media/sdcard"):
os_mkdir("/media/sdcard")
else:
if os.path.exists("/media/sdcard"):
os_rmdir("/media/sdcard")
except:
pass
def leave(self):
self.saving()
self.close(True)
def leave2(self, forced=False):
self.saving()
if config.plugins.userscripts.leaving.value:
try:
self.close(True)
except:
pass
def cancel(self):
config.plugins.userscripts.confirm.cancel()
config.plugins.userscripts.list.cancel()
config.plugins.userscripts.scriptsave.cancel()
config.plugins.userscripts.show.cancel()
config.plugins.userscripts.sdcard.cancel()
if os_path.exists("/var/lib/dpkg/status"):
config.misc.useTransponderTime.cancel()
self.close(False)
def about(self):
title = _("User Scripts Plugin %s by gutemine") % (userscripts_version)
self.session.open(MessageBox, title, MessageBox.TYPE_INFO)
def clean(self):
self.container = eConsoleAppContainer()
if os_path.exists("/var/lib/dpkg/status"):
clean_cmd = "apt-get clean"
message = _("apt-get") + " " + _("cache") + " " + _("cleaned")
else:
clean_cmd = "opkg clean"
message = _("opkg") + " " + _("cache") + " " + _("cleaned")
self.container.execute(clean_cmd)
self.session.open(MessageBox, message, MessageBox.TYPE_INFO)