104 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash
 | |
| #
 | |
| #==========================================================================
 | |
| #  This program is free software; you can redistribute it and/or modify 
 | |
| #  it under the terms of the GNU General Public License as published by 
 | |
| #  the Free Software Foundation; either version 2 of the License, or    
 | |
| #  (at your option) any later version.                                  
 | |
| #==========================================================================
 | |
| #
 | |
| set -ix
 | |
| # HOW TO USE
 | |
| # * Check out the icvpn svn tree to the place where $SVN_DIR points to.
 | |
| #   You can do this by running:
 | |
| #   mkdir -p /mnt/data
 | |
| #   svn co https://kdserv.dyndns.org/svn/christof-icvpn icvpn
 | |
| #   Use "freifunk" as username as well as password.
 | |
| # * create a /etc/gentinc.cfg file with the following content (remove 
 | |
| #   the # signs in the beginning of each line containing a variable) 
 | |
| #   and adapt the paths to your system:
 | |
| #	# ====== START OF gentinc.cfg ======
 | |
| #	# this points to the directory where you checked out the svn tree.
 | |
| # 	SVN_DIR="/mnt/data/icvpn"
 | |
| # 	TMP="/tmp"
 | |
| # 	TINC_DIR="/etc/tinc/icvpn"
 | |
| # 	TINC_INIT="/etc/init.d/tinc"
 | |
| # 	SVN="/usr/bin/svn"
 | |
| # 	LOCKDIR="/var/run/gentinccfg"
 | |
| #	SVN_USERNAME=freifunk
 | |
| #	SVN_PASSWORD=freifunk
 | |
| #	# ====== END OF gentinc.cfg =========
 | |
| # * make /etc/gentinc.cfg world readable
 | |
| # * run the script from cron on a daily basis
 | |
| 
 | |
| ! [[ -f /etc/gentinc.cfg ]] && {
 | |
| 	echo "config file does not exist in /etc/gentinc.cfg"
 | |
| 	exit 1
 | |
| }
 | |
| . /etc/gentinc.cfg
 | |
| cleanup() {
 | |
| 	local exitcode
 | |
| 	local i
 | |
| 	exitcode=$1
 | |
| 	for ((i=0;i<${#TMPFILES[@]};i++))
 | |
| 	do
 | |
| 		rm -f ${TMPFILES[i]}
 | |
| 	done
 | |
| 	[[ ! $exitcode -eq 0 ]] && 
 | |
| 		echo "aborted due to error" >&2
 | |
| 	trap - 1 2 3 6 9 13 14 15
 | |
| 	rm -f "${LOCKDIR}/PID"
 | |
| 	rm -rf "${LOCKDIR}"
 | |
| 	exit ${exitcode:-1}
 | |
| }
 | |
| 
 | |
| # obtain lock
 | |
| lcount=0
 | |
| while ! ( $(mkdir ${LOCKDIR} 2>/dev/null) ) 
 | |
| do
 | |
| 	echo there is already an instance of $0 running as PID: $(cat "${LOCKDIR}/PID" 2>/dev/null)
 | |
| 	sleep 1
 | |
|    ((lcount+=1))
 | |
|     if [[ $lcount -gt 4000 ]]
 | |
|     then
 | |
|       echo unable to obtain lock
 | |
|       exit 1
 | |
|     fi  
 | |
| done
 | |
| trap 'cleanup 1' 1 2 3 6 9 13 14 15
 | |
| 
 | |
| # lock obtained
 | |
| echo $$ > "${LOCKDIR}/PID"
 | |
| 
 | |
| # make sure we do not overload svn server when running the script from cron
 | |
| if [[ $1 != "--nocron" ]]
 | |
| then
 | |
| 	sleep $((RANDOM%3600))
 | |
| fi
 | |
| 
 | |
| # create new tinc config
 | |
| cd "$SVN_DIR"
 | |
| $SVN up --no-auth-cache --username $SVN_USERNAME --password $SVN_PASSWORD >/dev/null
 | |
| if [[ $? -gt 0 ]]
 | |
| then
 | |
| 	echo svn update failed - no reload necessary >&2
 | |
| 	cleanup 2
 | |
| fi
 | |
| footer=$(mktemp "$TMP/tinc_footer.XXXXXX")
 | |
| TMPFILES[${#TMPFILES[@]}]="$footer"
 | |
| header=$(mktemp "$TMP/tinc_footer.XXXXXX")
 | |
| TMPFILES[${#TMPFILES[@]}]="$header"
 | |
| 
 | |
| for i in ${SVN_DIR}/hosts/*
 | |
| do
 | |
| 	echo "ConnectTo = $(basename $i)" >> "$footer"
 | |
| done
 | |
| 
 | |
| grep -v "ConnectTo" "$TINC_DIR/tinc.conf" > "$header"
 | |
| cat $header $footer >"$TINC_DIR/tinc.conf"
 | |
| 
 | |
| # exit
 | |
| $TINC_INIT reload >/dev/null
 | |
| 
 | |
| cleanup 0
 | |
| 
 | 
