aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-11-20 14:39:26 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-11-20 14:50:36 -0400
commit8e28135b26db1c920ebde7438db9bad87d3026ee (patch)
tree68d948ce454ea0661dbf11416d3e26182e3447af
parent513d36ae4de0be74b12112487d8e1b12b7c7f43e (diff)
remotedaemon: Fork to background by default. Added --foreground switch to enable old behavior.
Groundwork for tor hidden services, which the remotedaemon will serve.
-rw-r--r--Assistant/Threads/RemoteControl.hs2
-rw-r--r--CHANGELOG7
-rw-r--r--Command/EnableTor.hs2
-rw-r--r--Command/RemoteDaemon.hs31
-rw-r--r--RemoteDaemon/Core.hs26
-rw-r--r--doc/git-annex-enable-tor.mdwn5
-rw-r--r--doc/git-annex-remotedaemon.mdwn41
-rw-r--r--doc/git-annex.mdwn19
8 files changed, 97 insertions, 36 deletions
diff --git a/Assistant/Threads/RemoteControl.hs b/Assistant/Threads/RemoteControl.hs
index 447b493c6..1aa8bc9c8 100644
--- a/Assistant/Threads/RemoteControl.hs
+++ b/Assistant/Threads/RemoteControl.hs
@@ -30,7 +30,7 @@ remoteControlThread :: NamedThread
remoteControlThread = namedThread "RemoteControl" $ do
program <- liftIO programPath
(cmd, params) <- liftIO $ toBatchCommand
- (program, [Param "remotedaemon"])
+ (program, [Param "remotedaemon", Param "--foreground"])
let p = proc cmd (toCommand params)
(Just toh, Just fromh, _, pid) <- liftIO $ createProcess p
{ std_in = CreatePipe
diff --git a/CHANGELOG b/CHANGELOG
index 3777e6d5a..692a22ea4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,10 @@
+git-annex (6.20161119) UNRELEASED; urgency=medium
+
+ * remotedaemon: Fork to background by default. Added --foreground switch
+ to enable old behavior.
+
+ -- Joey Hess <id@joeyh.name> Sun, 20 Nov 2016 14:10:15 -0400
+
git-annex (6.20161118) unstable; urgency=medium
* git-annex.cabal: Loosen bounds on persistent to allow 2.5, which
diff --git a/Command/EnableTor.hs b/Command/EnableTor.hs
index 1a54c6c5d..369ea7509 100644
--- a/Command/EnableTor.hs
+++ b/Command/EnableTor.hs
@@ -14,7 +14,7 @@ import Utility.Tor
-- git-annex, as that would create root-owned files.
cmd :: Command
cmd = noCommit $ dontCheck repoExists $
- command "enable-tor" SectionPlumbing ""
+ command "enable-tor" SectionSetup ""
"userid uuid" (withParams seek)
seek :: CmdParams -> CommandSeek
diff --git a/Command/RemoteDaemon.hs b/Command/RemoteDaemon.hs
index 7c7ecef4b..c68cf816a 100644
--- a/Command/RemoteDaemon.hs
+++ b/Command/RemoteDaemon.hs
@@ -1,25 +1,32 @@
{- git-annex command
-
- - Copyright 2014 Joey Hess <id@joeyh.name>
+ - Copyright 2014-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
+{-# LANGUAGE CPP #-}
+
module Command.RemoteDaemon where
import Command
import RemoteDaemon.Core
+import Utility.Daemon
cmd :: Command
-cmd = noCommit $
- command "remotedaemon" SectionPlumbing
- "detects when remotes have changed, and fetches from them"
- paramNothing (withParams seek)
-
-seek :: CmdParams -> CommandSeek
-seek = withNothing start
+cmd = noCommit $ dontCheck repoExists $
+ command "remotedaemon" SectionMaintenance
+ "persistent communication with remotes"
+ paramNothing (run <$$> const parseDaemonOptions)
-start :: CommandStart
-start = do
- liftIO runForeground
- stop
+run :: DaemonOptions -> CommandSeek
+run o
+ | stopDaemonOption o = error "--stop not implemented for remotedaemon"
+ | foregroundDaemonOption o = liftIO runInteractive
+ | otherwise = do
+#ifndef mingw32_HOST_OS
+ nullfd <- liftIO $ openFd "/dev/null" ReadOnly Nothing defaultFileFlags
+ liftIO $ daemonize nullfd Nothing False runNonInteractive
+#else
+ liftIO $ foreground Nothing runNonInteractive
+#endif
diff --git a/RemoteDaemon/Core.hs b/RemoteDaemon/Core.hs
index 5fa413155..3b3f6d98d 100644
--- a/RemoteDaemon/Core.hs
+++ b/RemoteDaemon/Core.hs
@@ -1,11 +1,11 @@
{- git-remote-daemon core
-
- - Copyright 2014 Joey Hess <id@joeyh.name>
+ - Copyright 2014-2016 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
-module RemoteDaemon.Core (runForeground) where
+module RemoteDaemon.Core (runInteractive, runNonInteractive) where
import qualified Annex
import Common
@@ -17,6 +17,7 @@ import qualified Git
import qualified Git.Types as Git
import qualified Git.CurrentRepo
import Utility.SimpleProtocol
+import Utility.ThreadScheduler
import Config
import Annex.Ssh
@@ -26,8 +27,8 @@ import Control.Concurrent.STM
import Network.URI
import qualified Data.Map as M
-runForeground :: IO ()
-runForeground = do
+runInteractive :: IO ()
+runInteractive = do
(readh, writeh) <- dupIoHandles
ichan <- newTChanIO :: IO (TChan Consumed)
ochan <- newTChanIO :: IO (TChan Emitted)
@@ -44,8 +45,21 @@ runForeground = do
let controller = runController ichan ochan
-- If any thread fails, the rest will be killed.
- void $ tryIO $
- reader `concurrently` writer `concurrently` controller
+ void $ tryIO $ reader `concurrently` writer `concurrently` controller
+
+runNonInteractive :: IO ()
+runNonInteractive = do
+ ichan <- newTChanIO :: IO (TChan Consumed)
+ ochan <- newTChanIO :: IO (TChan Emitted)
+
+ let reader = forever $ do
+ threadDelaySeconds (Seconds (60*60))
+ atomically $ writeTChan ichan RELOAD
+ let writer = forever $
+ void $ atomically $ readTChan ochan
+ let controller = runController ichan ochan
+
+ void $ tryIO $ reader `concurrently` writer `concurrently` controller
type RemoteMap = M.Map Git.Repo (IO (), TChan Consumed)
diff --git a/doc/git-annex-enable-tor.mdwn b/doc/git-annex-enable-tor.mdwn
index b44cf817c..5355eef8b 100644
--- a/doc/git-annex-enable-tor.mdwn
+++ b/doc/git-annex-enable-tor.mdwn
@@ -14,10 +14,15 @@ It outputs to stdout a line of the form "address.onion:onionport socketfile"
This command has to be run by root, since it modifies `/etc/tor/torrc`.
+After this command is run, `git annex remotedaemon` can be run to serve the
+hidden service.
+
# SEE ALSO
[[git-annex]](1)
+[[git-annex-remotedaemon]](1)
+
# AUTHOR
Joey Hess <id@joeyh.name>
diff --git a/doc/git-annex-remotedaemon.mdwn b/doc/git-annex-remotedaemon.mdwn
index 69b516283..71dd32d30 100644
--- a/doc/git-annex-remotedaemon.mdwn
+++ b/doc/git-annex-remotedaemon.mdwn
@@ -1,6 +1,6 @@
# NAME
-git-annex remotedaemon - detects when remotes have changed, and fetches from them
+git-annex remotedaemon - persistent communication with remotes
# SYNOPSIS
@@ -8,18 +8,37 @@ git annex remotedaemon
# DESCRIPTION
-This plumbing-level command is used by the assistant to detect
-when remotes have received git pushes, so the changes can be promptly
-fetched and the local repository updated.
+The remotedaemon provides persistent communication with remotes.
+This is useful to detect when remotes have received git pushes, so the
+changes can be promptly fetched and the local repository updated.
-This is a better alternative to the [[git-annex-xmppgit]](1)
-hack.
+The assistant runs the remotedaemon and communicates with it on
+stdio using a simple textual protocol.
-For the remotedaemon to work, the git remote must have
-[[git-annex-shell]](1) installed, with notifychanges support.
-The first version of git-annex-shell that supports it is 5.20140405.
+Several types of remotes are supported:
-It's normal for this process to be running when the assistant is running.
+For ssh remotes, the remotedaemon tries to maintain a connection to the
+remote git repository, and uses git-annex-shell notifychanges to detect
+when the remote git repository has changed, and fetch the changes from
+it. For this to work, the git remote must have [[git-annex-shell]](1)
+installed, with notifychanges support. The first version of git-annex-shell
+that supports it is 5.20140405.
+
+For tor-annex remotes, the remotedaemon runs as a tor hidden service,
+accepting connections from other nodes and serving up the contents of the
+repository. This is only done if you first run `git annex enable-tor`.
+
+# OPTIONS
+
+* `--foreground`
+
+Don't fork to the background, and communicate on stdin/stdout using a
+simple textual protocol. The assistant runs the remotedaemon this way.
+
+Commands in the protocol include LOSTNET, which tells the remotedaemon
+that the network connection has been lost, and causes it to stop any TCP
+connctions. That can be followed by RESUME when the network connection
+comes back up.
# SEE ALSO
@@ -27,6 +46,8 @@ It's normal for this process to be running when the assistant is running.
[[git-annex-assistant]](1)
+[[git-annex-enable-tor]](1)
+
# AUTHOR
Joey Hess <id@joeyh.name>
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 955f67629..773e1b817 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -212,6 +212,12 @@ subdirectories).
See [[git-annex-enableremote]](1) for details.
+* `enable-tor`
+
+ Sets up tor hidden service.
+
+ See [[git-annex-enable-tor]](1) for details.
+
* `numcopies [N]`
Configure desired number of copies.
@@ -379,6 +385,13 @@ subdirectories).
See [[git-annex-repair]](1) for details.
+* `remotedaemon`
+
+ Persistent communication with remotes.
+
+ See [[git-annex-remotedaemon]](1) for details.
+
+
# QUERY COMMANDS
* `find [path ...]`
@@ -652,12 +665,6 @@ subdirectories).
See [[git-annex-smudge]](1) for details.
-* `remotedaemon`
-
- Detects when network remotes have received git pushes and fetches from them.
-
- See [[git-annex-remotedaemon]](1) for details.
-
* `xmppgit`
This command is used internally by the assistant to perform git pulls