Esempio n. 1
0
    def cleanup(self, **kwargs):
        if not self.is_local():
            return

        for name in os.listdir(self.etc_gridftp_d):
            if name.startswith("globus-connect-server") \
                        or name.startswith("globus-connect-multiuser") \
                        or name.startswith("gcmu"):
                os.remove(os.path.join(self.etc_gridftp_d, name))
        self.cleanup_trust_roots()
        self.cleanup_logging()
        self.stop()
        self.disable()
        endpoint_name = self.conf.get_endpoint_name()
        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        if kwargs.get("delete"):
            try:
                self.api.endpoint_delete(endpoint_name)
            except TransferAPIError as e:
                if e.status_code != 404:
                    raise e
        else:
            (status_code, status_reason, data) = \
                self.api.endpoint(endpoint_name)
            for sdata in data['DATA']:
                if sdata.get(
                        gcmu.to_unicode('uri')) == gcmu.to_unicode(server):
                    sid = sdata[gcmu.to_unicode('id')]
                    try:
                        self.api.endpoint_server_delete(endpoint_name, sid)
                    except TransferAPIError as e:
                        if e.status_code != 404:
                            raise e
Esempio n. 2
0
    def cleanup(self, **kwargs):
        if not self.is_local():
            return
        
        for name in os.listdir(self.etc_gridftp_d):
            if name.startswith("globus-connect-server") \
                        or name.startswith("globus-connect-multiuser") \
                        or name.startswith("gcmu"):
                os.remove(os.path.join(self.etc_gridftp_d, name))
        self.cleanup_trust_roots()
        self.cleanup_logging()
        self.stop()
        self.disable()
        endpoint_name = self.conf.get_endpoint_name()
        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        if kwargs.get("delete"):
            try:
                self.api.endpoint_delete(endpoint_name)
            except TransferAPIError as e:
                if e.status_code != 404:
                    raise e
        else:
            (status_code, status_reason, data) = \
                self.api.endpoint(endpoint_name)
            for sdata in data['DATA']:
                if sdata.get(gcmu.to_unicode('uri')) == gcmu.to_unicode(server):
                    sid = sdata[gcmu.to_unicode('id')]
                    try:
                        self.api.endpoint_server_delete(endpoint_name, sid)
                    except TransferAPIError as e:
                        if e.status_code != 404:
                            raise e
Esempio n. 3
0
    def cleanup(self, **kwargs):
        if not self.is_local():
            return
        
        for name in os.listdir(self.etc_gridftp_d):
            if name.startswith("globus-connect-server") \
                        or name.startswith("globus-connect-multiuser") \
                        or name.startswith("gcmu"):
                os.remove(os.path.join(self.etc_gridftp_d, name))
        self.cleanup_trust_roots()
        self.cleanup_logging()
        self.stop()
        self.disable()
        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        if kwargs.get("delete"):
            try:
                self.api.delete_endpoint(self.endpoint_xid)
                if os.path.exists(self.endpoint_id_file):
                    os.remove(self.endpoint_id_file)
            except GlobusAPIError as e:
                if e.http_status != 404:
                    raise e
        else:
            try:
                result = self.api.get_endpoint(self.endpoint_xid)
                data = result.data
            except GlobusAPIError as e:
                if e.http_status != 404:
                    raise e
                data = {'DATA':[]}

            for sdata in data['DATA']:
                if (sdata.get('uri') == gcmu.to_unicode(server)):
                    sid = sdata['id']
                    try:
                        self.api.delete_endpoint_server(
                            self.endpoint_xid, sid)
                    except GlobusAPIError as e:
                        if e.http_status != 404:
                            raise e
