summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2011-05-10 21:23:46 +0200
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2011-05-10 21:23:46 +0200
commit60ae0ee3dce4715621b9964c91ad96e08e123204 (patch)
tree251aeb85742a32a8f3711879e4071a66e59bdc26 /module
parentfixes netload free (diff)
downloadpyload-60ae0ee3dce4715621b9964c91ad96e08e123204.tar.xz
rewritten cli, closed #275, #304
Diffstat (limited to 'module')
-rw-r--r--module/HookManager.py6
-rw-r--r--module/cli/AddPackage.py66
-rw-r--r--module/cli/Handler.py48
-rw-r--r--module/cli/ManageFiles.py204
-rw-r--r--module/cli/__init__.py2
-rw-r--r--module/cli/printer.py26
-rw-r--r--module/lib/Getch.py76
-rw-r--r--module/lib/SafeEval.py (renamed from module/SafeEval.py)0
-rw-r--r--module/lib/Unzip.py (renamed from module/Unzip.py)0
-rw-r--r--module/plugins/PluginManager.py2
-rw-r--r--module/remote/thriftbackend/Handler.py1
-rw-r--r--module/remote/thriftbackend/pyload.thrift2
12 files changed, 427 insertions, 6 deletions
diff --git a/module/HookManager.py b/module/HookManager.py
index c3da485a9..1138a4c29 100644
--- a/module/HookManager.py
+++ b/module/HookManager.py
@@ -62,18 +62,16 @@ class HookManager:
def addRPC(self, plugin, func, doc):
plugin = plugin.rpartition(".")[2]
- doc = doc.strip()
+ doc = doc.strip() if doc else ""
if self.methods.has_key(plugin):
self.methods[plugin][func] = doc
else:
self.methods[plugin] = {func: doc}
- print self.methods
-
def callRPC(self, plugin, func, args, parse):
if not args: args = tuple()
- if parse is not False:
+ if parse:
args = tuple([literal_eval(x) for x in args])
plugin = self.pluginMap[plugin]
diff --git a/module/cli/AddPackage.py b/module/cli/AddPackage.py
new file mode 100644
index 000000000..ded08742b
--- /dev/null
+++ b/module/cli/AddPackage.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+#Copyright (C) 2011 RaNaN
+#
+#This program 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 3 of the License,
+#or (at your option) any later version.
+#
+#This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
+#
+###
+
+from Handler import Handler
+from printer import *
+
+class AddPackage(Handler):
+ """ let the user add packages """
+
+ def init(self):
+ self.name = ""
+ self.urls = []
+
+ def onEnter(self, inp):
+ if inp == "0":
+ self.cli.reset()
+
+ if not self.name:
+ self.name = inp
+ self.setInput()
+ elif inp == "END":
+ #add package
+ self.client.addPackage(self.name, self.urls, 0)
+ self.cli.reset()
+ else:
+ if inp.strip():
+ self.urls.append(inp)
+ self.setInput()
+
+ def renderBody(self, line):
+ println(line, white(_("Add Package:")))
+ println(line + 1, "")
+ line += 2
+
+ if not self.name:
+ println(line, _("Enter a name for the new package"))
+ println(line + 1, "")
+ line += 2
+ else:
+ println(line, _("Package: %s") % self.name)
+ println(line + 1, _("Parse the links you want to add."))
+ println(line + 2, _("Type %s when done.") % mag("END"))
+ println(line + 3, _("Links added: ") + mag(len(self.urls)))
+ line += 4
+
+ println(line, "")
+ println(line + 1, mag("0.") + _(" back to main menu"))
+
+ return line + 2 \ No newline at end of file
diff --git a/module/cli/Handler.py b/module/cli/Handler.py
new file mode 100644
index 000000000..476d09386
--- /dev/null
+++ b/module/cli/Handler.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+#Copyright (C) 2011 RaNaN
+#
+#This program 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 3 of the License,
+#or (at your option) any later version.
+#
+#This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
+#
+###
+class Handler:
+ def __init__(self, cli):
+ self.cli = cli
+ self.init()
+
+ client = property(lambda self: self.cli.client)
+ input = property(lambda self: self.cli.input)
+
+ def init(self):
+ pass
+
+ def onChar(self, char):
+ pass
+
+ def onBackSpace(self):
+ pass
+
+ def onEnter(self, inp):
+ pass
+
+ def setInput(self, inp=""):
+ self.cli.setInput(inp)
+
+ def backspace(self):
+ self.cli.setInput(self.input[:-1])
+
+ def renderBody(self, line):
+ """ gets the line where to render output and should return the line number below its content """
+ return line + 1 \ No newline at end of file
diff --git a/module/cli/ManageFiles.py b/module/cli/ManageFiles.py
new file mode 100644
index 000000000..1d04c4c49
--- /dev/null
+++ b/module/cli/ManageFiles.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+#Copyright (C) 2011 RaNaN
+#
+#This program 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 3 of the License,
+#or (at your option) any later version.
+#
+#This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
+#
+###
+
+from itertools import islice
+from time import time
+
+from Handler import Handler
+from printer import *
+
+from module.remote.thriftbackend.thriftgen.pyload.Pyload import PackageData, PackageDoesNotExists
+
+class ManageFiles(Handler):
+ """ possibility to manage queue/collector """
+
+ def init(self):
+ self.target = 1 #queue
+ self.pos = 0 #position in queue
+ self.package = -1 #choosen package
+ self.mode = "" # move/delete/restart
+
+ self.cache = None
+ self.links = None
+ self.time = 0
+
+ def onChar(self, char):
+ if char in ("m", "d", "r"):
+ self.mode = char
+ self.setInput()
+ elif char == "p":
+ self.pos = max(0, self.pos - 5)
+ self.backspace()
+ elif char == "n":
+ self.pos += 5
+ self.backspace()
+
+ def onBackSpace(self):
+ if not self.input and self.mode:
+ self.mode = ""
+ if not self.input and self.package > -1:
+ self.package = -1
+
+ def onEnter(self, input):
+ if input == "0":
+ self.cli.reset()
+ elif self.package < 0 and self.mode:
+ #mode select
+ packs = self.parseInput(input)
+ if self.mode == "m":
+ [self.client.movePackage((self.target + 1) % 2, x) for x in packs]
+ elif self.mode == "d":
+ self.client.deletePackages(packs)
+ elif self.mode == "r":
+ [self.client.restartPackage(x) for x in packs]
+
+ elif self.mode:
+ #edit links
+ links = self.parseInput(input, False)
+
+ if self.mode == "d":
+ self.client.deleteFiles(links)
+ elif self.mode == "r":
+ map(self.client.restartFile, links)
+
+ else:
+ #look into package
+ try:
+ self.package = int(input)
+ except:
+ pass
+
+ self.cache = None
+ self.links = None
+ self.pos = 0
+ self.mode = ""
+ self.setInput()
+
+
+ def renderBody(self, line):
+ if self.package < 0:
+ println(line, white(_("Manage Packages:")))
+ else:
+ println(line, white((_("Manage Links:"))))
+ line += 1
+
+ if self.mode:
+ if self.mode == "m":
+ println(line, _("What do you want to move?"))
+ elif self.mode == "d":
+ println(line, _("What do you want to delete?"))
+ elif self.mode == "r":
+ println(line, _("What do you want to restart?"))
+
+ println(line + 1, "Enter single number, comma seperated numbers or ranges. eg. 1,2,3 or 1-3.")
+ line += 2
+ else:
+ println(line, _("Choose what yout want to do or enter package number."))
+ println(line + 1, ("%s - %%s, %s - %%s, %s - %%s" % (mag("d"), mag("m"), mag("r"))) % (
+ _("delete"), _("move"), _("restart")))
+ line += 2
+
+ if self.package < 0:
+ #print package info
+ pack = self.getPackages()
+ i = 0
+ for value in islice(pack, self.pos, self.pos + 5):
+ try:
+ println(line, mag(str(value.pid)) + ": " + value.name)
+ line += 1
+ i += 1
+ except Exception, e:
+ pass
+ for x in range(5 - i):
+ println(line, "")
+ line += 1
+ else:
+ #print links info
+ pack = self.getLinks()
+ i = 0
+ for value in islice(pack.links, self.pos, self.pos + 5):
+ try:
+ println(line, mag(value.fid) + ": %s | %s | %s" % (
+ value.name, value.statusmsg, value.plugin))
+ line += 1
+ i += 1
+ except Exception, e:
+ pass
+ for x in range(5 - i):
+ println(line, "")
+ line += 1
+
+ println(line, mag("p") + _(" - previous") + " | " + mag("n") + _(" - next"))
+ println(line + 1, mag("0.") + _(" back to main menu"))
+
+ return line + 2
+
+
+ def getPackages(self):
+ if self.cache and self.time + 2 < time():
+ return self.cache
+
+ if self.target == 1:
+ data = self.client.getQueue()
+ else:
+ data = self.client.getCollector()
+
+
+ self.cache = data
+ self.time = time()
+
+ return data
+
+ def getLinks(self):
+ if self.links and self.time + 1 < time():
+ return self.links
+
+ try:
+ data = self.client.getPackageData(self.package)
+ except:
+ data = PackageData(links=[])
+
+ self.links = data
+ self.time = time()
+
+ return data
+
+ def parseInput(self, inp, package=True):
+ inp = inp.strip()
+ if "-" in inp:
+ l, n, h = inp.partition("-")
+ l = int(l)
+ h = int(h)
+ r = range(l, h + 1)
+
+ ret = []
+ if package:
+ for p in self.cache:
+ if p.pid in r:
+ ret.append(p.pid)
+ else:
+ for l in self.links.links:
+ if l.lid in r:
+ ret.append(l.lid)
+
+ return ret
+
+ else:
+ return [int(x) for x in inp.split(",")] \ No newline at end of file
diff --git a/module/cli/__init__.py b/module/cli/__init__.py
new file mode 100644
index 000000000..fa8a09291
--- /dev/null
+++ b/module/cli/__init__.py
@@ -0,0 +1,2 @@
+from AddPackage import AddPackage
+from ManageFiles import ManageFiles \ No newline at end of file
diff --git a/module/cli/printer.py b/module/cli/printer.py
new file mode 100644
index 000000000..c62c1800e
--- /dev/null
+++ b/module/cli/printer.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+def blue(string):
+ return "\033[1;34m" + unicode(string) + "\033[0m"
+
+def green(string):
+ return "\033[1;32m" + unicode(string) + "\033[0m"
+
+def yellow(string):
+ return "\033[1;33m" + unicode(string) + "\033[0m"
+
+def red(string):
+ return "\033[1;31m" + unicode(string) + "\033[0m"
+
+def cyan(string):
+ return "\033[1;36m" + unicode(string) + "\033[0m"
+
+def mag(string):
+ return "\033[1;35m" + unicode(string) + "\033[0m"
+
+def white(string):
+ return "\033[1;37m" + unicode(string) + "\033[0m"
+
+def println(line, content):
+ print "\033[" + str(line) + ";0H\033[2K" + content \ No newline at end of file
diff --git a/module/lib/Getch.py b/module/lib/Getch.py
new file mode 100644
index 000000000..22b7ea7f8
--- /dev/null
+++ b/module/lib/Getch.py
@@ -0,0 +1,76 @@
+class Getch:
+ """
+ Gets a single character from standard input. Does not echo to
+ the screen.
+ """
+
+ def __init__(self):
+ try:
+ self.impl = _GetchWindows()
+ except ImportError:
+ try:
+ self.impl = _GetchMacCarbon()
+ except(AttributeError, ImportError):
+ self.impl = _GetchUnix()
+
+ def __call__(self): return self.impl()
+
+
+class _GetchUnix:
+ def __init__(self):
+ import tty
+ import sys
+
+ def __call__(self):
+ import sys
+ import tty
+ import termios
+
+ fd = sys.stdin.fileno()
+ old_settings = termios.tcgetattr(fd)
+ try:
+ tty.setraw(sys.stdin.fileno())
+ ch = sys.stdin.read(1)
+ finally:
+ termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
+ return ch
+
+
+class _GetchWindows:
+ def __init__(self):
+ import msvcrt
+
+ def __call__(self):
+ import msvcrt
+
+ return msvcrt.getch()
+
+class _GetchMacCarbon:
+ """
+ A function which returns the current ASCII key that is down;
+ if no ASCII key is down, the null string is returned. The
+ page http://www.mactech.com/macintosh-c/chap02-1.html was
+ very helpful in figuring out how to do this.
+ """
+
+ def __init__(self):
+ import Carbon
+ Carbon.Evt #see if it has this (in Unix, it doesn't)
+
+ def __call__(self):
+ import Carbon
+
+ if Carbon.Evt.EventAvail(0x0008)[0] == 0: # 0x0008 is the keyDownMask
+ return ''
+ else:
+ #
+ # The event contains the following info:
+ # (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)[1]
+ #
+ # The message (msg) contains the ASCII char which is
+ # extracted with the 0x000000FF charCodeMask; this
+ # number is converted to an ASCII character with chr() and
+ # returned
+ #
+ (what, msg, when, where, mod) = Carbon.Evt.GetNextEvent(0x0008)[1]
+ return chr(msg) \ No newline at end of file
diff --git a/module/SafeEval.py b/module/lib/SafeEval.py
index 8ec9766e6..8ec9766e6 100644
--- a/module/SafeEval.py
+++ b/module/lib/SafeEval.py
diff --git a/module/Unzip.py b/module/lib/Unzip.py
index f56fbe751..f56fbe751 100644
--- a/module/Unzip.py
+++ b/module/lib/Unzip.py
diff --git a/module/plugins/PluginManager.py b/module/plugins/PluginManager.py
index acfabde21..0ca060152 100644
--- a/module/plugins/PluginManager.py
+++ b/module/plugins/PluginManager.py
@@ -29,7 +29,7 @@ from traceback import print_exc
try:
from ast import literal_eval
except ImportError: # python 2.5
- from module.SafeEval import safe_eval as literal_eval
+ from module.lib.SafeEval import safe_eval as literal_eval
from module.ConfigParser import IGNORE
diff --git a/module/remote/thriftbackend/Handler.py b/module/remote/thriftbackend/Handler.py
index 9d38109db..9a7c1489e 100644
--- a/module/remote/thriftbackend/Handler.py
+++ b/module/remote/thriftbackend/Handler.py
@@ -157,6 +157,7 @@ class Handler(Iface):
status.format_wait = pyfile.formatWait()
status.wait_until = pyfile.waitUntil
status.package = pyfile.package().name
+ status.packageID = pyfile.package().id
data.append(status)
return data
diff --git a/module/remote/thriftbackend/pyload.thrift b/module/remote/thriftbackend/pyload.thrift
index 8e399062d..c26334051 100644
--- a/module/remote/thriftbackend/pyload.thrift
+++ b/module/remote/thriftbackend/pyload.thrift
@@ -162,7 +162,7 @@ struct ServiceCall {
1: string plugin,
2: string func,
3: optional list<string> arguments,
- 4: optional bool parseArguments, //default True
+ 4: optional bool parseArguments, //default False
}
exception PackageDoesNotExists{