
'''WebRsync module for portage'''

import io
import logging

import portage
from portage import os
from portage.util import writemsg_level
from portage.util.futures import asyncio
from portage.output import create_color_func
good = create_color_func("GOOD")
bad = create_color_func("BAD")
warn = create_color_func("WARN")
from portage.sync.syncbase import SyncBase

try:
	from gemato.exceptions import GematoException
	import gemato.openpgp
except ImportError:
	gemato = None


class WebRsync(SyncBase):
	'''WebRSync sync class'''

	short_desc = "Perform sync operations on webrsync based repositories"

	@staticmethod
	def name():
		return "WebRSync"


	def __init__(self):
		SyncBase.__init__(self, 'emerge-webrsync', '>=sys-apps/portage-2.3')

	@property
	def has_bin(self):
		if (self._bin_command != 'emerge-delta-webrsync' and
			self.repo.module_specific_options.get(
			'sync-webrsync-delta', 'false').lower() in ('true', 'yes')):
			self._bin_command = 'emerge-delta-webrsync'
			self.bin_command = portage.process.find_binary(self._bin_command)
			self.bin_pkg = '>=app-portage/emerge-delta-webrsync-3.7.5'

		return super(WebRsync, self).has_bin

	def sync(self, **kwargs):
		'''Sync the repository'''
		if kwargs:
			self._kwargs(kwargs)

		if not self.has_bin:
			return (1, False)

		# filter these out to prevent gpg errors
		for var in ['uid', 'gid', 'groups']:
			self.spawn_kwargs.pop(var, None)

		verbose = '--verbose' in self.options['emerge_config'].opts
		quiet = '--quiet' in self.options['emerge_config'].opts
		openpgp_env = None
		try:
			if self.repo.module_specific_options.get(
				'sync-webrsync-verify-signature', 'false').lower() in ('true', 'yes'):

				if not self.repo.sync_openpgp_key_path:
					writemsg_level("!!! sync-openpgp-key-path is not set\n",
						level=logging.ERROR, noiselevel=-1)
					return (1, False)

				if not os.path.isfile(self.repo.sync_openpgp_key_path):
					writemsg_level("!!! sync-openpgp-key-path file not found: %s\n" %
						self.repo.sync_openpgp_key_path, level=logging.ERROR, noiselevel=-1)
					return (1, False)

				if gemato is None:
					writemsg_level("!!! Verifying against specified key requires gemato-11.0+ installed\n",
						level=logging.ERROR, noiselevel=-1)
					return (1, False)

				openpgp_env = gemato.openpgp.OpenPGPEnvironment()

				out = portage.output.EOutput(quiet=quiet)
				try:
					out.einfo('Using keys from %s' % (self.repo.sync_openpgp_key_path,))
					with io.open(self.repo.sync_openpgp_key_path, 'rb') as f:
						openpgp_env.import_key(f)
					self._refresh_keys(openpgp_env)
					self.spawn_kwargs["env"]["PORTAGE_GPG_DIR"] = openpgp_env.home
				except (GematoException, asyncio.TimeoutError) as e:
					writemsg_level("!!! Verification impossible due to keyring problem:\n%s\n"
							% (e,),
							level=logging.ERROR, noiselevel=-1)
					return (1, False)

			webrsync_cmd = [self.bin_command]
			if verbose:
				webrsync_cmd.append('-v')
			elif quiet:
				webrsync_cmd.append('-q')

			if self.repo.module_specific_options.get(
				'sync-webrsync-keep-snapshots', 'false').lower() in ('true', 'yes'):
				webrsync_cmd.append('-k')

			exitcode = portage.process.spawn(webrsync_cmd, **self.spawn_kwargs)
			if exitcode != os.EX_OK:
				msg = "!!! emerge-webrsync error in %s" % self.repo.location
				self.logger(self.xterm_titles, msg)
				writemsg_level(msg + "\n", level=logging.ERROR, noiselevel=-1)
				return (exitcode, False)
			return (exitcode, True)
		finally:
			if openpgp_env is not None:
				openpgp_env.close()


class PyWebRsync(SyncBase):
	'''WebRSync sync class'''

	short_desc = "Perform sync operations on webrsync based repositories"

	@staticmethod
	def name():
		return "WebRSync"


	def __init__(self):
		SyncBase.__init__(self, None, '>=sys-apps/portage-2.3')


	def sync(self, **kwargs):
		'''Sync the repository'''
		pass

