-import time, os.path
+import time, os.path, textwrap
from zope.interface import implements
from twisted.application import service
from foolscap.api import Referenceable
import allmydata
from allmydata import node
from allmydata.util import log, rrefutil
+from allmydata.util.fileutil import abspath_expanduser_unicode
from allmydata.introducer.interfaces import \
RIIntroducerPublisherAndSubscriberService_v2
from allmydata.introducer.common import convert_announcement_v1_to_v2, \
convert_announcement_v2_to_v1, unsign_from_foolscap, make_index, \
get_tubid_string_from_ann, SubscriberDescriptor, AnnouncementDescriptor
+class FurlFileConflictError(Exception):
+ pass
+
class IntroducerNode(node.Node):
PORTNUMFILE = "introducer.port"
NODETYPE = "introducer"
GENERATED_FILES = ['introducer.furl']
- def __init__(self, basedir="."):
+ def __init__(self, basedir=u"."):
node.Node.__init__(self, basedir)
self.read_config()
self.init_introducer()
introducerservice = IntroducerService(self.basedir)
self.add_service(introducerservice)
+ old_public_fn = os.path.join(self.basedir, u"introducer.furl")
+ private_fn = os.path.join(self.basedir, u"private", u"introducer.furl")
+
+ if os.path.exists(old_public_fn):
+ if os.path.exists(private_fn):
+ msg = """This directory (%s) contains both an old public
+ 'introducer.furl' file, and a new-style
+ 'private/introducer.furl', so I cannot safely remove the old
+ one. Please make sure your desired FURL is in
+ private/introducer.furl, and remove the public file. If this
+ causes your Introducer's FURL to change, you need to inform
+ all grid members so they can update their tahoe.cfg.
+ """
+ raise FurlFileConflictError(textwrap.dedent(msg))
+ os.rename(old_public_fn, private_fn)
d = self.when_tub_ready()
def _publish(res):
- self.introducer_url = self.tub.registerReference(introducerservice,
- "introducer")
- self.log(" introducer is at %s" % self.introducer_url,
- umid="qF2L9A")
- self.write_config("introducer.furl", self.introducer_url + "\n")
+ furl = self.tub.registerReference(introducerservice,
+ furlFile=private_fn)
+ self.log(" introducer is at %s" % furl, umid="qF2L9A")
+ self.introducer_url = furl # for tests
d.addCallback(_publish)
d.addErrback(log.err, facility="tahoe.init",
level=log.BAD, umid="UaNs9A")
self.log("init_web(webport=%s)", args=(webport,), umid="2bUygA")
from allmydata.webish import IntroducerWebishServer
- nodeurl_path = os.path.join(self.basedir, "node.url")
- staticdir = self.get_config("node", "web.static", "public_html")
- staticdir = os.path.expanduser(staticdir)
+ nodeurl_path = os.path.join(self.basedir, u"node.url")
+ config_staticdir = self.get_config("node", "web.static", "public_html").decode('utf-8')
+ staticdir = abspath_expanduser_unicode(config_staticdir, base=self.basedir)
ws = IntroducerWebishServer(self, webport, nodeurl_path, staticdir)
self.add_service(ws)
def wrap_announce_v2(self, announcements):
anns_v1 = [convert_announcement_v2_to_v1(ann) for ann in announcements]
return self.original.callRemote("announce", set(anns_v1))
- def wrap_set_encoding_parameters(self, parameters):
- # note: unused
- return self.original.callRemote("set_encoding_parameters", parameters)
def notifyOnDisconnect(self, *args, **kwargs):
return self.original.notifyOnDisconnect(*args, **kwargs)
# tubid will be None. Also, subscribers do not tell us which
# pubkey they use; only publishers do that.
tubid = rref.getRemoteTubID() or "?"
- advertised_addresses = rrefutil.hosts_for_rref(rref)
remote_address = rrefutil.stringify_remote_address(rref)
# these three assume subscriber_info["version"]==0, but
# should tolerate other versions
# 'when' is the time they subscribed
sd = SubscriberDescriptor(service_name, when,
nickname, version, app_versions,
- advertised_addresses, remote_address,
- tubid)
+ remote_address, tubid)
s.append(sd)
return s