#!/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="1.9.1" # the bygfoot release version the script is shipped with relversion=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 EXITPACKFORMAT=9 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="$*" # the package format the user wants to download format_rpm=.i586.rpm format_bin=-binary.tar.bz2 format_src=.tar.bz2 format_srpm=.src.rpm format_deb=-1_i386.deb format= # 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 # whether we just fetch the latest version number from # the server get_version=0 # 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:f:hlnNp:rRt:T:uU:vVZ --long apply-all,\ auto,branch:,country-files,country-dir:,cvs,format:,help,new-package,no-check,\ package-dir:,recompile,no-recompile,show-log,temp-dir:,type:,update,username:\ version,get-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 ;; -f|--format) set_format $2; 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 ;; -V|--get-version) mode=$mode_pack; get_version=1; shift ;; -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 cvs; 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 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=$newname my_echo "Patching $DIRNAME..." else oldname="${oldname## }" newname="${newname%% }" sed -i -e "s/>$oldname$newname> $log_file | tee -a $log_file popd 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; packdir=$PWD; popd 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 [ -z $countrydir ]; then if [ $auto -eq 0 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Definitions dir ($HOME/.bygfoot-1.9 should be ok; right click to show hidden)" \ --file-selection --directory else dialog --title "Bygfoot Online Update" \ --inputbox "Directory containing definitions directory\n(default destination should be ok)" \ 22 80 $HOME/.bygfoot-1.9/ 2> $input_file fi read_input if [ ! -z $tempvar ]; then pushd $tempvar; countrydir=$PWD; popd else countrydir=$HOME/.bygfoot/text_files fi else countrydir=$HOME/.bygfoot/text_files 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 \ --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 } # fetch a revision archive from the homepage and # patch the src package function get_revision() { local newrevdir=$tmpdir/bygfoot-update/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 \ --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 2>> $log_file | tee -a $log_file mkdir -v bygfoot-update 2>> $log_file | tee -a $log_file cd bygfoot-update 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 \ --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 --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 \ --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 package format from a command line option function set_format() { if [ $1 = "rpm" ]; then format=$format_rpm elif [ $1 = "srpm" ]; then format=$format_srpm elif [ $1 = "src" ]; then format=$format_src elif [ $1 = "bin" ]; then format=$format_bin elif [ $1 = "deb" ]; then format=$format_deb else my_echo "** b-u: Unrecognized package format: $1" my_echo "** b-u: Failure." my_exit $EXITPACKFORMAT fi } # 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 \ --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 } # get package format the user wants to download function get_format() { if [ -z $format ]; then if [ $auto -ne 1 -a $get_version -ne 1 ]; then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --list \ --list-text="Specify package type:" \ --radiolist --column "" --column "" --column "" \ TRUE 1 "RPM" \ FALSE 2 "Binary" \ FALSE 3 "Source" \ FALSE 4 "Debian" \ FALSE 5 "Source RPM" else dialog --title "Bygfoot Online Update" --menu "Specify package format" \ 22 80 10 \ 1 "RPM" \ 2 "Binary" \ 3 "Source" \ 4 "Debian" \ 5 "Source RPM" 2> $input_file fi read_input if [ $tempvar -eq 2 ]; then format=$format_bin elif [ $tempvar -eq 3 ]; then format=$format_src elif [ $tempvar -eq 4 ]; then format=$format_deb elif [ $tempvar -eq 5 ]; then format=$format_srpm else format=$format_rpm fi else format=$format_rpm fi fi # todo if [ "$type" = "$type_unstable" -a "$format" = "$format_deb" ]; then dialog --title "Bygfoot Online Update" --msgbox \ "There are no unstable packages for Debian. Sorry.\nFailure." 22 80 2> $input_file my_exit $EXITDEBIAN fi } function get_latest_version() { my_echo my_echo "** b-u: Fetching version number of the latest $type release." pushd $tmpdir &> /dev/null rm -rfv bygfoot-update 2>> $log_file | tee -a $log_file mkdir bygfoot-update cd bygfoot-update my_wget http://bygfoot.sourceforge.net/packages/$type/version packversion=$(cat version) if [ $get_version -eq 1 ]; then my_exit $EXITOK fi if [ $auto -eq 1 ]; then return fi if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --question \ --question-text="Latest $type version is $packversion. Your version (as far as i know) is $relversion. Do you want me to download the package?" else dialog --title "Bygfoot Online Update" \ --yesno "Latest $type version is $packversion.\nYour version (as far as i know) is $relversion.\nDo you want me to download the package?" 22 80 2> $input_file fi read_input } function get_new_package() { local separator=- local file= if [ $format = $format_rpm -o $format = $format_srpm ]; then packversion=$(echo $packversion | sed s/'\([0-9]*\.[0-9]*\)\(\.\)\([0-9]*\)'/'\1-\3'/g) fi if [ $format = $format_deb ]; then separator=_ fi file=bygfoot$separator$packversion$format my_wget http://bygfoot.sourceforge.net/packages/$type/$file if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --info \ --info-text="You can find the package $file in the directory $PWD." else dialog --title "Bygfoot Online Update" \ --msgbox "You can find the package $file\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_format get_latest_version 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 \ --list-text="Main Menu" \ --radiolist --column "" --column "" --column "" \ TRUE 1 "Update your Bygfoot source package using patches" \ FALSE 2 "Download the latest Bygfoot release" \ FALSE 3 "Get official team names and team definitions" \ FALSE 4 "Get CVS version (2+ MB 'cause it's not compressed)" else dialog --title "Bygfoot Online Update" --menu "Main Menu" 22 80 10 \ 1 " Update your Bygfoot source package using patches" \ 2 " Download the latest Bygfoot release" \ 3 " Get official team names and team definitions" \ 4 " Get CVS version (2+ MB 'cause it's not compressed)" 2> $input_file fi read_input if [ -z $tempvar ]; then mode=$mode_src return fi if [ $tempvar -eq 2 ]; then mode=$mode_pack elif [ $tempvar -eq 3 ]; then mode=$mode_country elif [ $tempvar -eq 4 ]; then mode=$mode_cvs else mode=$mode_src fi } function get_cvs() { if [ -z $cvs_version ];then if [ $use_zenity -eq 1 ]; then my_zenity --title="Bygfoot Online Update" --list \ --list-text="Specify CVS version" \ --radiolist --column "" --column "" --column "" \ FALSE 1 " 1.8 branch" \ TRUE 2 " 1.9 branch" else dialog --title "Bygfoot Online Update" --menu "Specify CVS version" 22 80 10 \ 1 " 1.8 branch" \ 2 " 1.9 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="cvs -d:pserver:anonymous@cvs.sf.net:/cvsroot/bygfoot" else cvs_command="cvs -d:ext:$tempvar@cvs.sf.net:/cvsroot/bygfoot" fi else if [ $cvs_user = "A" ]; then cvs_command="cvs -d:pserver:anonymous@cvs.sf.net:/cvsroot/bygfoot" else cvs_command="cvs -d:ext:$cvs_user@cvs.sf.net:/cvsroot/bygfoot" 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 \ --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