Esempio n. 4
0
    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
        """
        self.logger.debug("ENTER: IO.bind_to_endpoint()")
        endpoint_name = self.conf.get_endpoint_name()

        if endpoint_name is None:
            return

        if kwargs.get('force'):
            try:
                self.logger.debug("Removing old endpoint definition")
                self.api.endpoint_delete(endpoint_name)
            except:
                pass

        self.logger.debug("Configuring endpoint " + endpoint_name)
        endpoint_public = self.conf.get_endpoint_public()
        endpoint_default_dir = self.conf.get_endpoint_default_dir()

        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        oauth_server = None
        myproxy_server = None
        myproxy_dn = None
        if self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_OAUTH:
            oauth_server = self.conf.get_oauth_server()
            if oauth_server is None:
                raise Exception("Configured to use OAuth, but no OAuth server defined")
        elif self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_CILOGON:
            oauth_server = "cilogon.org"
        else:
            myproxy_server = self.conf.get_myproxy_server()
            myproxy_dn = self.conf.get_myproxy_dn()
            if myproxy_dn is None:
                myproxy_dn = self.get_myproxy_dn_from_server()

        if myproxy_server is not None:
            myproxy_server = gcmu.to_unicode(myproxy_server)
        if myproxy_dn is not None:
            myproxy_dn = gcmu.to_unicode(myproxy_dn)
        if oauth_server is not None:
            if ":" in oauth_server:
                raise Exception("[OAuth] Server value must be a public host name only")
            oauth_server = gcmu.to_unicode(oauth_server)

        new_gridftp_server = {
                u'DATA_TYPE': u'server',
                u'uri': gcmu.to_unicode(server),
                u'scheme': gcmu.to_unicode(scheme),
                u'hostname': gcmu.to_unicode(hostname),
                u'port': port,
                u'is_connected': True,
                u'subject': gcmu.to_unicode(security.get_certificate_subject(self.conf.get_security_certificate_file())),
                u'update': True,
        }

        try:
            (status_code, status_reason, data) = \
                self.api.endpoint(endpoint_name)
            old_default_dir = data.get("default_directory")
            changed = False
            if old_default_dir is None or \
                    old_default_dir != endpoint_default_dir:
                self.logger.debug("Changing default_directory on endpoint " \
                    "from [%(old)s] to [%(new)s]" % {
                            'old': str(old_default_dir),
                            'new': endpoint_default_dir
                    })
                data[u'default_directory'] = \
                        gcmu.to_unicode(endpoint_default_dir)

            old_public = data.get('public')
            if old_public is not None and old_public != endpoint_public:
                data[u'public'] = endpoint_public

            if kwargs.get("reset"):
                servers_filtered = [new_gridftp_server]
            else:
                servers_filtered = [x for x in data[u'DATA'] \
                    if x[u'hostname'] != None and
                       x[u'hostname'] != \
                            u'relay-disconnected.globusonline.org' and \
                       x[u'uri'] != gcmu.to_unicode(server)]
                servers_filtered.append(new_gridftp_server)
            data[u'DATA'] = servers_filtered
            data[u'myproxy_server'] = myproxy_server
            data[u'myproxy_dn'] = myproxy_dn
            data[u'oauth_server'] = oauth_server

            self.api.endpoint_update(endpoint_name, data)
        except TransferAPIError, e:
            if e.status_code == 404:
                self.logger.debug("endpoint %s does not exist, creating" 
                        %(endpoint_name))
                try:
                    (status_code, status_reason, data) = \
                        self.api.endpoint_create(
                            endpoint_name,
                            default_directory = endpoint_default_dir,
                            public = endpoint_public,
                            is_globus_connect = False,
                            hostname=new_gridftp_server[u'hostname'],
                            scheme=new_gridftp_server[u'scheme'],
                            port=new_gridftp_server[u'port'],
                            subject=new_gridftp_server[u'subject'],
                            myproxy_server=myproxy_server,
                            myproxy_dn=myproxy_dn,
                            oauth_server=oauth_server)
                except TransferAPIError, e:
                    self.logger.error("endpoint create failed: %s" % \
                        (e.message))
                    self.errorcount += 1
Esempio n. 5
0
        server = scheme + "://" + hostname + ":" + str(port)

        if kwargs.get("delete"):
            try:
                self.api.endpoint_delete(endpoint_name)
            except TransferAPIError, e:
                if e.status_code != 404:
                    raise e
        else:
            (status_code, status_reason, data) = \
                self.api.endpoint(endpoint_name)
            servers_filtered = [x for x in data[u'DATA'] \
                if x[u'hostname'] != None and
                   x[u'hostname'] != \
                       u'relay-disconnected.globusonline.org' and \
                   x[u'uri'] != gcmu.to_unicode(server)]
            data[u'DATA'] = servers_filtered
            try:
                self.api.endpoint_update(endpoint_name, data)
            except TransferAPIError, e:
                if e.status_code != 404:
                    raise e

    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
        """
