#!/bin/bash #################################################### # Bygfoot Football Manager # # AUTHOR: Gyozo Both (gyboth@bygfoot.com) # # http://bygfoot.sourceforge.net # #################################################### # Skript that updates src packages of the Bygfoot Football Manager # using wget to retrieve patches from the homepage # version number version="2.0.0" # the bygfoot release version the script is shipped with relversion=UNKNOWN_VERSION # the current release version on the server packversion= # exit codes EXITOK=0 EXITNOPROG=1 EXITNOREV=2 EXITABORT=3 EXITWGETFAIL=4 EXITUSR=6 EXITNEWSCRIPT=7 EXITCOUNTRY=8 EXITDEBIAN=10 # variables # a variable we sometimes read something into tempvar= # the directory containing the Bygfoot src package packdir= # a directory we can write to and read from tmpdir= # destination for the country files countrydir= # the Bygfoot package type, stable or unstable type_stable=stable type_unstable=unstable type= # the current revision number of the user's package revnr= # revision numbers fetched from the homepage newrevnr= # number of new revisions found found=0 # the arguments for the script args="$*" # which cvs version to get cvs_version1=bygfoot-unstable cvs_version2=bygfoot2-unstable cvs_version= # whether we use zenity use_zenity= # The file we redirect dialog output to input_file=$PWD/bygfoot-update-dialog.tmp # The file containing all output log_file=$PWD/bygfoot-update.log # options # whether all new patches should be applied automatically apply_all=0 # whether we should skip some queries and assume standard values auto=0 # whether we recompile automatically after patching recompile=0 # whether we check for auxiliary programs and # newer update script versions check=1 # SourceForge.Net username (for cvs checkout) cvs_user= # whether we show the log file before terminating # if so, the file doesn't get deleted by cleanup() show_log=0 # operation modes # source update mode_src=0 # country file download mode_country=1 # package download mode_pack=2 # get cvs version mode_cvs=3 mode= # print a help text function print_help() { cat <> $log_file | tee -a $log_file } # show log file before exiting if the option is set function my_exit() { if [ $show_log -eq 1 ]; then if [ -r $log_file ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update Log" --text-info --filename=$log_file else dialog --title "Bygfoot Online Update" --textbox $log_file 22 75 fi else echo "** WARNING: log file $log_file not readable." fi fi cleanup exit $1 } # parse arguments function parse_args() { TEMP=`getopt -o aAbcB:C:hlnNp:rRt:T:uU:vZ --long apply-all,\ auto,branch:,country-files,country-dir:,cvs,,help,new-package,no-check,\ package-dir:,recompile,no-recompile,show-log,temp-dir:,type:,update,username:\ version,no-zenity -- $*` if [ $? != 0 ]; then my_echo "** b-u: There was an error parsing the arguments." my_echo "** b-u: The arguments will be ignored." return fi eval set -- "$TEMP" while true; do case "$1" in -a|--apply-all) apply_all=1; shift ;; -A|--auto) auto=1; apply_all=1; shift ;; -b|--cvs) mode=$mode_cvs; shift ;; -B|--branch) set_branch $2; shift 2 ;; -c|--country-files) mode=$mode_country; shift ;; -C|--country-dir) pushd $2 &> /dev/null; countrydir=$PWD; popd &> /dev/null; shift 2 ;; -h|--help) print_help; exit $EXITOK ;; -l|--show-log) show_log=1; shift ;; -n|--new-package) mode=$mode_pack; shift ;; -N|--no-check) check=0; shift ;; -p|--package-dir) pushd $2 &> /dev/null; packdir=$PWD; popd &> /dev/null; shift 2 ;; -r|--recompile) recompile=1; shift ;; -R|--no-recompile) recompile=-1; shift ;; -t|--temp-dir) pushd $2 &> /dev/null; tmpdir=$PWD; popd &> /dev/null; shift 2 ;; -T|--type) type=$2; shift 2 ;; -u|--update) mode=$mode_src; shift ;; -U|--username) cvs_user=$2; shift 2 ;; -v|--version) print_version; exit $EXITOK ;; -Z|--no-zenity) use_zenity=0; shift ;; --) shift; break ;; esac done } # clean up in the temp dir function cleanup() { my_echo my_echo "** b-u: Removing output file $input_file." rm -rfv $input_file 2>> $log_file | tee -a $log_file if [ ! -z $tmpdir ]; then if [ $mode -ne $mode_pack ]; then my_echo "** b-u: Cleaning up in the temp directory." rm -rfv 2>> $log_file | tee -a $log_file fi fi if [ $show_log -eq 0 ]; then my_echo "** b-u: Removing log file $log_file." rm -rfv $log_file fi } # wget something, exit if it doesn't work function my_wget() { if ! wget -v $1 2>> $log_file | tee -a $log_file; then my_echo my_echo "** b-u: wget failure." my_exit $EXITWGETFAIL fi } # wrapper for zenity function my_zenity() { zenity "$@" 1> $input_file exitval=$? if [ $exitval -eq 255 ]; then my_echo "** b-u: zenity error." read a elif [ $exitval -eq 1 ]; then my_echo "** b-u: User abort." my_exit $EXITUSR fi } # check for high enough version of zenity function check_zenity() { my_echo -n "** b-u: checking for zenity..." if ! which zenity &> /dev/null; then my_echo " not installed. I'm going to use dialog." else zenver=$(zenity --version) zenver1=$(echo $zenver |sed "s/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/g") zenver2=$(echo $zenver |sed "s/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/g") zenver3=$(echo $zenver |sed "s/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/g") if [ $zenver1 -ge 2 -a $zenver2 -ge 9 -a $zenver3 -ge 0 ]; then my_echo " $zenver1.$zenver2.$zenver3 found." use_zenity=1 else my_echo " $zenver1.$zenver2.$zenver3 not good enough. I'm going to use dialog." use_zenity=0 fi fi } # check for the programs needed function check_progs() { if [ $check -eq 0 ]; then return fi my_echo for i in sed tar bzip2 wget patch svn; do my_echo -n "** b-u: checking for $i... " if which $i &> /dev/null; then my_echo "ok" else my_echo "failed" my_echo my_echo "** WARNING: Didn't find working $i, maybe it's not in your PATH." my_echo "** WARNING: You might not be able to use all bygfoot-update features." read a fi done if [ -z $use_zenity ]; then check_zenity fi } function read_input() { if [ $? -eq 1 ];then my_echo "** b-u: User abort." my_exit $EXITUSR fi if [ -r $input_file ]; then tempvar=$(cat $input_file) else tempvar= fi my_echo "** b-u: User input: $tempvar" my_echo } # get team definitions function get_team_defs() { if [ ! -d teams ]; then mkdir teams fi pushd teams &> /dev/null rm -vf team_defs 2>> $log_file | tee -a $log_file my_wget http://bygfoot.sourceforge.net/revisions/team_defs while read key value; do if [ ! -z $key ]; then if [ $key = "end_section" ]; then file_name=$(echo $uri | sed "s/.*\(team_.*bz2\)/\1/g" | sed "s/\.bz2//g") def_name=$(echo $file_name | sed "s/team_//g" | sed "s/\..*//g") if [ -e $file_name.xml ]; then mv $file_name.xml $file_name.xml.old fi if [ -e $file_name.png ]; then mv $file_name.png $file_name.png.old fi my_wget $uri tar xfj $file_name.bz2 rm -rfv $file_name.bz2 2>> $log_file | tee -a $log_file echo $PWD read a if [ -d $country ]; then pushd $country &> /dev/null team_found=0 for league in league*xml; do for team in "$team_name1" "$team_name2"; do if grep "$team" $league &> /dev/null; then team_found=1 cp -f $league $league.bak my_echo " + Adding $team to $league..." perl -0777 -pe "s+(team_name\>$team\)[\n\t ]*\[^\<]*\[\n\t ]*+\1\n+g" $league.bak | perl -0777 -pe "s+([\t ]*)(\$team\)+\1\2\n\1\$def_name\+g" > $league fi done done if [ $team_found -eq 0 ]; then echo " ** $team_name1 / $team_name2 not found in any of the leagues! **" fi popd &> /dev/null else my_echo "Country directory $country not found." fi team_name1= team_name2= uri= country= else case $key in uri) uri=$value ;; team_name1) team_name1="$value" ;; team_name2) team_name2="$value" ;; country) country=$(find .. -type d -name $value | tail -n 1);; esac fi fi done < team_defs rm -vf team_defs 2>> $log_file | tee -a $log_file popd &> /dev/null } # get country files with official team names function get_country_files() { my_echo my_echo "** b-u: Fetching official team names and" my_echo "** b-u: team definitions files." pushd $countrydir &>/dev/null my_wget http://bygfoot.sourceforge.net/revisions/official_names while read -d : oldname && read newname do if [ "$oldname" = "League" ]; then DIRNAME=$(find . -type d -name $newname | tail -n 1) if [ ! $DIRNAME = "" ]; then my_echo " + Adding official team names to $DIRNAME..." fi else if [ ! $DIRNAME = "" ]; then oldname="${oldname## }" newname="${newname%% }" perl -i -pe "s?>$oldname$newname> $log_file | tee -a $log_file get_team_defs popd &> /dev/null my_echo "** b-u: done." my_exit $EXITCOUNTRY } # get the paths for a temp directory and # the location of the user's bygfoot src package function get_paths() { if [ $mode -eq $mode_src ]; then if [ -z $packdir ]; then if [ $auto -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Select source package directory" \ --file-selection --directory else dialog --title "Bygfoot Online Update" \ --inputbox "Source package directory" 22 80 $PWD 2> $input_file fi read_input pushd $tempvar &> /dev/null; packdir=$PWD; popd &> /dev/null else packdir=$PWD fi my_echo my_echo "** b-u: Package dir set to" my_echo "** b-u: $packdir" fi fi if [ $mode -ne $mode_country ]; then if [ -z $tmpdir ]; then if [ $auto -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Select temporary directory" \ --file-selection --directory else dialog --title "Bygfoot Online Update" \ --inputbox "Temporary directory\n(you need read/write permissions there)" \ 22 80 /tmp 2> $input_file fi read_input if [ ! -z $tempvar ]; then pushd $tempvar &> /dev/null ; tmpdir=$PWD; popd &> /dev/null else tmpdir=/tmp fi else tmpdir=/tmp fi my_echo my_echo "** b-u: Temp dir set to" my_echo "** b-u: $tmpdir" fi fi if [ $mode -eq $mode_country ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --info \ --text="If you use the binary version of Bygfoot, you should specify './support_files/definitions' as country dir. If you use an installed version, you should specify '$HOME/.bygfoot-X/definitions' (X being the version number you use)." else dialog --title "Bygfoot Online Update" --msgbox "If you use the binary version of Bygfoot, you should specify './support_files/definitons' as country dir. If you use an installed version, you should specify '$HOME/.bygfoot-X/definitions' (X being the version number you use)." \ 22 80 2> $input_file fi if [ -z $countrydir ]; then if [ $auto -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Definitions dir (right click to show hidden)" \ --file-selection --directory else dialog --title "Bygfoot Online Update" \ --inputbox "Directory containing definitions directory" \ 22 80 $HOME/.bygfoot/definitions 2> $input_file fi read_input if [ ! -z $tempvar ]; then pushd $tempvar &> /dev/null; countrydir=$PWD; popd &> /dev/null else countrydir=$HOME/.bygfoot/definitions fi else countrydir=$HOME/.bygfoot/definitions fi my_echo my_echo "** b-u: Country dir set to" my_echo "** b-u: $countrydir" fi fi } # find out revision number and type function get_rev_type() { echo if [ ! -e $packdir/revision_number ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --error \ --text="I couldn't find the file containing your current revision number and type ($packdir/revision_number)." else dialog --title "Bygfoot Online Update" --msgbox \ "I couldn't find the file containing your current revision number and type ($packdir/revision_number).\nFailure." \ 22 80 2> $input_file fi read_input my_exit $EXITNOREV fi type=$(cat $packdir/revision_number | sed s/[0-9]*//g) revnr=$(cat $packdir/revision_number | sed s/[a-z]*//g) my_echo "** b-u: Your current revision is: $type $revnr." } function apply_rev() { my_echo my_echo "** b-u: Applying patch revision_$type$newrevnr" cd $packdir if [ -e $newrevdir/prepatch ]; then $newrevdir/prepatch 2>> $log_file | tee -a $log_file fi patch -p1 < $newrevdir/patch* 2>> $log_file | tee -a $log_file if [ -e $newrevdir/postpatch ]; then $newrevdir/postpatch 2>> $log_file | tee -a $log_file fi cd $tmpdir/bygfoot-update-tmp } # fetch a revision archive from the homepage and # patch the src package function get_revision() { local newrevdir=$tmpdir/bygfoot-update-tmp/revision_$type$newrevnr my_echo my_echo "** b-u: Retrieving revision_$type$newrevnr.tar.bz2." my_wget http://bygfoot.sourceforge.net/revisions/$type/revision_$type$newrevnr.tar.bz2 mkdir $newrevdir cd $newrevdir tar xfjv ../revision_$type$newrevnr.tar.bz2 2>> $log_file | tee -a $log_file if [ $use_zenity -eq 1 ]; then my_zenity --title="Patch README" --text-info --filename=README else dialog --title "Bygfoot Online Update" --textbox README 22 75 fi if [ $apply_all -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --list \ --text="Apply patch? (You can't apply newer ones if you don't apply this one because they depend on each other." \ --radiolist --column "" --column "" --column "" \ TRUE 1 Yes \ FALSE 2 No \ FALSE 3 All else dialog --title "Bygfoot Online Update" --menu \ "Apply patch?\n(You can't apply newer ones if you don't apply this one because they depend on each other.)" \ 22 80 10 \ 1 Yes \ 2 No \ 3 All 2> $input_file fi read_input if [ ! -z $tempvar ]; then if [ $tempvar -eq 3 ]; then apply_all=1 elif [ $tempvar -ne 1 ]; then my_echo my_echo "** b-u: User abort." my_exit $EXITUSR fi fi fi apply_rev } # look for new revisions function get_revs() { my_echo cd $tmpdir my_echo "** b-u: Cleaning up old update directories and creating a new one..." rm -rfv bygfoot-update-tmp 2>> $log_file | tee -a $log_file mkdir -v bygfoot-update-tmp 2>> $log_file | tee -a $log_file cd bygfoot-update-tmp my_echo my_echo "** b-u: Fetching revision list..." my_wget http://bygfoot.sourceforge.net/revisions/$type/revisions_$type for i in $(cat revisions_$type); do my_echo newrevnr=$(echo $i | sed s/'[a-z_]*\([0-9]*\).*'/'\1'/g) if [ $newrevnr -gt $revnr ]; then found=$[found + 1] get_revision else my_echo "** b-u: $i is older than your revision..." fi done } # clean up etc. function update_end() { my_echo if [ $found -ge 1 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --info \ --text="$found new revisions found. Your new revision number should be $[revnr + found]. Have a look at the files README, ChangeLog and ReleaseNotes to see the changes that were made." else dialog --title "Bygfoot Online Update" --msgbox "$found new revisions found.\nYour new revision number should be $[revnr + found].\nHave a look at the files README, ChangeLog and ReleaseNotes to see the changes that were made." 2> $input_file fi if [ $recompile -eq 0 -a $auto -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --question --text="Would you like me to execute 'configure && make' ?" else dialog --title "Bygfoot Online Update" --yesno "Would you like me to execute 'configure && make' ?" 22 80 2> $input_file fi read_input fi if [ $recompile -ne -1 ]; then cd $packdir ./configure && make 2>> $log_file | tee -a $log_file fi else if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --info \ --text="No new revisions found.\nYour package seems to be up-to-date." else dialog --title "Bygfoot Online Update" --msgbox "No new revisions found.\nYour package seems to be up-to-date." 22 80 2> $input_file fi fi my_echo my_echo "** b-u: done." my_exit $EXITOK } # set cvs branch from command line option function set_branch() { if [ $1 -eq 1 ]; then cvs_version=$cvs_version1; else cvs_version=$cvs_version2; fi } # ask for the package type (stable/unstable) function get_type() { if [ ! -z $type ]; then return fi if [ $auto -ne 1 ];then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --list \ --text="Specify package type:" \ --radiolist --column "" --column "" --column "" \ TRUE 1 Stable \ FALSE 2 Unstable else dialog --title "Bygfoot Online Update" --menu "Specify package type" \ 22 80 10 \ 1 "Stable" \ 2 "Unstable" 2> $input_file fi read_input if [ $tempvar -eq 2 ]; then type=$type_unstable else type=$type_stable fi else type=$type_stable fi } function get_latest_versions() { pushd $tmpdir &> /dev/null rm -rfv bygfoot-update-tmp 2>> $log_file | tee -a $log_file mkdir -v bygfoot-update-tmp cd bygfoot-update-tmp my_wget http://bygfoot.sourceforge.net/packages/$type/versions packlist=`cat versions` if [ $auto -eq 1 ]; then return fi if [ $use_zenity -eq 1 ]; then zencmd="zenity --title=Bygfoot_Online_Update --list --text=Select_package.Your_version_is_$relversion(as_far_as_I_know). --radiolist --print-column 2" zencmd="$zencmd --column - --column - --column Package" cnt=1 for package in $packlist; do if [ $cnt -eq 1 ]; then zencmd="$zencmd TRUE $cnt $package" else zencmd="$zencmd FALSE $cnt $package" fi cnt=$[cnt + 1]; done selected_package=$($zencmd) if [ $? -eq 1 ];then my_echo "** b-u: User abort." my_exit $EXITUSR fi else dialcmd="dialog --title Bygfoot_Online_Update --menu Select_package.Your_version_is_$relversion(as_far_as_I_know). 22 80 10" for package in $packlist; do dialcmd="$dialcmd $package -" done $dialcmd 2> $input_file read_input selected_package=$tempvar fi } function get_new_package() { my_wget http://bygfoot.sourceforge.net/packages/$type/$selected_package if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --info \ --text="You can find the package $selected_package in the directory $PWD." else dialog --title "Bygfoot Online Update" \ --msgbox "You can find the package $selected_package\nin the directory $PWD." \ 22 80 2> $input_file fi my_echo "** b-u: Done." my_exit $EXITOK } # download a bygfoot package function get_package() { get_type get_latest_versions get_new_package } function get_mode() { if [ ! -z $mode ]; then return fi if [ $auto -eq 1 ]; then mode=$mode_src return fi if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --list \ --text="Main Menu" \ --radiolist --column "" --column "" --column "" \ TRUE 1 "Download the latest Bygfoot release" \ FALSE 2 "Get official team names and team definitions" \ FALSE 3 "Get CVS version (11+ MB)" else dialog --title "Bygfoot Online Update" --menu "Main Menu" 22 80 10 \ 1 " Download the latest Bygfoot release" \ 2 " Get official team names and team definitions" \ 3 " Get CVS version (11+ MB)" 2> $input_file fi read_input if [ -z $tempvar ]; then mode=$mode_pack return fi if [ $tempvar -eq 1 ]; then mode=$mode_pack elif [ $tempvar -eq 2 ]; then mode=$mode_country else mode=$mode_cvs fi } function get_cvs() { if [ -z $cvs_version ];then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --list \ --text="Specify CVS version" \ --radiolist --column "" --column "" --column "" \ FALSE 1 " 1.8 branch" \ TRUE 2 " 2.0 branch" else dialog --title "Bygfoot Online Update" --menu "Specify CVS version" 22 80 10 \ 1 " 1.8 branch" \ 2 " 2.0 branch" 2> $input_file fi read_input if [ $tempvar -eq 2 ]; then cvs_version=$cvs_version2 else cvs_version=$cvs_version1 fi fi if [ -z $cvs_user ];then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --entry \ --text="If you'd like to check out as a developer, enter your SourceForge.net username. Leave empty to check out anonymously." else dialog --title "Bygfoot Online Update" --inputbox "If you'd like to check out as a developer, enter your\nSourceForge.net username. Press RETURN to download anonymously." 22 80 2> $input_file fi read_input if [ -z $tempvar ]; then cvs_command="svn co https://bygfoot.svn.sourceforge.net/svnroot/bygfoot bygfoot/trunk/bygfoor/trunk" else cvs_command="svn --username=$tempvar co https://bygfoot.svn.sourceforge.net/svnroot/bygfoot bygfoot/trunk/bygfoor/trunk" fi else if [ $cvs_user = "A" ]; then cvs_command="svn co https://bygfoot.svn.sourceforge.net/svnroot/bygfoot bygfoot/trunk/bygfoor/trunk" else cvs_command="svn --username=$cvs_user co https://bygfoot.svn.sourceforge.net/svnroot/bygfoot bygfoot/trunk/bygfoor/trunk" fi fi cd $tmpdir $cvs_command checkout $cvs_version 2>> $log_file | tee -a $log_file if [ $recompile -eq 0 -a $auto -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --question \ --text="Would you like me to execute 'autogen.sh && make' ?" else dialog --title "Bygfoot Online Update" \ --yesno "Would you like me to execute 'autogen.sh && make' ?" 22 80 2> $input_file fi read_input fi if [ $recompile -ne -1 ]; then cd $cvs_version ./autogen.sh && make 2>> $log_file | tee -a $log_file fi my_exit $EXITOK } parse_args $* print_version echo "Bygfoot Online Update $version log file" > $log_file echo "Don't forget to remove this file if you don't need it anymore." >> $log_file check_progs get_mode get_paths # what to do when user presses Ctrl-C trap 'my_echo; my_echo "** b-u: User abort." & my_exit $EXITABORT' 2 if [ $mode -eq $mode_country ]; then get_country_files elif [ $mode -eq $mode_pack ]; then get_package elif [ $mode -eq $mode_cvs ]; then get_cvs else get_rev_type get_revs update_end fi