====== Mercurial Sync Script ====== ===== Client Side ===== ==== merge.bat ==== echo %1 copy %1 %1.%COMPUTERNAME%.conflict del /Q %1.orig del /Q %1.orig exit 1 ==== merge_other.cmd ==== echo %2 copy %2 %1.%COMPUTERNAME%.conflict del /Q %1.orig exit 1 ==== hgsync_login_ssh.cmd ==== @echo off set LOCAL_REPO="%USERPROFILE%\Documents" set REMOTE_REPO="h:\Documents" set SSH_REPO="ssh://%USERNAME%@sfs/Documents" set SSHHOST="sfs" set PATH=C:\Progra~1\Mercurial;C:\Windows\System32\OpenSSH;C:\Windows\System32; If exist "%USERPROFILE%\.ssh\id_rsa" ( If exist "%USERPROFILE%\.ssh\known_hosts" ( echo SSH env ready xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\ ) else ( echo Setting up SSH env mkdir %USERPROFILE%\.ssh xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\ ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id" ) ) else ( echo Setting up SSH env mkdir %USERPROFILE%\.ssh xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\ ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id" ) If exist "%LOCAL_REPO%\.hg" ( If exist "%REMOTE_REPO%\.hg" ( goto Remoteandlocal ) else ( goto onlylocal ) ) else If exist "%REMOTE_REPO%\.hg" ( goto onlyremote ) else If exist "%LOCAL_REPO%\.hg" ( goto onlylocal ) else ( goto missingonboth ) goto end :Remoteandlocal Echo File exist remote and local c: cd %LOCAL_REPO% hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg pull %SSH_REPO% hg merge -t "W:\scripts\merge.bat" hg resolve -t internal:other --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_login.sh" echo "remote update end" hg pull %SSH_REPO% hg update goto END :onlylocal Echo File exist only local echo "remote init start" ssh %USERNAME%@sfs "/scripts/hgsync_init.sh" echo "remote init end" c: cd %LOCAL_REPO% hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_login.sh" echo "remote update end" hg pull %SSH_REPO% hg merge -t "W:\scripts\merge_other.bat" hg resolve -t internal:local --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% h: cd %SSH_REPO% hg update goto END :onlyremote Echo File exist only remote c: cd %LOCAL_REPO% hg init hg pull %SSH_REPO% hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg merge -t "W:\scripts\merge.bat" hg resolve -t internal:other --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_update.sh" echo "remote update end" goto END :missingonboth Echo missing on both mkdir %LOCAL_REPO% C: cd %LOCAL_REPO% hg init echo "remote init start" ssh %USERNAME%@sfs "/scripts/hgsync_init.sh" echo "remote init end" hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_logout.sh" echo "remote update end" hg pull %SSH_REPO% hg merge -t "W:\scripts\merge_other.bat" hg resolve -t internal:local --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_update.sh" echo "remote update end" goto END :END echo done ==== hgsync_logout_ssh.cmd ==== @echo off set LOCAL_REPO="%USERPROFILE%\Documents" set REMOTE_REPO="h:\Documents" set SSH_REPO="ssh://%USERNAME%@sfs/Documents" set SSHHOST="sfs" set PATH=C:\Progra~1\Mercurial;C:\Windows\System32\OpenSSH;C:\Windows\System32; If exist "%USERPROFILE%\.ssh\id_rsa" ( If exist "%USERPROFILE%\.ssh\known_hosts" ( echo SSH env ready xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\ ) else ( echo Setting up SSH env mkdir %USERPROFILE%\.ssh xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\ ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id" ) ) else ( echo Setting up SSH env mkdir %USERPROFILE%\.ssh xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\ ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id" ) If exist "%LOCAL_REPO%\.hg" ( If exist "%REMOTE_REPO%\.hg" ( goto Remoteandlocal ) else ( goto onlylocal ) ) else If exist "%REMOTE_REPO%\.hg" ( goto onlyremote ) else If exist "%LOCAL_REPO%\.hg" ( goto onlylocal ) else ( goto missingonboth ) :Remoteandlocal Echo File exist remote and local c: cd %LOCAL_REPO% hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg pull %SSH_REPO% hg merge -t "W:\scripts\merge_other.bat" hg resolve -t internal:local --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_logout.sh" echo "remote update end" hg pull %SSH_REPO% hg update goto END :onlylocal Echo File exist only local c: cd %LOCAL_REPO% echo "remote init start" ssh %USERNAME%@sfs "/scripts/hgsync_init.sh" echo "remote init end" hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_login.sh" echo "remote update end" hg pull %SSH_REPO% hg merge -t "W:\scripts\merge_other.bat" hg resolve -t internal:local --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_update.sh" echo "remote update end" goto END :onlyremote Echo File exist only remote c: cd %LOCAL_REPO% hg init hg pull %SSH_REPO% hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg merge -t "W:\scripts\merge_other.bat" hg resolve -t internal:local --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_update.sh" echo "remote update end" goto END :missingonboth Echo missing on both mkdir %LOCAL_REPO% C: cd %LOCAL_REPO% hg init echo "remote init start" ssh %USERNAME%@sfs "/scripts/hgsync_init.sh" echo "remote init end" hg addremove hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_logout.sh" echo "remote update end" hg pull %SSH_REPO% hg merge -t "W:\scripts\merge_other.bat" hg resolve -t internal:local --all hg update hg addremove hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%" hg push %SSH_REPO% echo "remote update start" ssh %USERNAME%@sfs "/scripts/hgsync_update.sh" echo "remote update end" goto END :END echo done ===== Server Side ===== ==== userkeygen.sh ==== #!/bin/bash if [ "echo ${PAM_USER} | grep +" != "" ] then TMP="`echo ${PAM_USER} | cut -d \"+\" -f2`" PAM_USER="${TMP}" #echo ${PAM_USER} fi USERHOME="/vol1/homes/${PAM_USER}" echo "`date` ${PAM_USER} ${USERHOME} ${PAM_SERVICE}" >> /tmp/pam_exec.log if [ "`ls ${USERHOME}/.ssh/authorized_keys`" = "" ] then echo "Keys Missing" cd ${USERHOME} mkdir .ssh cd .ssh/ ssh-keygen -t rsa -N "" -f id_rsa cp id_rsa.pub authorized_keys chmod -R 700 ${USERHOME} chown -R ${PAM_USER} ${USERHOME} else echo "Keys Present" chmod -R 700 ${USERHOME} chown -R ${PAM_USER} ${USERHOME} fi ==== hgsync_init.sh ==== #!/bin/sh mkdir -p ~/Documents cd ~/Documents hg init ==== hgsync_login.sh ==== #!/bin/sh cd ~/Documents hg commit -m "merge update" hg merge -t internal:local hg update hg addremove hg commit -m "merge update" ==== hgsync_logout.sh ==== #!/bin/sh cd ~/Documents hg commit -m "merge update" hg merge -t internal:other hg update hg addremove hg commit -m "merge update" ==== hgsync_update.sh ==== #!/bin/sh cd ~/Documents hg update ==== /etc/pam.d/common-session ==== ... session required pam_mkhomedir.so skel=/etc/skel/ umask=0077 session optional pam_exec.so /bin/bash /scripts/user_keygen.sh ...