Mercurial Sync Script
Client Side
merge.bat
- merge.cmd
echo %1
copy %1 %1.%COMPUTERNAME%.conflict
del /Q %1.orig
del /Q %1.orig
exit 1
merge_other.cmd
- merge_other.bat
echo %2
copy %2 %1.%COMPUTERNAME%.conflict
del /Q %1.orig
exit 1
hgsync_login_ssh.cmd
- 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
- 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
- /scripts/user_keygen.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
hgsync_login.sh
- /scripts/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
- /scripts/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
/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
...