|
Lines 1-4
Link Here
|
| 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 |
|
Lines 33-53
Link Here
|
| 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] |
|
Lines 96-101
Link Here
|
| 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 |
|
|
Lines 121-128
Link Here
|
| 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 |
|
|
Lines 186-192
Link Here
|
| 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 |
|
|
Lines 266-272
Link Here
|
| 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): |
|
Lines 302-308
Link Here
|
| 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 |
|
Lines 356-362
Link Here
|
| 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)): |
|
Lines 385-390
Link Here
|
| 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: |
|
Lines 471-477
Link Here
|
| 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) |
|
Lines 685-691
Link Here
|
| 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 |
|
Lines 708-712
Link Here
|
| 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() |