From 69b65b6b015482fd43b2912d1fcc15e5ec9eb5f1 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Wed, 12 Dec 2007 20:31:01 -0700
Subject: [PATCH] remove logpublisher, use the Foolscap version now that this
 functionality has been moved into Foolscap-0.2.2

---
 src/allmydata/logpublisher.py   | 86 ---------------------------------
 src/allmydata/node.py           | 30 +++++++-----
 src/allmydata/test/test_node.py | 19 +-------
 src/allmydata/test/test_util.py |  4 +-
 4 files changed, 20 insertions(+), 119 deletions(-)
 delete mode 100644 src/allmydata/logpublisher.py

diff --git a/src/allmydata/logpublisher.py b/src/allmydata/logpublisher.py
deleted file mode 100644
index 0718dcf7..00000000
--- a/src/allmydata/logpublisher.py
+++ /dev/null
@@ -1,86 +0,0 @@
-
-import os.path
-from zope.interface import implements
-from twisted.application import service
-from twisted.python import log
-from foolscap import Referenceable, RemoteInterface
-from foolscap.schema import DictOf, Any
-from allmydata import get_package_versions
-
-class RILogObserver(RemoteInterface):
-    def msg(logmsg=DictOf(str, Any())):
-        return None
-class RISubscription(RemoteInterface):
-    pass
-
-class RILogPublisher(RemoteInterface):
-    def get_versions():
-        return DictOf(str, str)
-    def subscribe_to_all(observer=RILogObserver):
-        return RISubscription
-    def unsubscribe(subscription=Any()):
-        # I don't know how to get the constraint right: unsubscribe() should
-        # accept return value of subscribe_to_all()
-        return None
-
-class RILogGatherer(RemoteInterface):
-    def logport(nodeid=str, logport=RILogPublisher):
-        return None
-
-class Subscription(Referenceable):
-    implements(RISubscription)
-
-class LogPublisher(Referenceable, service.MultiService):
-    implements(RILogPublisher)
-    name = "log_publisher"
-
-    def __init__(self):
-        service.MultiService.__init__(self)
-        self._subscribers = {}
-        self._notifyOnDisconnectors = {}
-
-    def startService(self):
-        service.MultiService.startService(self)
-        furlfile = os.path.join(self.parent.basedir, "logport.furl")
-        self.parent.tub.registerReference(self, furlFile=furlfile)
-        os.chmod(furlfile, 0600)
-
-        log.addObserver(self._twisted_log_observer)
-
-    def stopService(self):
-        log.removeObserver(self._twisted_log_observer)
-        return service.MultiService.stopService(self)
-
-    def _twisted_log_observer(self, d):
-        # Twisted will remove this for us if it fails.
-
-        # keys:
-        #  ['message']: *args
-        #  ['time']: float
-        #  ['isError']: bool, usually False
-        #  ['system']: string
-
-        for o in self._subscribers.values():
-            o.callRemoteOnly("msg", d)
-
-        #f = open("/tmp/f.out", "a")
-        #print >>f, d['message']
-        #f.close()
-
-    def remote_get_versions(self):
-        # Convert all the version instances to strings.
-        return dict([(k,str(v))
-                     for k,v in get_package_versions().iteritems()])
-
-    def remote_subscribe_to_all(self, observer):
-        s = Subscription()
-        self._subscribers[s] = observer
-        c = observer.notifyOnDisconnect(self.remote_unsubscribe, s)
-        self._notifyOnDisconnectors[s] = c
-        return s
-
-    def remote_unsubscribe(self, s):
-        observer = self._subscribers.pop(s)
-        c = self._notifyOnDisconnectors.pop(s)
-        observer.dontNotifyOnDisconnect(c)
-
diff --git a/src/allmydata/node.py b/src/allmydata/node.py
index 53281229..e955849c 100644
--- a/src/allmydata/node.py
+++ b/src/allmydata/node.py
@@ -10,7 +10,18 @@ from allmydata import get_package_versions_string
 from allmydata.util import log as tahoe_log
 from allmydata.util import iputil, observer, humanreadable
 from allmydata.util.assertutil import precondition
