X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=remoteusage%2F124.mdwn;h=9a4fd45d2e0b0bf83f9dcb99799d025082fb9c5e;hb=219490b75a85ca18d449168575a0c7538e71612e;hp=6020de1f08b24d67a57611adbdb178b1265f0df7;hpb=5a5d269c5a3ffe1b995a88202b643c4f25f1ca38;p=notmuch-wiki diff --git a/remoteusage/124.mdwn b/remoteusage/124.mdwn index 6020de1..9a4fd45 100644 --- a/remoteusage/124.mdwn +++ b/remoteusage/124.mdwn @@ -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,21 +55,22 @@ Write the following code to a file, for example `remote-notmuch.sh`. 'search'*'--output=tags'*) echo 'errors'; exit 0 ;; esac - # for unhandled command line print only to stderr... + # 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 + 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 @@ -72,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 @@ -89,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: @@ -101,44 +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`: -An alternative strategy is to symlink the configured socket to -the one in ``./nottoomuch-remote.bash`` like: +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) - ln -sfT master-alice@example.org:22 ~/.ssh/master-notmuch@remote:22 +2) Make symlink: + `ln -sfT master-robin@example.org:22 ~/.ssh/master-notmuch@remote:22` -This also provides easy way to switch to another master connection without -need to edit this script. +3) `REMOTE_NOTMUCH_SSHCTRL_SOCK` can be used via environment; like: -## Configure Emacs on the client computer ## + REMOTE_NOTMUCH_SSHCTRL_SOCK=master-robin@example.org:22 ./nottoomuch-remote.bash help -See the section *Configure Emacs on the client computer* in -[[remoteusage|remoteusage]] how to do this. The instructions are the same. +## 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). @@ -159,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