# YBlog - Synchronize Custom WebSite with mobileMe
Keywords: Apple, mobileme, WebDav, synchronisation, zsh, script

French ↓ Menu ↓

# Synchronize Custom WebSite with mobileMe

# Update (2012/01/11)

iDisk should soon disapear. This entry is mainly obsolescent now.

# Update (2009/10/28)

I updated my script which is now incremental. Since the writing of this article, Apple(c) had made many efforts about the bandwith of its European servers.

# WebDav terror

I live in France and iDisk upload is just terrible. Upload speed remind me the old 56k modem. Most operations such as list the content of a directory take at least 30 seconds (for 15 elements). Renaming a directory fail most of time.

Apple(c) use a WebDav server to host files. It works on port 80 (like http). I realized WebDav via https work better (2 to 3 times faster with far less errors). But even https is too slow.

I upload from my Mac and sometimes from an Ubuntu PC (iDisk mounted with webdavfs).

# Synchronize safely the website

Here is the script I use in order to synchronize my website with maximum safety. It try each operations until it works.

The idea are:

- synchronize to a temporary folder then swap the name therefore the website isn’t accessible only during the swap time. It takes only the time of two rename.
- reiterate all operations until they work (for example, renaming).

For now I use `rsync` which in fact is no more efficient than a simple `cp` with WebDav. And I should use a method to keep track of elements who have changed. before the publication.

In fact when I’m on a Mac, I use Transmit which is very cool and far more efficient than the Finder to synchronize files. After the synchronization, I swap the directories.

My script take a `-s` option in order to make only the swap option. It also take a `-a` in order to put the new `index.html` which should point to the new homepage (not the iWeb one).

