|
35 |
import os |
35 |
import os |
36 |
import time |
36 |
import time |
37 |
import subprocess |
37 |
import subprocess |
38 |
import tempfile |
|
|
39 |
from contextlib import contextmanager |
38 |
from contextlib import contextmanager |
40 |
|
39 |
|
41 |
import apt_pkg |
40 |
import apt_pkg |
|
55 |
CMD_DISABLE_EXEC = '/usr/share/univention-updater/disable-apache2-umc' |
54 |
CMD_DISABLE_EXEC = '/usr/share/univention-updater/disable-apache2-umc' |
56 |
CMD_ENABLE_EXEC = ['/usr/share/univention-updater/enable-apache2-umc', '--no-restart'] |
55 |
CMD_ENABLE_EXEC = ['/usr/share/univention-updater/enable-apache2-umc', '--no-restart'] |
57 |
|
56 |
|
|
|
57 |
PACKAGE_MANAGER_LOG = open('/var/log/univention/package_manager.log', 'ab') |
58 |
|
58 |
class LockError(Exception): |
59 |
class LockError(Exception): |
59 |
'''Lock error for the package manager. |
60 |
'''Lock error for the package manager. |
60 |
Not to be confused with LockFailedException (apt) |
61 |
Not to be confused with LockFailedException (apt) |
|
88 |
if msg is None: |
89 |
if msg is None: |
89 |
return |
90 |
return |
90 |
msg = '%s\n' % str(msg).strip() |
91 |
msg = '%s\n' % str(msg).strip() |
|
|
92 |
PACKAGE_MANAGER_LOG.write(msg) |
91 |
for log in self.logfiles.values(): |
93 |
for log in self.logfiles.values(): |
92 |
log.write(msg) |
94 |
log.write(msg) |
93 |
|
95 |
|
|
185 |
def fork(self): |
187 |
def fork(self): |
186 |
# we better have a real file |
188 |
# we better have a real file |
187 |
# when using low-level routines |
189 |
# when using low-level routines |
188 |
tmp = tempfile.TemporaryFile() |
190 |
msg_writer = MessageWriter(self.progress_state, PACKAGE_MANAGER_LOG) |
189 |
msg_writer = MessageWriter(self.progress_state, tmp) |
|
|
190 |
p = os.fork() |
191 |
p = os.fork() |
191 |
if p == 0: |
192 |
if p == 0: |
192 |
os.dup2(msg_writer.fileno(), sys.stdout.fileno()) |
193 |
os.dup2(msg_writer.fileno(), sys.stdout.fileno()) |
|
273 |
finally: |
274 |
finally: |
274 |
self.progress_state.logfiles.pop(logfile.name) |
275 |
self.progress_state.logfiles.pop(logfile.name) |
275 |
|
276 |
|
|
|
277 |
def log(self, msg): |
278 |
self.progress_state.log(msg) |
279 |
|
276 |
@contextmanager |
280 |
@contextmanager |
277 |
def locked(self, reset_status=False, set_finished=False): |
281 |
def locked(self, reset_status=False, set_finished=False): |
278 |
self.lock() |
282 |
self.lock() |
|
309 |
self.unlock() |
313 |
self.unlock() |
310 |
|
314 |
|
311 |
def _set_apt_pkg_config(self, options): |
315 |
def _set_apt_pkg_config(self, options): |
312 |
revert_options = {} |
316 |
revert_options = [] |
313 |
for option_name, option_value in options.iteritems(): |
317 |
for option_name, option_value in options: |
314 |
old_value = apt_pkg.config.get(option_name) |
318 |
old_value = apt_pkg.config.get(option_name) |
315 |
apt_pkg.config[option_name] = option_value |
319 |
apt_pkg.config[option_name] = option_value |
316 |
revert_options[option_name] = old_value |
320 |
revert_options.append((option_name, old_value)) |
317 |
return revert_options |
321 |
return revert_options |
318 |
|
322 |
|
319 |
def add_hundred_percent(self): |
323 |
def add_hundred_percent(self): |
|
347 |
@contextmanager |
351 |
@contextmanager |
348 |
def brutal_noninteractive(self): |
352 |
def brutal_noninteractive(self): |
349 |
with self.noninteractive(): |
353 |
with self.noninteractive(): |
350 |
options = { |
354 |
options = [ |
351 |
'DPkg::Options::': '--force-overwrite', |
355 |
('DPkg::Options::', '--force-overwrite'), |
352 |
'DPkg::Options::': '--force-overwrite-dir', |
356 |
('DPkg::Options::', '--force-overwrite-dir'), |
353 |
'APT::Get::Trivial-Only': 'no', |
357 |
('APT::Get::AllowUnauthenticated', '1'), |
354 |
'quiet': '1', |
358 |
('APT::Get::Trivial-Only', 'no'), |
355 |
} |
359 |
('quiet', '1'), |
|
|
360 |
] |
356 |
revert_options = self._set_apt_pkg_config(options) |
361 |
revert_options = self._set_apt_pkg_config(options) |
357 |
try: |
362 |
try: |
358 |
yield |
363 |
yield |
|
364 |
''' dont ever ask for user input ''' |
369 |
''' dont ever ask for user input ''' |
365 |
old_debian_frontend = os.environ.get('DEBIAN_FRONTEND') |
370 |
old_debian_frontend = os.environ.get('DEBIAN_FRONTEND') |
366 |
os.environ['DEBIAN_FRONTEND'] = 'noninteractive' |
371 |
os.environ['DEBIAN_FRONTEND'] = 'noninteractive' |
367 |
options = { |
372 |
options = [ |
368 |
'APT::Get::Assume-Yes': 'true', |
373 |
('APT::Get::Assume-Yes', 'true'), |
369 |
'APT::Get::force-yes': 'true', |
374 |
('APT::Get::force-yes', 'true'), |
370 |
'APT::Get::AllowUnauthenticated': '1', |
375 |
('DPkg::Options::', '--force-confold'), |
371 |
'DPkg::Options::': '--force-confold', |
376 |
] |
372 |
} |
|
|
373 |
revert_options = self._set_apt_pkg_config(options) |
377 |
revert_options = self._set_apt_pkg_config(options) |
374 |
try: |
378 |
try: |
375 |
yield |
379 |
yield |
|
440 |
for pkg in self.cache: |
444 |
for pkg in self.cache: |
441 |
yield pkg |
445 |
yield pkg |
442 |
|
446 |
|
|
|
447 |
def mark_auto(self, auto, *pkgs): |
448 |
'''Immediately sets packages to automatically |
449 |
installed (or not). Calls commit()!''' |
450 |
for pkg in self.get_packages(pkgs): |
451 |
pkg.mark_auto(auto) |
452 |
self.commit() |
453 |
self.reopen_cache() |
454 |
|
443 |
def mark(self, install, remove, dry_run=False): |
455 |
def mark(self, install, remove, dry_run=False): |
444 |
'''Marks packages, returns all |
456 |
'''Marks packages, returns all |
445 |
installed, removed or broken packages. |
457 |
installed, removed or broken packages. |
|
464 |
for pkg in self.cache.get_changes(): |
476 |
for pkg in self.cache.get_changes(): |
465 |
if pkg.marked_install or pkg.marked_upgrade: |
477 |
if pkg.marked_install or pkg.marked_upgrade: |
466 |
to_be_installed.add(pkg.name) |
478 |
to_be_installed.add(pkg.name) |
|
|
479 |
if apt_pkg.config.get('APT::Get::AllowUnauthenticated') != '1': |
480 |
authenticated = False |
481 |
for origin in pkg.candidate.origins: |
482 |
authenticated |= origin.trusted |
483 |
if not authenticated: |
484 |
self.progress_state.error('%s: %s' % (pkg.name, _('Untrusted origin'))) |
485 |
broken.add(pkg.name) |
467 |
if pkg.marked_delete: |
486 |
if pkg.marked_delete: |
468 |
to_be_removed.add(pkg.name) |
487 |
to_be_removed.add(pkg.name) |
469 |
if pkg.is_inst_broken: |
488 |
if pkg.is_inst_broken: |