]> git.cworth.org Git - notmuch-wiki/blobdiff - remoteusage/124.mdwn
News for release 0.38.3
[notmuch-wiki] / remoteusage / 124.mdwn
index a12f006dd55f5623e8d2b92891d71e3a3a707c42..9a4fd45d2e0b0bf83f9dcb99799d025082fb9c5e 100644 (file)
@@ -11,6 +11,9 @@ its own connection. As long as master ssh connection is live, slave
 can use it. Disconnecting master all future attempts to connect
 from the script will fail.
 
+It is possible to use this solution without any changes to
+`$HOME/.ssh/config`.
+
 At the end of this document there is information for some possible ways
 how master ssh connection can be done.
 
@@ -20,26 +23,28 @@ Write the following code to a file, for example `remote-notmuch.sh`.
 
        #!/bin/bash
 
-       # http://notmuchmail.org/remoteusage/124/
+       set -euf
 
-       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
 
-       # 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 ;;
@@ -50,18 +55,22 @@ Write the following code to a file, for example `remote-notmuch.sh`.
         '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
-        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
 
-       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
-would attempt to do it's own ssh connection to remote ssh server. As
+would attempt to do its own ssh connection to remote ssh server. As
 address `0.1` is invalid this attempt will fail early.
 
 ## Test
@@ -69,7 +78,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:
 
-        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
@@ -86,7 +95,7 @@ be.
 
 ## 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:
@@ -98,36 +107,105 @@ 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
 
-        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
+
+### Yet another possibility -- script to start emacs
+
+Instead of adding new configurations you could also write a special
+script which starts and configures emacs suitable for remote usage.
+Copy the following "template" to a new name e.g. in `$HOME/bin/`,
+edit the value for `master-USER@HOST3:22` and perhaps add more
+post eval-after-load notmuch configs there.
+
+    #!/bin/sh
+    :; exec "${EMACS:-emacs}" --debug-init --load "$0" "$@"; exit
+
+    (setenv "REMOTE_NOTMUCH_SSHCTRL_SOCK" "master-USER@HOST3:22")
+
+    (eval-after-load "notmuch"
+      (lambda ()
+        (setq notmuch-command (concat (file-name-directory load-file-name)
+                                      "remote-notmuch.sh"))
+        ;; place for more post-notmuch-load emacs configs if any
+        ))
+    (notmuch)
+
+    ;; Local Variables:
+    ;; mode: emacs-lisp
+    ;; End:
 
 ## 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:
 
-        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:
 
-        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:
 
-        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).
@@ -148,7 +226,7 @@ run
 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