-from allmydata.logpublisher import LogPublisher
+
+# Just to get their versions:
+import allmydata, pycryptopp, zfec
+
+from foolscap.logging.publish import LogPublisher
+# Add our application versions to the data that Foolscap's
+# LogPublisher reports. Our __version__ attributes are actually
+# instances of allmydata.util.version_class.Version, so convert them
+# into strings first.
+LogPublisher.versions['allmydata'] = str(allmydata.__version__)
+LogPublisher.versions['zfec'] = str(zfec.__version__)
+LogPublisher.versions['pycryptopp'] = str(pycryptopp.__version__)
 
 # group 1 will be addr (dotted quad string), group 3 if any will be portnum (string)
 ADDR_RE=re.compile("^([1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*)(:([1-9][0-9]*))?$")
@@ -177,6 +188,11 @@ class Node(service.MultiService):
                     ob.formatTime = newmeth
         # TODO: twisted >2.5.0 offers maxRotatedFiles=50
 
+        self.tub.setOption("logport-furlfile",
+                           os.path.join(self.basedir, "logport.furl"))
+        self.tub.setOption("log-gatherer-furlfile",
+                           os.path.join(self.basedir, "log_gatherer.furl"))
+
     def log(self, msg, src="", args=(), **kw):
         if src:
             logsrc = src
@@ -222,17 +238,7 @@ class Node(service.MultiService):
 
     def tub_ready(self):
         # called when the Tub is available for registerReference
-        self.setup_log_publisher()
-
-    def setup_log_publisher(self):
-        self.add_service(LogPublisher())
-        log_gatherer_furl = self.get_config("log_gatherer.furl")
-        if log_gatherer_furl:
-            self.tub.connectTo(log_gatherer_furl, self._log_gatherer_connected)
-
-    def _log_gatherer_connected(self, rref):
-        rref.callRemote("logport",
-                        self.nodeid, self.getServiceNamed("log_publisher"))
+        pass
 
     def when_tub_ready(self):
         return self._tub_ready_observerlist.when_fired()
diff --git a/src/allmydata/test/test_node.py b/src/allmydata/test/test_node.py
index dc354cf2..352ae6ba 100644
--- a/src/allmydata/test/test_node.py
+++ b/src/allmydata/test/test_node.py
@@ -1,17 +1,13 @@
 
 import os, time
-from zope.interface import implements
 from twisted.trial import unittest
 from twisted.internet import defer
 from twisted.python import log
 
-from foolscap import Tub, Referenceable
-from foolscap.eventual import fireEventually, flushEventualQueue
+from foolscap.eventual import flushEventualQueue
 from twisted.application import service
-import allmydata
 from allmydata.node import Node, formatTimeTahoeStyle
 from allmydata.util import testutil, fileutil
-from allmydata import logpublisher
 
 class LoggingMultiService(service.MultiService):
     def log(self, msg, **kw):
@@ -59,16 +55,3 @@ class TestCase(unittest.TestCase, testutil.SignalMixin):
         self.failUnless("Z" in t)
         t2 = formatTimeTahoeStyle("ignored", int(time.time()))
         self.failUnless("Z" in t2)
-
-class Gatherer(Referenceable):
-    implements(logpublisher.RILogGatherer)
-    def remote_logport(self, nodeid, logport):
-        d = logport.callRemote("get_versions")
-        d.addCallback(self.d.callback)
-
-class LogObserver(Referenceable):
-    implements(logpublisher.RILogObserver)
-    def __init__(self):
-        self.messages = []
-    def remote_msg(self, d):
-        self.messages.append(d)
diff --git a/src/allmydata/test/test_util.py b/src/allmydata/test/test_util.py
index ac51e023..284bf5e5 100644
--- a/src/allmydata/test/test_util.py
+++ b/src/allmydata/test/test_util.py
@@ -4,10 +4,8 @@ def foo(): pass # keep the line number constant
 import os
 from twisted.trial import unittest
 
-from twisted.python import failure
-from twisted.python import log as twisted_log
 from allmydata.util import bencode, idlib, humanreadable, mathutil
-from allmydata.util import assertutil, fileutil, testutil, log
+from allmydata.util import assertutil, fileutil, testutil
 
 
 class IDLib(unittest.TestCase):
-- 
2.45.2