Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
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)