X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=remoteusage%2Faboriginal.mdwn;h=3d012b8eed684b115b2f2adc9b5820ff52d7831e;hb=61f624d2aa54c56405d47e5a5454622639638494;hp=ef462dfee9159c60e757ec330b45a2016781e5a8;hpb=dee880643fd8d50e6c67bda0b8a43d37545efb5b;p=notmuch-wiki diff --git a/remoteusage/aboriginal.mdwn b/remoteusage/aboriginal.mdwn index ef462df..3d012b8 100644 --- a/remoteusage/aboriginal.mdwn +++ b/remoteusage/aboriginal.mdwn @@ -11,51 +11,53 @@ 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. +At the end of this document there is information for some possible ways +how master ssh connection can be done. + ## The script Write the following code to a file, for example `remote-notmuch.sh`. -There is just one line to that normally needs configuration: - - readonly SSH_CONTROL_SOCK='~'/.ssh/master-user@host:22 - -the options howto are presented after the script. - #!/bin/bash + #!/bin/bash - # http://notmuchmail.org/remoteusage/aboriginal/ + # http://notmuchmail.org/remoteusage/aboriginal/ - set -eu + set -eu + # To trace execution, uncomment next line. + #BASH_XTRACEFD=6; exec 6>>remote-errors; echo -- >&6; set -x - readonly SSH_CONTROL_SOCK='~'/.ssh/master-user@host:22 + readonly SSH_CONTROL_SOCK='~'/.ssh/master-user@host:22 - readonly notmuch=notmuch + readonly notmuch=notmuch - printf -v ARGS '%q ' "$@" # bash feature + printf -v ARGS '%q ' "$@" # bash feature - readonly SSH_CONTROL_ARGS='-oControlMaster=no -S '$SSH_CONTROL_SOCK + readonly SSH_CONTROL_ARGS='-oControlMaster=no -S '$SSH_CONTROL_SOCK - if ssh $SSH_CONTROL_ARGS 0.1 $notmuch $ARGS 2>>/dev/null - then exit 0 - else ev=$? - fi + if ssh -q $SSH_CONTROL_ARGS 0.1 $notmuch $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 ;; - 'config get user.name') echo 'nobody'; exit 0 ;; - 'count'*) echo 1; exit 0 ;; - 'search-tags'*) echo 'errors'; exit 0 ;; - 'search'*'--output=tags'*) echo 'errors'; exit 0 ;; - esac + case $* in + 'config get user.primary_email') echo 'nobody@nowhere.invalid'; exit 0 ;; + 'config get user.name') echo 'nobody'; exit 0 ;; + 'count'*'--batch'*) while read line; do echo 1; done; exit 0 ;; + 'count'*) echo 1; exit 0 ;; + 'search-tags'*) echo 'errors'; exit 0 ;; + 'search'*'--output=tags'*) echo 'errors'; exit 0 ;; + esac - if ssh $SSH_CONTROL_ARGS -O check 0.1 - then - echo ' Control socket is alive but something failed during data transmission.' - exit $ev - fi + if ssh $SSH_CONTROL_ARGS -O check 0.1 + then + echo ' Control socket is alive but something failed during data transmission.' + exit $ev + fi - echo " See`sed '1d;2d;s/.//;q' "$0"` for help." + echo " See`sed '1d;2d;s/.//;q' "$0"` for help." + #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 @@ -67,17 +69,20 @@ 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 + ssh -M -S '~'/.ssh/master-user@host:22 [user@]remotehost sleep 600 (replace `[user@]remotehost` with your login info). Doing this the -above script can be run unmodified. After the above command has been -run on one terminal, enter `chmod +x remote-notmuch.sh` in another -terminal and then test the script with `./remote-notmuch.sh help` +above wrapper script can be run unmodified. After the above command has +been run on **one terminal**, enter `chmod +x remote-notmuch.sh` in +**another terminal** and then test the script with + + ./remote-notmuch.sh help -Note that the '~' is inside single quotes for a reason. In this -case shell never expand it to `$HOME` -- ssh does it by not reading -`$HOME` but checking the real user home directory from `/etc/passewd`. -For security purposes this is just how it should be. +Note that the '~' in the ssh command line above is inside single quotes +for a reason. In this case shell never expand it to `$HOME` -- ssh does +it by not reading `$HOME` but checking the real user home directory +from `/etc/passwd`. For security purposes this is just how it should +be. ## Tune @@ -105,11 +110,46 @@ to the `./remote-notmuch.sh` wrapper script testing with See the section *Configure Emacs on the client computer* in [[remoteusage|remoteusage]] how to do this. The instructions are the same. -## Fun -Original [BSD Licence](http://en.wikipedia.org/wiki/BSD_licenses) -is 4-clause license. -When 3 rd. clause was removed, the new license was not original anymore. -Similarly, the requirement for this version are the same as in -[[remoteusage|remoteusage]] page except the 3 rd. requirement -(password-free login) is not effective here. +## Creating master connection + +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 + +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 + +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 + +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). + +A more "exotic" solution would be to make a shell script running on remote +machine, checking/inotifying when new mail arrives. When mail arrives it +could send message back to local host, where a graphical client (to be written) +pops up on display providing info about received mail (and exiting this +graphical client connection to remote host is terminated). + +## Troubleshooting + +If you experience strange output when using from emacs first attempt to just +run + + ./remote-notmuch.sh help + +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 + +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 +started.