In order to keep this script working for you, just modify the username by yours (the value of the `mobileMeUser`).

    #!/usr/bin/env zsh

    # Script synchronisant le site sur me.com
    # normalement, le site est indisponible le moins de temps possible
    # le temps de deux renommages de répertoire

    mobileMeUser="yann.esposito"
    siteName="siteName"

    # Depending of my hostname the
    if [[ $(hostname) == 'ubuntu' ]]; then
        iDisk='/mnt/iDisk'
    else
        iDisk="/Volumes/$mobileMeUser"
    fi

    root=$HOME/Sites/$siteName
    destRep=$iDisk/Web/Sites/$siteName

    [[ ! -d $root ]] && {
        print -- "$root n'existe pas ; vérifiez la conf" >&2;
        exit 1
    }

    [[ ! -d $destRep ]] && {
        print -- "$destRep n'existe pas, veuillez remonter le FS" >&2;
        exit 1
    }

    if [[ $1 == '-h' ]]; then
        print -- "usage: $0:h [-h|-a|-s]"
        print -- "  -a sychronise aussi l'index"
        print -- "  -h affiche l'aide"
        print -- "  -s swappe simplement les répertoires"
    fi

    if [[ $1 == '-a' ]]; then
        print -- "Synchronisation de l'index (${destRep:h})"
        rsync -av $root/index.html ${destRep:h}/index.html
    fi

    print -- "Root = $root"
    print -- "Dest = $destRep"

    if [[ ! $1 = '-s' ]]; then
        [[ ! -d $destRep.tmp ]] && mkdir $destRep.tmp
        print -P -- "%B[Sync => tmp]%b"
        result=1
        essai=1
        while (( $result > 0 )); do
            rsync -arv $root/Scratch/ $destRep.tmp
            result=$?
            if (( $result > 0 )); then
                print -P -- "%BEchec du rsync%b (essai n°$essai)" >&2
            fi
            ((essai++))
        done
    fi

    # SWAP
    print -P -- "%B[Swap des Répertoires (tmp <=> target)]%b"
    essai=1
    while [[ -e $destRep.old ]]; do
        print -n -- "suppression de $destRep.old"
        if ((essai>1)); then
            print " (essai n°$essai)"
        else
            print
        fi
        ((essai++))
        \rm -rf $destRep.old
    done

    print -- "  renommage du repertoire sandard vers le .old"
    essai=1
    while [[ -e $destRep ]]; do
        mv $destRep $destRep.old
        (($?)) && print -- "Echec du renommage (essai n°$essai)" >&2
        ((essai++))
    done

    print -- "  renommage du repertoire tmp (nouveau) vers le standard"
    print -P -- "  %BSite Indisponible%b $(date)"
    essai=1
    while [[ ! -e $destRep ]]; do
        mv $destRep.tmp $destRep
        (($?)) && print -P -- "%B[Site Indisponible]%b(essai n°$essai) Echec du renommage (mv $destRep.tmp $destRep)" >&2
        ((essai++))
    done

    print -P -- "\t===\t%BSITE DISPONIBLE%b\t==="

    print -- "  renommage du repertoire old vers le tmp"
    essai=1
    while [[ ! -e $destRep ]]; do
        mv $destRep.old $destRep.tmp
        (($?)) && print -P -- "Echec du renommage n°$essai" >&2
        ((essai++))
    done

    print -P -- "  publication terminée"

    #!/usr/bin/env zsh

    # Author: Yann Esposito
    #   Mail: yann.esposito@gmail.com
    # Synchronize with "mobileMe" iDisk account.

    mobileMeUser="firstname.lastname"
    siteName="siteName"

    # Depending of my hostname the
    if [[ $(hostname) == 'ubuntu' ]]; then
        iDisk='/mnt/iDisk'
    else
        iDisk="/Volumes/$mobileMeUser"
    fi

    root=$HOME/Sites/$siteName
    destRep=$iDisk/Web/Sites/$siteName

    [[ ! -d $root ]] && {
        print -- "$root does not exist ; please verify the configuration ($0)" >&2;
        exit 1
    }

    [[ ! -d $destRep ]] && {
        print -- "$destRep does not exist, please mount the filesystem" >&2;
        exit 1
    }

    if [[ $1 == '-h' ]]; then
        print -- "usage: $0:h [-h|-a|-s]"
        print -- "  -a sychronize primary index"
        print -- "  -h show this help"
        print -- "  -s only swap directories"
    fi

    if [[ $1 == '-a' ]]; then
        print -- "Index synchronisation (${destRep:h})"
        rsync -av $root/index.html ${destRep:h}/index.html
    fi

    print -- "Root = $root"
    print -- "Dest = $destRep"

    if [[ ! $1 = '-s' ]]; then
        [[ ! -d $destRep.tmp ]] && mkdir $destRep.tmp
        print -P -- "%B[Sync => tmp]%b"
        result=1
        essai=1
        while (( $result > 0 )); do
            rsync -arv $root/Scratch/ $destRep.tmp
            result=$?
            if (( $result > 0 )); then
                print -P -- "%Brsync failed%b (try n°$essai)" >&2
            fi
            ((essai++))
        done
    fi

    # SWAP
    print -P -- "%B[Directory Swap (tmp <=> target)]%b"
    essai=1
    while [[ -e $destRep.old ]]; do
        print -n -- "remove $destRep.old"
        if ((essai>1)); then
            print " (try n°$essai)"
        else
            print
        fi
        ((essai++))
        \rm -rf $destRep.old
    done

    print -- "  renommage du repertoire sandard vers le .old"
    essai=1
    while [[ -e $destRep ]]; do
        mv $destRep $destRep.old
        (($?)) && print -- "Failed to rename (try n°$essai)" >&2
        ((essai++))
    done

    print -- "  renaming folder tmp (new) to the standard one"
    print -P -- "  %BThe WebSite isn't working%b $(date)"
    essai=1
    while [[ ! -e $destRep ]]; do
        mv $destRep.tmp $destRep
        (($?)) && print -P -- "%B[WebSite not working]%b(try n°$essai) Failed to rename (mv $destRep.tmp $destRep)" >&2
        ((essai++))
    done

    print -P -- "\t===\t%BWEBSITE SHOULD WORK NOW%b\t==="

    print -- "  rename old folder to tmp folder"
    essai=1
    while [[ ! -e $destRep ]]; do
        mv $destRep.old $destRep.tmp
        (($?)) && print -P -- "Failed to rename n°$essai" >&2
        ((essai++))
    done

    print -P -- "  Publish terminated"

RSS · Tweet · FB
These social sharing links preserve your privacy
↑ Top ↑
Published on 2009-09-11
Follow @yogsototh
Yann Esposito©
Done with Vim spacemacs & nanoc Hakyll

ADA: `DdzFFzCqrhtAvdkmATx5Fm8NPJViDy85ZBw13p4XcNzVzvQg8e3vWLXq23JQWFxPEXK6Kvhaxxe7oJt4VMYHxpA2vtCFiP8fziohN6Yp`