From b47391cbc1ce0783ed0d957d2cf40d2a9b784787 Mon Sep 17 00:00:00 2001 From: Alexis Metaireau Date: Wed, 16 Mar 2011 13:30:21 +0000 Subject: [PATCH] add unison article --- images/unison.png | Bin 0 -> 12100 bytes system/unison.rst | 195 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 images/unison.png create mode 100644 system/unison.rst diff --git a/images/unison.png b/images/unison.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf467a27d1a35681871f9634aa9d20eee8a5c8c GIT binary patch literal 12100 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 ajqDCYJ$?8U_Ij2IAS $workspace_jail port 22 + +Reload packet filter rules + +.. code-block:: bash + + $ /etc/rc.d/pf reload + +Working with unison +=================== + +Now that we've set up the jail. Set up unison on the server and on your client. +Unison is available on the freebsd ports so just install it + +.. code-block:: bash + + $ ssh notmyidea.org -p 20006 + $ make -C /usr/ports/net/unison-nox11 config-recursive + $ make -C /usr/ports/net/unison-nox11 package-recursive + +Install as well unison on your local machine. Double check to install the same +version on the client and on the server. Ubuntu contains the 2.27.57 as well as +the 2.32.52. + +Check that unison is installed and reachable via ssh from your machine + +.. code-block:: bash + + $ ssh notmyidea.org -p 20006 unison -version + unison version 2.27.157 + $ unison -version + unison version 2.27.57 + +Let sync our folders +==================== + +The first thing I want to sync is my vim configuration. Well, it's already `in +a git repository `_ but let's try to use +unison for it right now. + +I have two machines then: `workspace`, the jail, and `ecureuil` my laptop. + +.. code-block:: bash + + unison .vim ssh://notmyidea.org:20006/.vim + unison .vimrc ssh://notmyidea.org:20006/.vimrc + + +It is also possible to put all the informations in a config file, and then to +only run `unison`. (fire up `vim ~/.unison/default.prf`. + +Here is my config:: + + root = /home/alexis + root = ssh://notmyidea.org:20006 + + path = .vimrc + path = dotfiles + path = dev + + follow = Name * + +My vimrc is in fact a symbolic link on my laptop, but I don't want to specify +each of the links to unison. That's why the `follow = Name *` is for. + +The folders you want to synchronize are maybe a bit large. If so, considering +others options such as rsync for the first import may be a good idea (I enjoyed +my university huge upload bandwith to upload 2GB in 20mn ;) + +Run the script frequently +========================= + +Once that done, you just need to run the unison command line some times when +you want to sync your two machines. I've wrote a tiny script to get some +feedback from the sync: + +.. code-block:: python + + import os + from datetime import datetime + + DEFAULT_LOGFILE = "~/unison.log" + PROGRAM_NAME = "Unison syncer" + + def sync(logfile=DEFAULT_LOGFILE, program_name=PROGRAM_NAME): + # init + display_message = True + error = False + + before = datetime.now() + # call unison to make the sync + os.system('unison -batch > {0}'.format(logfile)) + + # get the duration of the operation + td = datetime.now() - before + delta = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 + + # check what was the last entry in the log + log = open(os.path.expanduser(logfile)) + lines = log.readlines() + if 'No updates to propagate' in lines[-1]: + display_message = False + else: + output = [l for l in lines if "Synchronization" in l] + + message = output[-1] + message += " It took {0}s.".format(delta) + + if display_message: + os.system('notify-send -i {2} "{0}" "{1}"'.format(program_name, message, + 'error' if error else 'info')) + + if __name__ == "__main__": + sync() + +This is probably perfectible, but that does the job. + +Last step is to tell you machine to run that frequently. That's what `crontab` +is made for, so let's `crontab -e`:: + + $ * */3 * * * . ~/.Xdbus; /usr/bin/python /home/alexis/dev/python/unison-syncer/sync.py + +The `~/.Xdbus` allows cron to communicate with your X11 session. Here is its +content. + +.. code-block:: bash + + #!/bin/bash + + # Get the pid of nautilus + nautilus_pid=$(pgrep -u $LOGNAME -n nautilus) + + # If nautilus isn't running, just exit silently + if [ -z "$nautilus_pid" ]; then + exit 0 + fi + + # Grab the DBUS_SESSION_BUS_ADDRESS variable from nautilus's environment + eval $(tr '\0' '\n' < /proc/$nautilus_pid/environ | grep '^DBUS_SESSION_BUS_ADDRESS=') + + # Check that we actually found it + if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then + echo "Failed to find bus address" >&2 + exit 1 + fi + + # export it so that child processes will inherit it + export DBUS_SESSION_BUS_ADDRESS + +And it comes from `here `_. + +A sync takes about 20s + the upload time on my machine, which stay acceptable for +all of my developments. + +.. image:: images/unison.png + :alt: the notify osd notification +