]> git.cworth.org Git - notmuch-wiki/blobdiff - remoteusage/124.mdwn
ditto (dc6dadf0ad4e8c86b83d927c6154e62af5c780d5)
[notmuch-wiki] / remoteusage / 124.mdwn
index a12f006dd55f5623e8d2b92891d71e3a3a707c42..969e7be20a260c649f73341e09778ea12908b571 100644 (file)
@@ -20,26 +20,27 @@ Write the following code to a file, for example `remote-notmuch.sh`.
 
        #!/bin/bash
 
 
        #!/bin/bash
 
-       # http://notmuchmail.org/remoteusage/124/
-
        set -eu
        set -eu
-       # To trace execution, uncomment next line.
-       #BASH_XTRACEFD=6; exec 6>>remote-errors; echo -- >&6; set -x
+       # To trace execution, uncomment next line:
+       #exec 6>>remote-errors; BASH_XTRACEFD=6; echo -- >&6; set -x
 
 
-       readonly SSH_CONTROL_SOCK='~'/.ssh/master-user@host:22
+       : ${REMOTE_NOTMUCH_SSHCTRL_SOCK:=master-notmuch@remote:22}
+       : ${REMOTE_NOTMUCH_COMMAND:=notmuch}
 
 
-       readonly notmuch=notmuch
+       readonly REMOTE_NOTMUCH_SSHCTRL_SOCK REMOTE_NOTMUCH_COMMAND
 
 
-       printf -v ARGS '%q ' "$@" # bash feature
+       SSH_CONTROL_ARGS='-oControlMaster=no -S ~'/.ssh/$REMOTE_NOTMUCH_SSHCTRL_SOCK
+       readonly SSH_CONTROL_ARGS
 
 
-       readonly SSH_CONTROL_ARGS='-oControlMaster=no -S '$SSH_CONTROL_SOCK
+       printf -v ARGS '%q ' "$@" # bash feature
+       readonly ARGS
 
 
-       if ssh -q $SSH_CONTROL_ARGS 0.1 $notmuch $ARGS
+       if ssh -q $SSH_CONTROL_ARGS 0.1 "$REMOTE_NOTMUCH_COMMAND" $ARGS
        then exit 0
        else ev=$?
        fi
 
        then exit 0
        else ev=$?
        fi
 
-       # continuing here in case ssh exited with nonzero value.
+       # continuing here in case ssh exited with nonzero value
 
        case $* in
         'config get user.primary_email') echo 'nobody@nowhere.invalid'; exit 0 ;;
 
        case $* in
         'config get user.primary_email') echo 'nobody@nowhere.invalid'; exit 0 ;;
@@ -50,14 +51,18 @@ Write the following code to a file, for example `remote-notmuch.sh`.
         'search'*'--output=tags'*) echo 'errors'; exit 0 ;;
        esac
 
         'search'*'--output=tags'*) echo 'errors'; exit 0 ;;
        esac
 
+       # fallback exit handler; print only to stderr...
+       exec >&2
+
        if ssh $SSH_CONTROL_ARGS -O check 0.1
        then
        if ssh $SSH_CONTROL_ARGS -O check 0.1
        then
-        echo ' Control socket is alive but something failed during data transmission.'
+        echo " Control socket is alive but something exited with status $ev"
         exit $ev
        fi
 
         exit $ev
        fi
 
-       echo " See`sed '1d;2d;s/.//;q' "$0"` for help."
-       #EOF
+       echo " See`sed '1d;2d;s/.//;q' "$0"` for help"
+       exit $ev
+       #eof
 
 Note the `0.1` in ssh command line. It is used to avoid any opportunistic
 behaviour ssh might do; for example if control socket is not alive ssh
 
 Note the `0.1` in ssh command line. It is used to avoid any opportunistic
 behaviour ssh might do; for example if control socket is not alive ssh
@@ -69,7 +74,7 @@ address `0.1` is invalid this attempt will fail early.
 Easiest way to test this script is to run the pre-made ssh connection
 using the following command line:
 
 Easiest way to test this script is to run the pre-made ssh connection
 using the following command line:
 
-        ssh -M -S '~'/.ssh/master-user@host:22 [user@]remotehost sleep 600
+        ssh -M -S '~'/.ssh/master-notmuch@remote:22 [user@]remotehost sleep 600
 
 (replace `[user@]remotehost` with your login info). Doing this the
 above wrapper script can be run unmodified. After the above command has
 
 (replace `[user@]remotehost` with your login info). Doing this the
 above wrapper script can be run unmodified. After the above command has
@@ -86,7 +91,7 @@ be.
 
 ## Tune
 
 
 ## Tune
 
-The path `'~'/.ssh/master-user@host:22` might look too generic to be
+The path `'~'/.ssh/master-notmuch@remote:22` might look too generic to be
 used as is as the control socket after initial testing (but it can
 be used). It is presented as a template for what could be configured
 to `$HOME/.ssh/config`. For example:
 used as is as the control socket after initial testing (but it can
 be used). It is presented as a template for what could be configured
 to `$HOME/.ssh/config`. For example:
@@ -98,36 +103,80 @@ is a good entry to be written in `$HOME/.ssh/config`;
 [[remoteusage|remoteusage]] uses the same. Now, let's say you'd
 make your pre-made ssh connection with command
 
 [[remoteusage|remoteusage]] uses the same. Now, let's say you'd
 make your pre-made ssh connection with command
 
