(Steve Dougherty)
2013-07-22: Add initial fn-connect implementation. Add initial fn-connect implementation. Only pings, does not handle session conflicts, and does not respond to any commands because none are currently implemented on the plugin side either.
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py
--- a/infocalypse/__init__.py
+++ b/infocalypse/__init__.py
@@ -379,6 +379,8 @@ PULL_OPTS = [('', 'hash', [], 'repo hash
+ 'known users')]
cmdtable = {
+ "fn-connect": (infocalypse_connect, FCP_OPTS),
+
"fn-pull": (infocalypse_pull,
[('', 'uri', '', 'request URI to pull from')]
+ PULL_OPTS
diff --git a/infocalypse/commands.py b/infocalypse/commands.py
--- a/infocalypse/commands.py
+++ b/infocalypse/commands.py
@@ -233,6 +233,11 @@ def infocalypse_check_notifications(ui,
wot.check_notifications(ui, opts['wot'])
+def infocalypse_connect(ui, repo, **opts):
+ import wot
+ wot.connect(ui, repo)
+
+
def infocalypse_push(ui_, repo, **opts):
""" Push to an Infocalypse repository in Freenet. """
params, stored_cfg = get_config_info(ui_, opts)
diff --git a/infocalypse/wot.py b/infocalypse/wot.py
--- a/infocalypse/wot.py
+++ b/infocalypse/wot.py
@@ -1,4 +1,5 @@
import string
+from time import sleep
import fcp
from mercurial import util
from config import Config
@@ -11,10 +12,42 @@ from keys import USK
import yaml
from email.mime.text import MIMEText
import imaplib
+import threading
FREEMAIL_SMTP_PORT = 4025
FREEMAIL_IMAP_PORT = 4143
VCS_PREFIX = "[vcs] "
+PLUGIN_NAME = "org.freenetproject.plugin.infocalypse_webui.main.InfocalypsePlugin"
+
+
+def connect(ui, repo):
+ node = fcp.FCPNode()
+
+ # TODO: Should I be using this? Looks internal. The identifier needs to
+ # be consistent though.
+ fcp_id = node._getUniqueId()
+
+ ui.status("Connecting as '%s'.\n" % fcp_id)
+
+ def ping():
+ pong = node.fcpPluginMessage(plugin_name=PLUGIN_NAME, id=fcp_id,
+ plugin_params={'Message': 'Ping'})
+ # TODO: Quit on session conflict.
+ # Must be faster than the timeout threshold. (5 seconds)
+ threading.Timer(4.0, ping).start()
+
+ # Start self-perpetuating pinging in the background.
+ t = threading.Timer(0.0, ping)
+ # Daemon threads do not hold up the process exiting. Allows prompt
+ # response to - for instance - SIGTERM.
+ t.daemon = True
+ t.start()
+
+ while True:
+ command = node.fcpPluginMessage(plugin_name=PLUGIN_NAME, id=fcp_id,
+ plugin_params={'Message':
+ 'ClearToSend'})
+ # TODO: Dispatch commands; quit on session conflict.
def send_pull_request(ui, repo, from_identifier, to_identifier, to_repo_name):