You will need to have the following items in place:
1. a working notmuch on one computer (let's call that computer
-"server").
+"server").
+
2. a working notmuch emacs interface on another computer (let's call
that computer "client")
-3. `ssh` and `dtach` on your client computer. (TODO: Make dtach
-optional, or allow screen or tmux to be used instead.)
-4. password-free login (public key authentication) from client to
+
+3. `ssh` and `dtach` on your client computer. (TODO: Make dtach
+optional, or allow screen or tmux to be used instead.
+[[Here|remotewrapper]] is a version that does not require dtach.)
+
+4. password-free login (public key authentication) from client to
server. [Here](http://www.debian-administration.org/articles/152) is a
good page on how to set it up.
-5. a reasonably fast connection. (This isn't really *neccessary*, but
+
+5. a reasonably fast connection. (This isn't really *neccessary*, but
if your connection is too slow, this won't be very pleasant to use,
and certainly won't seem transparent.)
1. replaces the call to the notmuch binary with a call to notmuch
over ssh.
+
2. sets up a running, detached, ssh connection to the server, so that
future calls can reuse the socket.
- #!/usr/bin/env bash
-
- SSH_BIN="ssh"
- USER="example_user"
- SSH_HOST="example.com"
- SSH_SOCKET="/tmp/notmuch_ssh.socket"
- NOTMUCH_REMOTE_BIN="notmuch"
- DTACH="dtach"
- DTACH_SOCKET="/tmp/notmuch_dtach.socket"
-
- check_for_socket ()
- {
- [ -S "${SSH_SOCKET}" ]
- }
-
- check_if_socket_alive ()
- {
- timeout 1 $SSH_BIN -S ${SSH_SOCKET} $USER@$SSH_HOST true > /dev/null
- }
-
- start_socket ()
- {
- dtach_command="${DTACH} -n ${DTACH_SOCKET} ${SSH_BIN} -M -S ${SSH_SOCKET} ${USER}@${SSH_HOST}"
- command -v ${DTACH} &>/dev/null && ${dtach_command} ||
- echo "${DTACH} not installed"
- }
-
- notmuch_run ()
- {
- check_for_socket || start_socket
- CMD=$1
- shift
- printf -v ARGS "%q " "$@"
- $SSH_BIN -S $SSH_SOCKET $USER@$SSH_HOST $NOTMUCH_REMOTE_BIN ${CMD} ${ARGS}
- }
-
- notmuch_run $@
+ #!/usr/bin/env bash
+ SSH_BIN="ssh"
+ USER="example_user"
+ SSH_HOST="example.com"
+ SOCKET_DIR="/tmp/notmuch_$(id -u)"
+ SSH_SOCKET="${SOCKET_DIR}/ssh.socket"
+ NOTMUCH_REMOTE_BIN="notmuch"
+ DTACH="/usr/bin/dtach"
+ DTACH_SOCKET="${SOCKET_DIR}/dtach.socket"
+
+ check_for_socket_dir ()
+ {
+ [ -d "${SOCKET_DIR}" ]
+ }
+
+ check_socket_dir_owner_and_perm ()
+ {
+ [ "$(stat -c %U ${SOCKET_DIR})" = "$(whoami)" ] &&
+ [ "$(stat -c %a ${SOCKET_DIR})" = "700" ]
+ }
+
+ create_socket_dir ()
+ {
+ mkdir "${SOCKET_DIR}"
+ chmod 700 "${SOCKET_DIR}"
+ }
+
+ check_for_socket ()
+ {
+ [ -S "${SSH_SOCKET}" ]
+ }
+
+ start_socket ()
+ {
+ dtach_command="${DTACH} -n ${DTACH_SOCKET} ${SSH_BIN} -M -S ${SSH_SOCKET} ${USER}@${SSH_HOST}"
+ command -v ${DTACH} &>/dev/null && ${dtach_command}
+ }
+
+ notmuch_run ()
+ {
+ if check_for_socket_dir; then
+ if check_socket_dir_owner_and_perm; then
+ if ! check_for_socket; then
+ start_socket
+ fi
+ else echo "Wrong permissions of ${SOCKET_DIR}" >&2
+ exit 1
+ fi
+ elif create_socket_dir; then
+ start_socket
+ else
+ exit 1
+ fi
+ printf -v ARGS "%q " "$@"
+ $SSH_BIN -S $SSH_SOCKET $USER@$SSH_HOST $NOTMUCH_REMOTE_BIN ${ARGS}
+ }
+
+ notmuch_run "$@"
Save this to a file, "remote-notmuch.sh", in your path.