Skip to content

Commit 778f295

Browse files
author
Christian Seibold
committed
Delete core and lib directories during uninstallation, Add imachug's ZeroNet Cmd Lib under Tools directory
1 parent 22884a9 commit 778f295

File tree

17 files changed

+1227
-1
lines changed

17 files changed

+1227
-1
lines changed

Output/ZeroNetInstaller.exe

4 Bytes
Binary file not shown.

Tools/ZeroNet-cmd-lib/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.pyc
2+
/config.json

Tools/ZeroNet-cmd-lib/lib/__init__.py

Whitespace-only changes.

Tools/ZeroNet-cmd-lib/lib/args.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import sys
2+
argv = sys.argv[1:]
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
import sys, inspect
2+
3+
def classAsFunction(cls):
4+
if not isinstance(cls, type):
5+
return cls
6+
7+
class Class(cls):
8+
def __new__(cls, args):
9+
instance = super(Callable, cls).__new__(cls)
10+
return instance.__init__(args)
11+
12+
return Class
13+
14+
@classAsFunction
15+
class Callable(object):
16+
class SubCommand(Exception):
17+
pass
18+
class Redirect(Exception):
19+
pass
20+
class Error(Exception):
21+
pass
22+
23+
def __init__(self, args):
24+
return self.call("", args)
25+
26+
def call(self, cmd, args):
27+
cmd = cmd.strip()
28+
29+
try:
30+
handler = getattr(self, "action" + "".join(map(lambda part: part[0].upper() + part[1:] if part != "" else "", cmd.split(" "))))
31+
except AttributeError:
32+
all_commands = [name[6].lower() + name[7:] for name in dir(self) if name.startswith("action") and len(name) > 6]
33+
raise Callable.Error("Unknown command '%s'. Allowed commands are: %s" % (cmd, ", ".join(all_commands)))
34+
35+
self.checkCall(cmd, handler, args)
36+
37+
try:
38+
return self.callArgs(handler, args)
39+
except Callable.SubCommand as e:
40+
if len(args) == 0:
41+
raise Callable.Error("'%s' command is not a command but has subcommands." % cmd)
42+
43+
if len(tuple(e)) == 0:
44+
# Remove first argument and call it
45+
return self.call("%s %s" % (cmd, args[0]), args[1:])
46+
else:
47+
# Remove first argument and call given command
48+
return self.call(tuple(e)[0], args[1:])
49+
except Callable.Redirect as e:
50+
if len(tuple(e)) == 0:
51+
# Remove first argument and call it (as SubCommand)
52+
if len(args) == 0:
53+
raise Callable.Error("'%s' command is not a command but has subcommands." % cmd)
54+
return self.call("%s %s" % (cmd, args[0]), args[1:])
55+
elif len(tuple(e)) == 1:
56+
# Call given value
57+
return self.call(tuple(e)[0], args)
58+
else:
59+
# Call given value and arguments
60+
return self.call(tuple(e)[0], tuple(e)[1])
61+
62+
def checkCall(self, cmd, func, argv):
63+
import inspect
64+
65+
expected_args = inspect.getargspec(func).args[1:] # Split "self"
66+
defaults = inspect.getargspec(func).defaults or tuple()
67+
68+
if self.checkArgs(cmd, func, argv):
69+
return True
70+
71+
if len(defaults) > 0:
72+
default_args = reversed(zip(reversed(expected_args), reversed(defaults)))
73+
default_args = map(lambda arg: "%s=%s" % arg, default_args)
74+
expected_args = expected_args[:-len(default_args)] + default_args
75+
76+
raise Callable.Error("Allowed arguments: %s" % ", ".join(expected_args))
77+
78+
def checkArgs(self, cmd, func, argv):
79+
args, kwargs = self.parseArgs(argv)
80+
81+
import inspect
82+
83+
expected_args = inspect.getargspec(func).args[1:] # Split "self"
84+
varargs = inspect.getargspec(func).varargs
85+
keywords = inspect.getargspec(func).keywords
86+
defaults = inspect.getargspec(func).defaults or tuple()
87+
88+
resulting_args = dict()
89+
if varargs is not None:
90+
resulting_args[varargs] = []
91+
if keywords is not None:
92+
resulting_args[keywords] = {}
93+
94+
# Positional arguments
95+
for cnt, value in enumerate(args):
96+
if cnt < len(expected_args):
97+
# Passed just as argument
98+
resulting_args[expected_args[cnt]] = value
99+
else:
100+
# Passed to *args
101+
if varargs is None:
102+
raise Callable.Error("Too many positional arguments passed to '%s': expected at most %s, got %s." % (cmd, len(expected_args), len(args)))
103+
else:
104+
resulting_args[varargs].append(value)
105+
106+
# Named arguments
107+
handled_kwargs = []
108+
for name, value in kwargs.iteritems():
109+
if name in handled_kwargs:
110+
raise Callable.Error("'%s' was passed to '%s' as named argument several times." % (name, cmd))
111+
112+
handled_kwargs.append(name)
113+
114+
if name in expected_args:
115+
# Passed just as argument
116+
if name in resulting_args:
117+
raise Callable.Error("'%s' was passed to '%s' as both positional argument and named." % (name, cmd))
118+
119+
resulting_args[name] = value
120+
else:
121+
# Passed to **kwargs
122+
if keywords is None:
123+
raise Callable.Error("Unknown named argument '%s' passed to '%s'." % (name, cmd))
124+
else:
125+
resulting_args[keywords][name] = value
126+
127+
# Defaults
128+
if len(defaults) > 0:
129+
for cnt, name in enumerate(expected_args[-len(defaults):]):
130+
if name not in resulting_args:
131+
resulting_args[name] = defaults[cnt]
132+
133+
# Check that all the arguments were passed
134+
for name in expected_args:
135+
if name not in resulting_args:
136+
raise Callable.Error("Argument '%s' was not passed to '%s'." % (name, cmd))
137+
138+
return True
139+
140+
def parseArgs(self, argv):
141+
args = []
142+
kwargs = {}
143+
144+
kwname = None
145+
146+
for arg in argv:
147+
if arg.startswith("--"):
148+
if kwname is not None:
149+
kwargs[kwname] = True
150+
151+
kwname = arg[2:]
152+
else:
153+
if kwname is None:
154+
args.append(arg)
155+
else:
156+
kwargs[kwname] = arg
157+
kwname = None
158+
159+
if kwname is not None:
160+
kwargs[kwname] = True
161+
162+
return args, kwargs
163+
164+
def callArgs(self, handler, argv):
165+
args, kwargs = self.parseArgs(argv)
166+
return handler(*args, **kwargs)
167+
168+
def action(self, *args, **kwargs):
169+
raise Callable.SubCommand
170+
171+
class WithHelp(Callable):
172+
def actionHelp(self, *cmd):
173+
if cmd in [[], [""], tuple(), ("",)]:
174+
# Print info about the class
175+
print inspect.cleandoc(self.__doc__)
176+
return
177+
178+
try:
179+
handler = getattr(self, "action" + "".join(map(lambda part: part[0].upper() + part[1:], cmd)))
180+
if handler.__doc__ is not None:
181+
print inspect.cleandoc(handler.__doc__)
182+
return
183+
except AttributeError:
184+
pass
185+
186+
if cmd == ["help"] or cmd == ("help",):
187+
# Unable to find info on topic 'help' - no __doc__ in 'help' method or no 'help' method, use default help
188+
print inspect.cleandoc(self.__doc__)
189+
return
190+
191+
print "Unknown topic '%s'" % " ".join(cmd)
192+
193+
Callable.WithHelp = WithHelp
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import os, json
2+
3+
def recursiveDir(obj, prefix=""):
4+
result = []
5+
for name in obj:
6+
absolute = "%s.%s" % (prefix, name) if prefix != "" else name
7+
if isinstance(obj[name], dict):
8+
result += recursiveDir(obj[name], absolute)
9+
else:
10+
result.append(absolute)
11+
return result
12+
13+
class Config(object):
14+
class AttributeError(AttributeError):
15+
pass
16+
17+
def __init__(self, path):
18+
self.__dict__["path"] = path
19+
20+
# Read single value
21+
def __getattr__(self, name):
22+
try:
23+
with open(self.path, "r") as f:
24+
config = json.loads(f.read())
25+
return config[name]
26+
except (KeyError, AttributeError):
27+
raise Config.AttributeError("No '%s' config variable" % name)
28+
except IOError:
29+
raise Config.AttributeError("No config file and therefore no '%s' attribute" % name)
30+
def __getitem__(self, name):
31+
return self.__getattr__(name)
32+
33+
# Read value recursively
34+
def get(self, name, default=None):
35+
name = name.split(".")
36+
37+
try:
38+
val = self[name[0]]
39+
for part in name[1:]:
40+
val = val[part]
41+
42+
return val
43+
except (KeyError, AttributeError, Config.AttributeError):
44+
return default
45+
46+
# Write single value
47+
def __setattr__(self, name, value):
48+
try:
49+
with open(self.path, "r") as f:
50+
config = json.loads(f.read())
51+
except IOError:
52+
config = dict()
53+
54+
config[name] = value
55+
56+
with open(self.path, "w") as f:
57+
f.write(json.dumps(config))
58+
def __setitem__(self, name, value):
59+
self.__setattr__(name, value)
60+
61+
# Write value recursively
62+
def set(self, name, value):
63+
try:
64+
with open(self.path, "r") as f:
65+
config = json.loads(f.read())
66+
except IOError:
67+
config = dict()
68+
69+
current = config
70+
for part in name.split(".")[:-1]:
71+
try:
72+
current = current[part]
73+
except KeyError:
74+
current[part] = dict()
75+
current = current[part]
76+
77+
current[name.split(".")[-1]] = value
78+
79+
with open(self.path, "w") as f:
80+
f.write(json.dumps(config))
81+
82+
# Delete variable
83+
def __delattr__(self, name):
84+
try:
85+
with open(self.path, "r") as f:
86+
config = json.loads(f.read())
87+
except IOError:
88+
config = dict()
89+
90+
del config[name]
91+
92+
with open(self.path, "w") as f:
93+
f.write(json.dumps(config))
94+
def __delitem__(self, name, value):
95+
self.__delattr__(name, value)
96+
97+
# Delete variable recursively
98+
def remove(self, name):
99+
try:
100+
with open(self.path, "r") as f:
101+
config = json.loads(f.read())
102+
except IOError:
103+
config = dict()
104+
105+
current = config
106+
for part in name.split(".")[:-1]:
107+
try:
108+
current = current[part]
109+
except KeyError:
110+
current[part] = dict()
111+
current = current[part]
112+
113+
del current[name.split(".")[-1]]
114+
115+
with open(self.path, "w") as f:
116+
f.write(json.dumps(config))
117+
118+
# Get data list
119+
def __dir__(self):
120+
try:
121+
with open(self.path, "r") as f:
122+
config = json.loads(f.read())
123+
return dir(config)
124+
except IOError:
125+
return []
126+
127+
# Get data list recursively
128+
def list(self):
129+
try:
130+
with open(self.path, "r") as f:
131+
config = json.loads(f.read())
132+
except IOError:
133+
return []
134+
135+
return recursiveDir(config)
136+
137+
current_dir = os.path.dirname(os.path.abspath(__file__))
138+
config_json = os.path.abspath(os.path.join(current_dir, "../config.json"))
139+
config = Config(config_json)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
psutil
2+
websocket

0 commit comments

Comments
 (0)