mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 19:42:37 +02:00
add unison article
This commit is contained in:
parent
c0e9875b2b
commit
b47391cbc1
2 changed files with 195 additions and 0 deletions
BIN
images/unison.png
Normal file
BIN
images/unison.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
195
system/unison.rst
Normal file
195
system/unison.rst
Normal file
|
@ -0,0 +1,195 @@
|
|||
Working directly on your server? How to backup and sync your dev environment with unison
|
||||
########################################################################################
|
||||
|
||||
:date: 16/03/2011
|
||||
:tags: freebsd, unison
|
||||
|
||||
I have a server running freebsd since some time now, and was wondering about
|
||||
the possibility to directly have a development environment ready to use when
|
||||
I get a internet connexion, even if I'm not on my computer.
|
||||
|
||||
Since I use vim to code, and spend most of my time in a console while
|
||||
developing, it's possible to work via ssh, from everywhere.
|
||||
|
||||
The only problem is the synchronisation of the source code, config files etc.
|
||||
from my machine to the server.
|
||||
|
||||
Unison provides an interesting way to synchronise two folders, even over
|
||||
a network. So let's do it !
|
||||
|
||||
Creating the jail
|
||||
=================
|
||||
|
||||
In case you don't use FreeBSD, you can skip this section.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# I have a flavour jail named default
|
||||
$ ezjail-admin -f default workspace.notmyidea.org 172.19.1.6
|
||||
$ ezjail-admin start workspace.notmyidea.org
|
||||
|
||||
In my case, because the "default" flavour contains already a lot of interesting
|
||||
things, my jail come already setup with ssh, bash and vim for instance, but
|
||||
maybe you'll need it in your case.
|
||||
|
||||
I want to be redirected to the ssh of the jail when I connect to the host with
|
||||
the 20006 port. Add lines in `/etc/pf.conf`::
|
||||
|
||||
workspace_jail="172.19.1.6"
|
||||
rdr on $ext_if proto tcp from any to $ext_ip port 20006 -> $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 <http://github.com/ametaireau/dotfiles/>`_ 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 <http://ubuntuforums.org/showthread.php?p=10148738#post10148738>`_.
|
||||
|
||||
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
|
||||
|
Loading…
Reference in a new issue