def _apt_get_dry_run(action, pkgs):
    apt_args = _apt_args()
    logger = LogCatcher(package_logger)
    success = call_process(['/usr/bin/apt-get'] + apt_args + [action, '-s'] +
                           pkgs,
                           logger=logger).returncode == 0
    install, remove, broken = [], [], []
    install_regex = re.compile('^(Inst) ([^ ]*?) \((.*?) ')
    upgrade_remove_regex = re.compile('^(Remv|Inst) ([^ ]*?) \[(.*?)\]')
    for line in logger.stdout():
        for regex in [install_regex, upgrade_remove_regex]:
            match = regex.match(line)
            if match:
                operation, pkg_name, version = match.groups()
                if operation == 'Inst':
                    install.append(pkg_name)
                elif operation == 'Remv':
                    remove.append(pkg_name)
                break
    if not success:
        for pkg in pkgs:
            if action == 'install' and pkg not in install:
                broken.append(pkg)
            if action == 'remove' and pkg not in remove:
                broken.append(pkg)
    return dict(zip(['install', 'remove', 'broken'],
                    [install, remove, broken]))
Beispiel #2
0
 def _update_converter_service(self, app):
     listener_file = '/usr/lib/univention-directory-listener/system/%s.py' % app.id
     if os.path.exists(listener_file):
         logger = LogCatcher()
         self._subprocess([
             'systemctl', 'is-enabled',
             'univention-appcenter-listener-converter@%s.service' % app.id
         ], logger)
         if list(logger.stdout()) == ['enabled']:
             self._subprocess([
                 'systemctl', 'restart',
                 'univention-appcenter-listener-converter@%s.service' %
                 app.id
             ])
         else:
             self._subprocess([
                 'systemctl', 'enable',
                 'univention-appcenter-listener-converter@%s.service' %
                 app.id
             ])
             self._subprocess([
                 'systemctl', 'start',
                 'univention-appcenter-listener-converter@%s.service' %
                 app.id
             ])
     else:
         self._subprocess([
             'systemctl', 'stop',
             'univention-appcenter-listener-converter@%s.service' % app.id
         ])
         self._subprocess([
             'systemctl', 'disable',
             'univention-appcenter-listener-converter@%s.service' % app.id
         ])
Beispiel #3
0
	def execute(self, query):
		logger = LogCatcher()
		process = call_process_as('postgres', ['/usr/bin/psql', '-tc', query], logger=logger)
		if process.returncode:
			for level, msg in logger.logs:
				if level == 'OUT':
					database_logger.info(msg)
				elif level == 'ERR':
					database_logger.warn(msg)
			raise DatabaseError('Returncode %s for query' % process.returncode)
		return list(logger.stdout())
Beispiel #4
0
	def start(self, attempts=2):
		service_name = self._get_service_name()
		if service_name:
			if call_process(['service', service_name, 'start'], database_logger).returncode:
				if attempts > 1:
					# try again. sometimes, under heavy load, mysql seems to fail to
					# start although it is just slow
					database_logger.info('Starting %s failed. Retrying...' % service_name)
					return self.start(attempts=attempts - 1)
				catcher = LogCatcher(database_logger)
				call_process(['service', service_name, 'status'], catcher)
				details = '\n'.join(catcher.stdstream())
				raise DatabaseCreationFailed('Could not start %s' % service_name, details=details)
Beispiel #5
0
	def _setup_docker_image(self, app, args):
		self._execute_container_script(app, 'restore_data_before_setup', credentials=False)
		if app.docker_script_setup:
			logger = LogCatcher(self.logger)
			try:
				process = self._execute_container_script(app, 'setup', args, cmd_kwargs={'_logger': logger})
				if not process or process.returncode != 0:
					code = -1
					if process:
						code = process.returncode
					raise InstallSetupFailed(code=code, stderr=list(logger.stderr()))
			finally:
				del logger
		self._execute_container_script(app, 'restore_data_after_setup', credentials=False)
 def _execute_container_script(self,
                               app,
                               interface,
                               args=None,
                               credentials=True,
                               output=False,
                               cmd_args=None,
                               cmd_kwargs=None):
     cmd_args = cmd_args or []
     cmd_kwargs = cmd_kwargs or {}
     self.log('Executing interface %s for %s' % (interface, app.id))
     docker = self._get_docker(app)
     interface_file = getattr(app, 'docker_script_%s' % interface)
     if not interface_file:
         self.log('No interface defined')
         return None
     remote_interface_script = app.get_cache_file(interface)
     container_interface_script = docker.path(interface_file)
     if os.path.exists(remote_interface_script):
         self.log('Copying App Center\'s %s to container\'s %s' %
                  (interface, interface_file))
         mkdir(os.path.dirname(container_interface_script))
         shutil.copy2(remote_interface_script, container_interface_script)
         os.chmod(container_interface_script, 0o755)  # -rwxr-xr-x
     if not os.path.exists(container_interface_script):
         self.warn('Interface script %s not found!' % interface_file)
         return None
     with docker.tmp_file() as error_file:
         with docker.tmp_file() as password_file:
             if credentials:
                 self._get_ldap_connection(
                     args,
                     allow_machine_connection=False,
                     allow_admin_connection=False
                 )  # to get a working username/password
                 username = self._get_username(args)
                 password = self._get_password(args)
                 with open(password_file.name, 'w') as f:
                     f.write(password)
                 cmd_kwargs['username'] = username
                 cmd_kwargs['password_file'] = password_file.container_path
             cmd_kwargs['error_file'] = error_file.container_path
             cmd_kwargs['app'] = app.id
             cmd_kwargs['app_version'] = app.version
             # locale = get_locale()
             # if locale:
             #	cmd_kwargs['locale'] = locale
             cmd_kwargs['_tty'] = False
             if output:
                 logger = LogCatcher(self.logger)
                 cmd_kwargs['_logger'] = logger
             process = docker.execute(interface_file, *cmd_args,
                                      **cmd_kwargs)
             if process.returncode != 0:
                 with open(error_file.name, 'r+b') as error_handle:
                     for line in error_handle:
                         self.fatal(line)
             if output:
                 return process, logger
             return process
	def main(self, args):
		lo, pos = self._get_ldap_connection(args, allow_machine_connection=True)
		first = True
		localhost = ucr_get('hostname')
		username = '******' % localhost
		pwdfile = '/etc/machine.secret'
		for obj in self.get_appcenter_hosts(lo, pos):
			if not first:
				self.log('')
			fqdn = obj.info.get('fqdn')
			self.log('%s:' % fqdn)
			logger = LogCatcher()
			output = self.manage(username % fqdn, pwdfile, logger, 'info')
			if output.has_stdout():
				for line in output.stdout():
					self.log(line)
			else:
				self.warn('Failed to get info')
				if output.has_stderr():
					for line in output.stderr():
						self.warn(line)
			first = False