Esempio n. 6
0
    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
        """
        self.logger.debug("ENTER: IO.bind_to_endpoint()")
        endpoint_name = self.conf.get_endpoint_name()

        if endpoint_name is None:
            return

        if kwargs.get('force'):
            try:
                self.logger.debug("Removing old endpoint definition")
                self.api.endpoint_delete(endpoint_name)
            except:
                pass

        self.logger.debug("Configuring endpoint " + endpoint_name)
        endpoint_public = self.conf.get_endpoint_public()
        endpoint_default_dir = self.conf.get_endpoint_default_dir()

        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        oauth_server = None
        myproxy_server = None
        myproxy_dn = None
        if self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_OAUTH:
            oauth_server = self.conf.get_oauth_server()
            if oauth_server is None:
                raise Exception(
                    "Configured to use OAuth, but no OAuth server defined")
        elif self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_CILOGON:
            oauth_server = "cilogon.org"
        else:
            myproxy_server = self.conf.get_myproxy_server()
            myproxy_dn = self.conf.get_myproxy_dn()
            if myproxy_dn is None and myproxy_server is not None:
                myproxy_dn = self.get_myproxy_dn_from_server()

        if myproxy_server is not None:
            myproxy_server = gcmu.to_unicode(myproxy_server)
        if myproxy_dn is not None:
            myproxy_dn = gcmu.to_unicode(myproxy_dn)
        if oauth_server is not None:
            if ":" in oauth_server:
                raise Exception(
                    "[OAuth] Server value must be a public host name only")
            oauth_server = gcmu.to_unicode(oauth_server)

        new_gridftp_server = {
            gcmu.to_unicode('DATA_TYPE'):
            gcmu.to_unicode('server'),
            gcmu.to_unicode('scheme'):
            gcmu.to_unicode(scheme),
            gcmu.to_unicode('hostname'):
            gcmu.to_unicode(hostname),
            gcmu.to_unicode('port'):
            port,
            gcmu.to_unicode('subject'):
            gcmu.to_unicode(
                security.get_certificate_subject(
                    self.conf.get_security_certificate_file()))
        }

        try:
            new_endpoint = {'DATA_TYPE': 'endpoint'}
            (status_code, status_reason, data) = \
                self.api.endpoint(endpoint_name)
            default_directory_key = gcmu.to_unicode('default_directory')
            public_key = gcmu.to_unicode('public')
            myproxy_server_key = gcmu.to_unicode('myproxy_server')
            myproxy_dn_key = gcmu.to_unicode('myproxy_dn')
            oauth_server_key = gcmu.to_unicode('oauth_server')
            hostname_key = gcmu.to_unicode('hostname')
            id_key = gcmu.to_unicode('id')
            data_key = gcmu.to_unicode('DATA')

            # Update any changed endpoint-level metadata
            if data.get(default_directory_key) != endpoint_default_dir:
                self.logger.debug("Changing default_directory on endpoint " \
                    "to [%(new)s]" % { 'new': endpoint_default_dir })
                new_endpoint[default_directory_key] = \
                        gcmu.to_unicode(endpoint_default_dir)

            if data.get(public_key) != endpoint_public:
                self.logger.debug("Changing public to " + str(endpoint_public))
                new_endpoint[public_key] = endpoint_public

            if data.get(myproxy_server_key) != myproxy_server:
                self.logger.debug("Changing myproxy_server to " +
                                  str(myproxy_server))
                new_endpoint[myproxy_server_key] = myproxy_server

            if data.get(myproxy_dn_key) != myproxy_dn:
                self.logger.debug("Changing myproxy_dn to " + str(myproxy_dn))
                new_endpoint[myproxy_dn_key] = myproxy_dn

            if data.get(oauth_server_key) != oauth_server:
                self.logger.debug("Changing oauth_server to " +
                                  str(oauth_server))
                new_endpoint[oauth_server_key] = oauth_server

            if len(new_endpoint.keys()) > 1:
                self.logger.debug("Updating endpoint")
                (status_code, status, data) = \
                    self.api.endpoint_update(endpoint_name, new_endpoint)
                self.logger.debug("endpoint update result: " +
                                  str(status_code))

            (status_code, status_reason, data) = \
                    self.api.endpoint_server_list(endpoint_name)
            self.logger.debug("Existing endpoint server list: " +
                              str(data.get(data_key, [])))
            for server_item in data.get(data_key, []):
                self.logger.debug("existing server for endpoint: " +
                                  str(server_item.get(hostname_key, "")))
                this_server_hostname = server_item.get(hostname_key)
                this_server_id = server_item.get(id_key)
                if kwargs.get('reset') or \
                        this_server_hostname == gcmu.to_unicode(hostname):
                    self.logger.debug("deleting server entry for " +
                                      str(this_server_hostname) +
                                      " with id  " + str(this_server_id))
                    self.api.endpoint_server_delete(endpoint_name,
                                                    this_server_id)
            self.api.endpoint_server_add(endpoint_name, new_gridftp_server)
        except TransferAPIError as e:
            if e.status_code == 404:
                self.logger.debug("endpoint %s does not exist, creating" %
                                  (endpoint_name))
                try:
                    (status_code, status_reason, data) = \
                        self.api.endpoint_create(
                            endpoint_name,
                            default_directory = endpoint_default_dir,
                            public = endpoint_public,
                            is_globus_connect = False,
                            hostname=new_gridftp_server['hostname'],
                            scheme=new_gridftp_server['scheme'],
                            port=new_gridftp_server['port'],
                            subject=new_gridftp_server['subject'],
                            myproxy_server=myproxy_server,
                            myproxy_dn=myproxy_dn,
                            oauth_server=oauth_server)
                except TransferAPIError as e:
                    self.logger.error("endpoint create failed: %s" % \
                        (e.message))
                    self.errorcount += 1
            else:
                self.logger.error("endpoint failed: %s" % (e.message))
                self.errorcount += 1
        self.logger.debug("EXIT: IO.bind_to_endpoint()")
Esempio n. 7
0
    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
        """
        self.logger.debug("ENTER: IO.bind_to_endpoint()")
        endpoint_name = self.conf.get_endpoint_name()

        if endpoint_name is None:
            return

        if kwargs.get("force"):
            try:
                self.logger.debug("Removing old endpoint definition")
                self.api.endpoint_delete(endpoint_name)
            except:
                pass

        self.logger.debug("Configuring endpoint " + endpoint_name)
        endpoint_public = self.conf.get_endpoint_public()
        endpoint_default_dir = self.conf.get_endpoint_default_dir()

        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        oauth_server = None
        myproxy_server = None
        myproxy_dn = None
        if self.conf.get_security_identity_method() == self.conf.IDENTITY_METHOD_OAUTH:
            oauth_server = self.conf.get_oauth_server()
            if oauth_server is None:
                raise Exception("Configured to use OAuth, but no OAuth server defined")
        elif self.conf.get_security_identity_method() == self.conf.IDENTITY_METHOD_CILOGON:
            oauth_server = "cilogon.org"
        else:
            myproxy_server = self.conf.get_myproxy_server()
            myproxy_dn = self.conf.get_myproxy_dn()
            if myproxy_dn is None:
                myproxy_dn = self.get_myproxy_dn_from_server()

        if myproxy_server is not None:
            myproxy_server = gcmu.to_unicode(myproxy_server)
        if myproxy_dn is not None:
            myproxy_dn = gcmu.to_unicode(myproxy_dn)
        if oauth_server is not None:
            if ":" in oauth_server:
                raise Exception("[OAuth] Server value must be a public host name only")
            oauth_server = gcmu.to_unicode(oauth_server)

        new_gridftp_server = {
            u"DATA_TYPE": u"server",
            u"uri": gcmu.to_unicode(server),
            u"scheme": gcmu.to_unicode(scheme),
            u"hostname": gcmu.to_unicode(hostname),
            u"port": port,
            u"is_connected": True,
            u"subject": gcmu.to_unicode(security.get_certificate_subject(self.conf.get_security_certificate_file())),
            u"update": True,
        }

        try:
            (status_code, status_reason, data) = self.api.endpoint(endpoint_name)
            old_default_dir = data.get("default_directory")
            changed = False
            if old_default_dir is None or old_default_dir != endpoint_default_dir:
                self.logger.debug(
                    "Changing default_directory on endpoint "
                    "from [%(old)s] to [%(new)s]" % {"old": str(old_default_dir), "new": endpoint_default_dir}
                )
                data[u"default_directory"] = gcmu.to_unicode(endpoint_default_dir)

            old_public = data.get("public")
            if old_public is not None and old_public != endpoint_public:
                data[u"public"] = endpoint_public

            if kwargs.get("reset"):
                servers_filtered = [new_gridftp_server]
            else:
                servers_filtered = [
                    x
                    for x in data[u"DATA"]
                    if x[u"hostname"] != None
                    and x[u"hostname"] != u"relay-disconnected.globusonline.org"
                    and x[u"uri"] != gcmu.to_unicode(server)
                ]
                servers_filtered.append(new_gridftp_server)
            data[u"DATA"] = servers_filtered
            data[u"myproxy_server"] = myproxy_server
            data[u"myproxy_dn"] = myproxy_dn
            data[u"oauth_server"] = oauth_server

            self.api.endpoint_update(endpoint_name, data)
        except TransferAPIError, e:
            if e.status_code == 404:
                self.logger.debug("endpoint %s does not exist, creating" % (endpoint_name))
                try:
                    (status_code, status_reason, data) = self.api.endpoint_create(
                        endpoint_name,
                        default_directory=endpoint_default_dir,
                        public=endpoint_public,
                        is_globus_connect=False,
                        hostname=new_gridftp_server[u"hostname"],
                        scheme=new_gridftp_server[u"scheme"],
                        port=new_gridftp_server[u"port"],
                        subject=new_gridftp_server[u"subject"],
                        myproxy_server=myproxy_server,
                        myproxy_dn=myproxy_dn,
                        oauth_server=oauth_server,
                    )
                except TransferAPIError, e:
                    self.logger.error("endpoint create failed: %s" % (e.message))
                    self.errorcount += 1
