コード例 #1
0
ファイル: tortugaDeployer.py プロジェクト: ilumb/tortuga
    def __getBaseKit(self):         \
            # pylint: disable=no-self-use

        kitApi = KitApi()

        k = None

        for k in kitApi.getKitList():
            if k.getName() == 'base':
                break
        else:
            raise ConfigurationError(
                'Unable to find \"base\" kit. Check Tortuga installation')

        return k
コード例 #2
0
class TortugaProxyConfig(TortugaCli):
    def __init__(self):
        super(TortugaProxyConfig, self).__init__(validArgCount=4)

        self._cm = ConfigManager()
        self._kitApi = KitApi()

    def parseArgs(self, usage=None):
        # TODO: add stuff here
        self.addOption('-f',
                       '--force',
                       action='store_true',
                       default=False,
                       dest='bForce',
                       help='Override built-in sanity checks')

        self.addOption('-n',
                       '--dry-run',
                       action='store_true',
                       dest='bDryRun',
                       default=False,
                       help='Do not write anything to disk')

        super().parseArgs(usage=usage)

    def runCommand(self):
        self.parseArgs()

        if self.getNArgs() < 1:
            self.usage()

            return

        action = self.getArgs()[0]

        if action == 'list':
            self._listProxies()
        elif action == 'add':
            if self.getNArgs() != 3:
                self.usage()
                return

            self._addProxy()
        elif action == 'delete':
            self._deleteProxy()
        else:
            raise InvalidArgument('Unknown directive [%s]' % (action))

    def _getProxyCfg(self):         \
            # pylint: disable=no-self-use

        cfg = configparser.ConfigParser()

        cfg.read('/opt/tortuga/config/base/apache-component.conf')

        return cfg

    def __get_proxy_set(self, cfg):         \
            # pylint: disable=no-self-use

        return set(cfg.get('proxy', 'proxy_list').split(' ')) \
            if cfg.has_option('proxy', 'proxy_list') else set()

    def _getProxyMap(self, cfg):
        proxyMap = {}

        if not cfg.has_section('proxy'):
            return proxyMap

        proxy_option_list = self.__get_proxy_set(cfg)

        for opt in proxy_option_list:
            if not cfg.has_option('proxy', opt):
                continue

            proxyMap[opt] = cfg.get('proxy', opt)

        return proxyMap

    def _writeProxyMap(self, cfg, proxyMap):
        if not cfg.has_section('proxy'):
            cfg.add_section('proxy')

        # Determine differences between what exists on disk and what has
        # just been removed.
        for deleted_option in self.__get_proxy_set(cfg) - set(proxyMap.keys()):
            if not cfg.has_option('proxy', deleted_option):
                continue

            cfg.remove_option('proxy', deleted_option)

        cfg.set('proxy', 'proxy_list', ' '.join(list(proxyMap.keys())))

        for key, value in proxyMap.items():
            cfg.set('proxy', key, value)

        proxyDict = dict(cfg.items('proxy'))

        if self.getArgs().bDryRun:
            print('[dryrun] %s' % (pprint.pformat(proxyDict)))
            return

        with open('/opt/tortuga/config/base/apache-component.conf', 'w') as fp:
            cfg.write(fp)

    def _addProxy(self):
        proxy_from = self.getArgs()[1]
        proxy_to = self.getArgs()[2]

        cfg = self._getProxyCfg()

        proxyMap = self._getProxyMap(cfg)

        if proxy_from in proxyMap:
            if proxy_to == proxyMap[proxy_from]:
                print('Proxy already mapped')

                sys.exit(1)

            if not self.getArgs().bForce:
                print('URI [%s] is already proxied to [%s]' %
                      (proxy_from, proxyMap[proxy_from]))

                sys.exit(1)

        proxyMap[proxy_from] = proxy_to

        self._writeProxyMap(cfg, proxyMap)

    def __find_kit_by_name_and_version(self, os_name, os_version):
        """
        Iterate over list of all installed kits looking for a name and
        version match only.

        Returns Kit object, otherwise None.
        """

        kit = None

        for kit in self._kitApi.getKitList():
            if kit.getName() == os_name and \
               kit.getVersion() == os_version:
                break
        else:
            return None

        return kit

    def __get_existing_kit_by_url(self, proxy_uri):
        """
        Given a proxy URI, determine if the path matches that of an
        installed kit. Returns Kit object or None.
        """

        uri_parts = proxy_uri.split('/')

        if len(uri_parts) != 5:
            # Short-circuit any check if the URI is longer/shorter than
            # a properly formatted Tortuga kit URL.
            return None

        # Check if this URI is formatted like valid OS kit URL

        os_name = uri_parts[2]
        os_version = uri_parts[3]
        os_arch = uri_parts[4]

        fake_url = self._cm.getYumRootUrl(
            'INSTALLER') + '/%s/%s/%s' % (os_name, os_version, os_arch)

        o = urllib.parse.urlparse(fake_url)

        if o.path != proxy_uri:
            # The paths don't start with the requisite Tortuga path
            return None

        version = os_version.split('-')

        # Check if supplied 'version' element of the path matches the
        # Tortuga convention.

        if len(version) == 1:
            # Possibly an OS kit
            # bOsKit = True if os_arch == 'x86_64' else None
            pass
        elif len(version) == 2:
            # Possibly a non-OS kit. Non-OS kits must have the 'arch'
            # set to 'noarch'
            # bOsKit = False if os_arch == 'noarch' else None
            pass
        else:
            # version element doesn't match Tortuga format
            return None

        return self.__find_kit_by_name_and_version(os_name, os_version)

    def _deleteProxy(self):
        proxy_path = self.getArgs()[1]

        cfg = self._getProxyCfg()

        proxyMap = self._getProxyMap(cfg)

        if proxy_path in proxyMap:
            existingKit = self.__get_existing_kit_by_url(proxy_path)

            if existingKit and not self.getArgs().bForce:
                print('WARNING: an installed %s [%s] matches this URL.'
                      ' Use \'--force\' to override this sanity check.' %
                      ('OS kit' if existingKit.getIsOs() else 'kit',
                       existingKit))

                sys.exit(1)

        if proxy_path not in proxyMap:
            print('Error: proxy path [%s] not found' % (proxy_path))

            sys.exit(1)

        del proxyMap[proxy_path]

        self._writeProxyMap(cfg, proxyMap)

    def _listProxies(self):
        cfg = self._getProxyCfg()

        for key, value in self._getProxyMap(cfg).items():
            print('%s -> %s' % (key, value))