|
1 |
#!/usr/bin/python2.7 |
1 |
#!/usr/bin/python3 |
2 |
# -*- coding: utf-8 -*- |
2 |
# -*- coding: utf-8 -*- |
3 |
# |
3 |
# |
4 |
# Univention App Center |
4 |
# Univention App Center |
|
33 |
# |
33 |
# |
34 |
|
34 |
|
35 |
import json |
35 |
import json |
36 |
import re |
36 |
import logging |
37 |
import os.path |
37 |
import os.path |
38 |
from subprocess import Popen, PIPE |
38 |
import re |
39 |
from argparse import SUPPRESS, Action |
39 |
import sys |
40 |
from tempfile import NamedTemporaryFile |
40 |
from argparse import SUPPRESS, Action, ArgumentParser, Namespace |
|
|
41 |
from contextlib import contextmanager |
41 |
from distutils.version import LooseVersion |
42 |
from distutils.version import LooseVersion |
42 |
from argparse import ArgumentParser, Namespace |
|
|
43 |
import logging |
44 |
from getpass import getpass |
43 |
from getpass import getpass |
45 |
from contextlib import contextmanager |
44 |
from subprocess import PIPE, Popen |
46 |
import sys |
45 |
from tempfile import NamedTemporaryFile |
47 |
|
|
|
48 |
|
49 |
reload(sys) |
50 |
sys.setdefaultencoding('utf8') |
51 |
|
46 |
|
52 |
|
47 |
|
53 |
PROGRAM = sys.argv[0] |
48 |
PROGRAM = sys.argv[0] |
|
96 |
handler.setFormatter(formatter) |
91 |
handler.setFormatter(formatter) |
97 |
handler.addFilter(RangeFilter(min_level=logging.WARN)) |
92 |
handler.addFilter(RangeFilter(min_level=logging.WARN)) |
98 |
logger.addHandler(handler) |
93 |
logger.addHandler(handler) |
|
|
94 |
|
95 |
|
99 |
log_to_stream._already_set_up = False |
96 |
log_to_stream._already_set_up = False |
100 |
|
97 |
|
101 |
|
98 |
|
|
121 |
return new_cls |
118 |
return new_cls |
122 |
|
119 |
|
123 |
|
120 |
|
124 |
class UniventionAppAction(object): |
121 |
class UniventionAppAction(object, metaclass=UniventionAppActionMeta): |
125 |
__metaclass__ = UniventionAppActionMeta |
|
|
126 |
|
122 |
|
127 |
parent_logger = get_base_logger().getChild('actions') |
123 |
parent_logger = get_base_logger().getChild('actions') |
128 |
|
124 |
|
|
186 |
default = getattr(_namespace, action.dest) |
182 |
default = getattr(_namespace, action.dest) |
187 |
args[action.dest] = default |
183 |
args[action.dest] = default |
188 |
args.update(kwargs) |
184 |
args.update(kwargs) |
189 |
for key, value in args.iteritems(): |
185 |
for key, value in args.items(): |
190 |
setattr(namespace, key, value) |
186 |
setattr(namespace, key, value) |
191 |
return namespace |
187 |
return namespace |
192 |
|
188 |
|
|
266 |
return args.username |
262 |
return args.username |
267 |
if not args.noninteractive: |
263 |
if not args.noninteractive: |
268 |
try: |
264 |
try: |
269 |
username = raw_input('Username: ') |
265 |
username = input('Username: ') |
270 |
if not username: |
266 |
if not username: |
271 |
raise EOFError() |
267 |
raise EOFError() |
272 |
except (EOFError, KeyboardInterrupt): |
268 |
except (EOFError, KeyboardInterrupt): |
|
302 |
if not password: |
298 |
if not password: |
303 |
yield None |
299 |
yield None |
304 |
else: |
300 |
else: |
305 |
with NamedTemporaryFile('w+b') as password_file: |
301 |
with NamedTemporaryFile('w+') as password_file: |
306 |
password_file.write(password) |
302 |
password_file.write(password) |
307 |
password_file.flush() |
303 |
password_file.flush() |
308 |
yield password_file.name |
304 |
yield password_file.name |
|
356 |
server = 'https://%s' % server |
352 |
server = 'https://%s' % server |
357 |
uri = '%s/univention/%s' % (server, path) |
353 |
uri = '%s/univention/%s' % (server, path) |
358 |
args = [] |
354 |
args = [] |
359 |
for key, value in kwargs.iteritems(): |
355 |
for key, value in kwargs.items(): |
360 |
if value is None: |
356 |
if value is None: |
361 |
continue |
357 |
continue |
362 |
if not isinstance(value, (tuple, list)): |
358 |
if not isinstance(value, (tuple, list)): |
|
385 |
args = ['curl', '--cookie', self._cookiejar.name, '--cookie-jar', self._cookiejar.name, '-H', 'X-Requested-With: XmlHttpRequest', '-H', 'Accept: application/json; q=1'] + args + [uri] |
381 |
args = ['curl', '--cookie', self._cookiejar.name, '--cookie-jar', self._cookiejar.name, '-H', 'X-Requested-With: XmlHttpRequest', '-H', 'Accept: application/json; q=1'] + args + [uri] |
386 |
process = Popen(args, stdout=PIPE, stderr=PIPE) |
382 |
process = Popen(args, stdout=PIPE, stderr=PIPE) |
387 |
out, err = process.communicate() |
383 |
out, err = process.communicate() |
|
|
384 |
out, err = out.decode('UTF-8'), err.decode('UTF-8') |
388 |
try: |
385 |
try: |
389 |
return json.loads(out) |
386 |
return json.loads(out) |
390 |
except ValueError: |
387 |
except ValueError: |
|
471 |
ret.extend(app['versions']) |
468 |
ret.extend(app['versions']) |
472 |
return ret |
469 |
return ret |
473 |
|
470 |
|
474 |
|
|
|
475 |
def _find_app_versions(self, args): |
471 |
def _find_app_versions(self, args): |
476 |
ucs_version = self._get_ucs_version(args.app) |
472 |
ucs_version = self._get_ucs_version(args.app) |
477 |
versions = self._find_all_app_versions(args) |
473 |
versions = self._find_all_app_versions(args) |
|
685 |
usage = PROGRAM |
681 |
usage = PROGRAM |
686 |
description = '%s is a program to use the Univention App Center Self Service' % PROGRAM |
682 |
description = '%s is a program to use the Univention App Center Self Service' % PROGRAM |
687 |
parser = ArgumentParser(usage=usage, description=description) |
683 |
parser = ArgumentParser(usage=usage, description=description) |
688 |
subparsers = parser.add_subparsers(description='type %s <action> --help for further help and possible arguments' % PROGRAM, metavar='action') |
684 |
subparsers = parser.add_subparsers(description='type %s <action> --help for further help and possible arguments' % PROGRAM, metavar='action', required=True) |
689 |
|
685 |
|
690 |
get_base_logger().setLevel(logging.DEBUG) |
686 |
get_base_logger().setLevel(logging.DEBUG) |
691 |
get_base_logger().addHandler(logging.NullHandler()) # this is to prevent warning messages |
687 |
get_base_logger().addHandler(logging.NullHandler()) # this is to prevent warning messages |
|
708 |
ret = 0 |
704 |
ret = 0 |
709 |
sys.exit(ret) |
705 |
sys.exit(ret) |
710 |
|
706 |
|
|
|
707 |
|
711 |
if __name__ == '__main__': |
708 |
if __name__ == '__main__': |
712 |
main() |
709 |
main() |