示例#1
0
文件: client.py 项目: LukeCarrier/hn
    def __init__(self, cli_args, config_dir):
        """
        TODO: break this stupidly huge method down
        """

        super().__init__(cli_args, config_dir)

        if self._args.config_action == 'key':
            try:
                with open(self._args.privkey, 'rb') as key:
                    key_blob = key.read()
            except IOError:
                print('Failed: the specified private key does not exist',
                      file=sys.stderr)
                sys.exit(64)

            gpg = GPG(gnupghome=os.path.join(config_dir, 'gpg'))
            result = gpg.import_keys(key_blob)
            try:
                if not self._config.has_section('client'):
                    self._config.add_section('client')
                self._config['client']['privkey'] = result.fingerprints[0]

            except IndexError:
                print('Failed: the specified private key is invalid')

            with open(os.path.join(config_dir, 'client.ini'), 'w') as c:
                self._config.write(c)

        elif self._args.config_action == 'node':
            if self._args.config_node_action == 'add':

                try:
                    with open(self._args.pubkey, 'rb') as key:
                        key_blob = key.read()
                except IOError:
                    print('Failed: the specified public key does not exist', file=sys.stderr)
                    sys.exit(64)

                gpg = GPG(gnupghome=os.path.join(config_dir, 'gpg'))
                result = gpg.import_keys(key_blob)
                try:
                    key_fingerprint = result.fingerprints[0]
                    gpg.sign_key(result.fingerprints[0])
                    gpg.trust_key(result.fingerprints[0])
                except IndexError:
                    print('Failed: the specified public key is invalid', file=sys.stderr)
                    sys.exit(64)

                try:
                    (addr, port) = self._args.addr.rsplit(':')
                except ValueError:
                    (addr, port) = (self._args.addr, "3030")

                try:
                    self._servers.add_section(self._args.name)
                    self._servers.set(self._args.name, 'addr',   "%s:%s" %(addr, port))
                    self._servers.set(self._args.name, 'pubkey', key_fingerprint)
                except configparser.DuplicateSectionError:
                    print('Failed: a node with the specified name already exists', file=sys.stderr)
                    sys.exit(64)

            elif self._args.config_node_action == 'list':
                for (name, node) in self._servers.items():
                    if name == 'DEFAULT':
                        continue

                    print(name)
                    print('    Address:', node.get('addr'))
                    print('Fingerprint:', node.get('pubkey'))
                    print(' ')

            elif self._args.config_node_action == 'rm':
                if not self._servers.remove_section(self._args.name):
                    print('Failed: no server exists with the specified name')
                    sys.exit(64)

            elif self._args.config_node_action == 'show':
                try:
                    node = self._servers[self._args.name]
                    print(self._args.name)
                    print('    Address:', node['addr'])
                    print('Fingerprint:', node['pubkey'])
                except IndexError:
                    print('Failed: no server exists with the specified name')
                    sys.exit(64)

            with open(os.path.join(self._config_dir, 'servers.ini'), 'w') as f:
                self._servers.write(f)