-        ssh -M alice@example.org
+        ssh -M robin@example.org
 
 
-After configuring
-`readonly SSH_CONTROL_SOCK='~'/.ssh/master-alice@example.org:22`
-to the `./remote-notmuch.sh` wrapper script testing with
-`./remote-notmuch.sh help` should work fine.
+There are 3 options how to handle this with `./nottoomuch-remote.bash`:
 
 
-## Configure Emacs on the client computer ##
+1) Edit `./nottoomuch-remote.bash` and change `REMOTE_NOTMUCH_SSHCTRL_SOCK`
+   to contain the new value (being *master-robin@example.org:22* in this
+   case)
 
 
-See the section *Configure Emacs on the client computer* in
-[[remoteusage|remoteusage]] how to do this. The instructions are the same.
+2) Make symlink:
+   `ln -sfT master-robin@example.org:22 ~/.ssh/master-notmuch@remote:22`
 
 
+3) `REMOTE_NOTMUCH_SSHCTRL_SOCK` can be used via environment; like:
+
+      REMOTE_NOTMUCH_SSHCTRL_SOCK=master-robin@example.org:22 ./nottoomuch-remote.bash help
+
+## Configure Emacs on the client computer ##
+
+Add something like the following functions to your Emacs (general(*) or
+notmuch specific) configuration files:
+
+    ;; this should work as backend function when copied verbatim
+    (defun user/notmuch-remote-setup (sockname)
+      (setq notmuch-command "/path/to/nottoomuch-remote.bash")
+      (setenv "REMOTE_NOTMUCH_SSHCTRL_SOCK" sockname)
+      ;; If you use Fcc, you may want to do something like this on the client,
+      ;; to Bcc mails to yourself (if not, remove in your implementation):
+      (setq notmuch-fcc-dirs nil)
+      (add-hook 'message-header-setup-hook
+                (lambda () (insert (format "Bcc: %s <%s>\n"
+                                           (notmuch-user-name)
+                                           (notmuch-user-primary-email))))))
+
+     ;; this is just an example to configure using "default" master socket
+     (defun user/notmuch-remote-default ()
+       (interactive)
+       (user/notmuch-remote-setup "master-notmuch@remote:22")
+
+     ;; usage example2: set USER & HOST1 according to your remote...
+     (defun user/notmuch-remote-at-HOST1 ()
+       (interactive)
+       (user/notmuch-remote-setup "master-USER@HOST1:22")
+
+     ;; ... you probably got the point now -- add relevant funcs to your config
+     (defun user/notmuch-remote-at-HOST2 ()
+       (interactive)
+       (user/notmuch-remote-setup "master-USER@HOST2:22")
+
+... and if you want to activate your remote by default just call
+`(user/notmuch-remote-setup "master-USER@HOST:22")` without function call
+wrapper.
+
+(*) general most likely being ~/.emacs
 
 ## Creating master connection
 
 
 ## Creating master connection
 
+**(Note: all the examples below use the default master socket written in**
+`./nottoomuch-remote.bash` **for initial test easiness; remove/change the**
+`-S '~'/.ssh/master-notmuch@remote:22` **in case you don't need it.)**
+
 As mentioned so many times, using this solution requires one pre-made
 ssh connection in "master" mode. The simplest way is to dedicate one
 terminal for the connection with shell access to the remote machine:
 
 As mentioned so many times, using this solution requires one pre-made
 ssh connection in "master" mode. The simplest way is to dedicate one
 terminal for the connection with shell access to the remote machine:
 
-        ssh -M -S '~'/.ssh/master-user@host:22 [user@]remotehost
+        ssh -M -S '~'/.ssh/master-notmuch@remote:22 [user@]remotehost
 
 One possibility is to have this dedicated terminal in a way that the
 connection has (for example 1 hour) timeout:
 
 
 One possibility is to have this dedicated terminal in a way that the
 connection has (for example 1 hour) timeout:
 
-        ssh -M -S '~'/.ssh/master-user@host:22 [user@]remotehost sleep 3600
+        ssh -M -S '~'/.ssh/master-notmuch@remote:22 [user@]remotehost sleep 3600
 
 The above holds the terminal. The next alternative puts the command in
 background:
 
 
 The above holds the terminal. The next alternative puts the command in
 background:
 
-        ssh -f -M -S '~'/.ssh/master-user@host:22 [user@]remotehost sleep 3600
+        ssh -f -M -S '~'/.ssh/master-notmuch@remote:22 [user@]remotehost sleep 3600
 
 If you don't want this to timeout so soon, use a longer sleep, like 99999999
 (8 9:s, 1157 days, a bit more than 3 years).
 
 If you don't want this to timeout so soon, use a longer sleep, like 99999999
 (8 9:s, 1157 days, a bit more than 3 years).
@@ -148,7 +197,7 @@ run
 from command line and observe output. If it looks as it should be next uncomment
 the line
 
 from command line and observe output. If it looks as it should be next uncomment
 the line
 
-        #BASH_XTRACEFD=6; exec 6>>remote-errors; echo -- >&6; set -x
+        #exec 6>>remote-errors; BASH_XTRACEFD=6; echo -- >&6; set -x
 
 in `./remote-notmuch.sh` and attempt to use it from emacs again -- and then
 examine the contents of `remote-errors` in the working directory emacs was
 
 in `./remote-notmuch.sh` and attempt to use it from emacs again -- and then
 examine the contents of `remote-errors` in the working directory emacs was