Esempio n. 8
0
        server = scheme + "://" + hostname + ":" + str(port)

        if kwargs.get("delete"):
            try:
                self.api.endpoint_delete(endpoint_name)
            except TransferAPIError, e:
                if e.status_code != 404:
                    raise e
        else:
            (status_code, status_reason, data) = self.api.endpoint(endpoint_name)
            servers_filtered = [
                x
                for x in data[u"DATA"]
                if x[u"hostname"] != None
                and x[u"hostname"] != u"relay-disconnected.globusonline.org"
                and x[u"uri"] != gcmu.to_unicode(server)
            ]
            data[u"DATA"] = servers_filtered
            try:
                self.api.endpoint_update(endpoint_name, data)
            except TransferAPIError, e:
                if e.status_code != 404:
                    raise e

    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
Esempio n. 9
0
    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
        """
        self.logger.debug("ENTER: IO.bind_to_endpoint()")
        endpoint_name = self.conf.get_endpoint_name()

        if endpoint_name is None:
            return

        if kwargs.get('force'):
            try:
                self.logger.debug("Removing old endpoint definition")
                self.api.endpoint_delete(endpoint_name)
            except:
                pass

        self.logger.debug("Configuring endpoint " + endpoint_name)
        endpoint_public = self.conf.get_endpoint_public()
        endpoint_default_dir = self.conf.get_endpoint_default_dir()

        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        oauth_server = None
        myproxy_server = None
        myproxy_dn = None
        if self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_OAUTH:
            oauth_server = self.conf.get_oauth_server()
            if oauth_server is None:
                raise Exception("Configured to use OAuth, but no OAuth server defined")
        elif self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_CILOGON:
            oauth_server = "cilogon.org"
        else:
            myproxy_server = self.conf.get_myproxy_server()
            myproxy_dn = self.conf.get_myproxy_dn()
            if myproxy_dn is None:
                myproxy_dn = self.get_myproxy_dn_from_server()

        if myproxy_server is not None:
            myproxy_server = gcmu.to_unicode(myproxy_server)
        if myproxy_dn is not None:
            myproxy_dn = gcmu.to_unicode(myproxy_dn)
        if oauth_server is not None:
            if ":" in oauth_server:
                raise Exception("[OAuth] Server value must be a public host name only")
            oauth_server = gcmu.to_unicode(oauth_server)

        new_gridftp_server = {
                gcmu.to_unicode('DATA_TYPE'): gcmu.to_unicode('server'),
                gcmu.to_unicode('scheme'): gcmu.to_unicode(scheme),
                gcmu.to_unicode('hostname'): gcmu.to_unicode(hostname),
                gcmu.to_unicode('port'): port,
                gcmu.to_unicode('subject'): gcmu.to_unicode(security.get_certificate_subject(self.conf.get_security_certificate_file()))
        }

        try:
            new_endpoint = {
                'DATA_TYPE': 'endpoint'
            }
            (status_code, status_reason, data) = \
                self.api.endpoint(endpoint_name)
            default_directory_key = gcmu.to_unicode('default_directory')
            public_key = gcmu.to_unicode('public')
            myproxy_server_key = gcmu.to_unicode('myproxy_server')
            myproxy_dn_key = gcmu.to_unicode('myproxy_dn')
            oauth_server_key = gcmu.to_unicode('oauth_server')
            hostname_key = gcmu.to_unicode('hostname')
            id_key = gcmu.to_unicode('id')
            data_key = gcmu.to_unicode('DATA')

            # Update any changed endpoint-level metadata
            if data.get(default_directory_key) != endpoint_default_dir:
                self.logger.debug("Changing default_directory on endpoint " \
                    "to [%(new)s]" % { 'new': endpoint_default_dir })
                new_endpoint[default_directory_key] = \
                        gcmu.to_unicode(endpoint_default_dir)

            if data.get(public_key) != endpoint_public:
                self.logger.debug("Changing public to " + str(endpoint_public))
                new_endpoint[public_key] = endpoint_public

            if data.get(myproxy_server_key) != myproxy_server:
                self.logger.debug("Changing myproxy_server to " + str(myproxy_server))
                new_endpoint[myproxy_server_key] = myproxy_server

            if data.get(myproxy_dn_key) != myproxy_dn:
                self.logger.debug("Changing myproxy_dn to " + str(myproxy_dn))
                new_endpoint[myproxy_dn_key] = myproxy_dn

            if data.get(oauth_server_key) != oauth_server:
                self.logger.debug("Changing oauth_server to " + str(oauth_server))
                new_endpoint[oauth_server_key] = oauth_server

            if len(new_endpoint.keys()) > 1:
                self.logger.debug("Updating endpoint")
                (status_code, status, data) = \
                    self.api.endpoint_update(endpoint_name, new_endpoint)
                self.logger.debug("endpoint update result: " + str(status_code))

            (status_code, status_reason, data) = \
                    self.api.endpoint_server_list(endpoint_name)
            self.logger.debug("Existing endpoint server list: " + 
                    str(data.get(data_key, [])))
            for server_item in data.get(data_key, []):
                self.logger.debug("existing server for endpoint: " +
                        str(server_item.get(hostname_key, "")))
                this_server_hostname = server_item.get(hostname_key)
                this_server_id = server_item.get(id_key)
                if kwargs.get('reset') or \
                        this_server_hostname == gcmu.to_unicode(hostname):
                    self.logger.debug("deleting server entry for " +
                            str(this_server_hostname) + " with id  " +
                            str(this_server_id))
                    self.api.endpoint_server_delete(endpoint_name,
                            this_server_id)
            self.api.endpoint_server_add(endpoint_name, new_gridftp_server)
        except TransferAPIError as e:
            if e.status_code == 404:
                self.logger.debug("endpoint %s does not exist, creating" 
                        %(endpoint_name))
                try:
                    (status_code, status_reason, data) = \
                        self.api.endpoint_create(
                            endpoint_name,
                            default_directory = endpoint_default_dir,
                            public = endpoint_public,
                            is_globus_connect = False,
                            hostname=new_gridftp_server['hostname'],
                            scheme=new_gridftp_server['scheme'],
                            port=new_gridftp_server['port'],
                            subject=new_gridftp_server['subject'],
                            myproxy_server=myproxy_server,
                            myproxy_dn=myproxy_dn,
                            oauth_server=oauth_server)
                except TransferAPIError as e:
                    self.logger.error("endpoint create failed: %s" % \
                        (e.message))
                    self.errorcount += 1
            else:
                self.logger.error("endpoint failed: %s" % (e.message))
                self.errorcount += 1
        self.logger.debug("EXIT: IO.bind_to_endpoint()")
Esempio n. 10
0
    def bind_to_endpoint(self, **kwargs):
        """
        Adds this gridftp server to the endpoint named in the configuration
        file. If force=True is passed, then the endpoint is deleted prior
        to binding this gridftp server. If reset=True is passed, then
        all other GridFTP servers will be removed from this endpoint before
        adding this one.
        """
        self.logger.debug("ENTER: IO.bind_to_endpoint()")

        if self.endpoint_xid is None:
            return

        if kwargs.get('force'):
            try:
                self.logger.debug("Removing old endpoint definition")
                self.api.endpoint_delete(self.endpoint_xid)
                if os.path.exists(self.endpoint_id_file):
                    os.remove(self.endpoint_id_file)
                self.endpoint_xid = urllib_parse.quote(
                    self.conf.get_endpoint_name())
            except:
                pass

        self.logger.debug("Configuring endpoint " + self.endpoint_xid)
        endpoint_public = self.conf.get_endpoint_public()
        endpoint_default_dir = self.conf.get_endpoint_default_dir()

        server = self.conf.get_gridftp_server()
        scheme = "gsiftp"
        port = 2811
        hostname = None

        if "://" in server:
            (scheme, server) = server.split("://", 1)

        if ":" in server:
            (hostname, port_s) = server.split(":", 1)
            port = int(port_s)
        else:
            hostname = server
        server = scheme + "://" + hostname + ":" + str(port)

        oauth_server = None
        myproxy_server = None
        myproxy_dn = None
        if self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_OAUTH:
            oauth_server = self.conf.get_oauth_server()
            if oauth_server is None:
                raise Exception("Configured to use OAuth, but no OAuth server defined")
        elif self.conf.get_security_identity_method() == \
                self.conf.IDENTITY_METHOD_CILOGON:
            oauth_server = "cilogon.org"
        else:
            myproxy_server = self.conf.get_myproxy_server()
            myproxy_dn = self.conf.get_myproxy_dn()
            if myproxy_dn is None and myproxy_server is not None:
                myproxy_dn = self.get_myproxy_dn_from_server()

        if myproxy_server is not None:
            myproxy_server = gcmu.to_unicode(myproxy_server)
        if myproxy_dn is not None:
            myproxy_dn = gcmu.to_unicode(myproxy_dn)
        if oauth_server is not None:
            if ":" in oauth_server:
                raise Exception("[OAuth] Server value must be a public host name only")
            oauth_server = gcmu.to_unicode(oauth_server)

        new_gridftp_server = {
                gcmu.to_unicode('DATA_TYPE'): gcmu.to_unicode('server'),
                gcmu.to_unicode('scheme'): gcmu.to_unicode(scheme),
                gcmu.to_unicode('hostname'): gcmu.to_unicode(hostname),
                gcmu.to_unicode('port'): port,
                gcmu.to_unicode('subject'): gcmu.to_unicode(security.get_certificate_subject(self.conf.get_security_certificate_file()))
        }

        try:
            new_endpoint = {
                'DATA_TYPE': 'endpoint'
            }
            result = self.api.get_endpoint(self.endpoint_xid)
            data = result.data
            default_directory_key = 'default_directory'
            public_key = 'public'
            myproxy_server_key = 'myproxy_server'
            myproxy_dn_key = 'myproxy_dn'
            oauth_server_key = 'oauth_server'
            hostname_key = 'hostname'
            id_key = 'id'
            data_key = 'DATA'

            # Update any changed endpoint-level metadata
            if data.get(default_directory_key) != endpoint_default_dir:
                self.logger.debug(
                    "Changing default_directory on endpoint "
                    "to [{}]".format(endpoint_default_dir))
                new_endpoint[default_directory_key] = endpoint_default_dir

            if data.get(public_key) != endpoint_public:
                self.logger.debug("Changing public to " + str(endpoint_public))
                new_endpoint[public_key] = endpoint_public

            if data.get(myproxy_server_key) != myproxy_server:
                self.logger.debug(
                    "Changing myproxy_server to " + str(myproxy_server))
                new_endpoint[myproxy_server_key] = myproxy_server

            if data.get(myproxy_dn_key) != myproxy_dn:
                self.logger.debug("Changing myproxy_dn to " + str(myproxy_dn))
                new_endpoint[myproxy_dn_key] = myproxy_dn

            if data.get(oauth_server_key) != oauth_server:
                self.logger.debug(
                    "Changing oauth_server to " + str(oauth_server))
                new_endpoint[oauth_server_key] = oauth_server

            if len(new_endpoint.keys()) > 1:
                self.logger.debug("Updating endpoint")
                result = self.api.update_endpoint(
                    self.endpoint_xid, new_endpoint)
                self.logger.debug("endpoint update result: {}".format(
                    result.http_status))
                self.logger.debug("endpoint update data: {}".format(
                    result.data))
                returned_id = result.data.get('resource', '').split('/')[-1]
                if self.endpoint_xid != returned_id and returned_id != '':
                    self._update_xid(returned_id)

            result = self.api.endpoint_server_list(self.endpoint_xid)
            data = result.data
            self.logger.debug(
                "Existing endpoint server list: "
                + str(data.get(data_key, [])))
            for server_item in data.get(data_key, []):
                self.logger.debug(
                    "existing server for endpoint: "
                    + str(server_item.get(hostname_key, "")))
                this_server_hostname = server_item.get(hostname_key)
                this_server_id = server_item.get(id_key)
                if (kwargs.get('reset')
                        or this_server_hostname == gcmu.to_unicode(hostname)):
                    self.logger.debug(
                        "deleting server entry for "
                        + str(this_server_hostname) + " with id  "
                        + str(this_server_id))
                    self.api.delete_endpoint_server(
                        self.endpoint_xid, this_server_id)
            self.api.add_endpoint_server(
                self.endpoint_xid, new_gridftp_server)
        except GlobusAPIError as e:
            if e.http_status == 404:
                self.logger.debug(
                    "endpoint {} does not exist, creating" .format(
                        self.endpoint_xid))
                try:
                    result = self.api.create_endpoint(dict(
                        canonical_name=self.conf.get_endpoint_name(),
                        default_directory=endpoint_default_dir,
                        public=endpoint_public,
                        is_globus_connect=False,
                        DATA=[dict(
                            DATA_TYPE="server",
                            hostname=new_gridftp_server['hostname'],
                            scheme=new_gridftp_server['scheme'],
                            port=new_gridftp_server['port'],
                            subject=new_gridftp_server['subject'])],
                        myproxy_server=myproxy_server,
                        myproxy_dn=myproxy_dn,
                        oauth_server=oauth_server))
                    if self.endpoint_xid != result.data['id']:
                        self._update_xid(result.data['id'])
                except GlobusAPIError as e:
                    self.logger.error("endpoint create failed: %s" % \
                        (e.message))
                    self.errorcount += 1
            else:
                self.logger.error("endpoint failed: %s" % (e.message))
                self.errorcount += 1
        self.logger.debug("EXIT: IO.bind_to_endpoint()")