#!/bin/bash # autobuild -- plugin for @package@ # Copyright (C) 2006 Davide Madrisan [ -z "$BASH" ] || [ ${BASH_VERSION:0:1} -lt 2 ] && echo $"this script requires bash version 2 or better" >&2 && exit 1 me=(${0##*/} "@version@" "@date@") [ $(id -u) -eq 0 ] && { echo "$me: "$"you're running $me as root" 1>&2 && exit 1; } [ -r @libdir@/libmsgmng.lib ] || { echo "$me: "$"library not found"": @libdir@/libmsgmng.lib" 1>&2 exit 1; } . @libdir@/libmsgmng.lib [ -r @libdir@/libspec.lib ] || { echo "$me: "$"library not found"": @libdir@/libspec.lib" 1>&2 exit 1; } . @libdir@/libspec.lib # load the configuration file(s) [ -r @libdir@/libcfg.lib ] || { echo "$me: "$"library not found"": @libdir@/libcfg.lib" 1>&2 exit 1; } . @libdir@/libcfg.lib if [[ -z "$LANG" && -r /etc/sysconfig/i18n ]]; then . /etc/sysconfig/i18n [ "$LANG" ] && export LANG fi TEXTDOMAIN="@package@"; export TEXTDOMAIN function copying() { echo "\ "$"This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." } function version() { echo "\ ${me[0]} ${me[1]} Copyright (C) 2006 Davide Madrisan " } function usage() { version echo "\ *** FIXME *** "$"Usage"": @frontend@ -b [-T ] "$"where the above options mean"": -b, --batch "$"Run in batch mode, using as a road map"" -T, --target "$"Execute rules only for the given package"" "$"Operation modes"": -h, --help "$"Print this help, then exit"" -V, --version "$"Print version number, then exit"" -q, --quiet "$"Run in quiet mode"" -r, --colorize "$"Enable the colorized output"" -D, --debug "$"Run in debugging mode (very verbose output)"" "$"Samples"": @frontend@ --batch /var/tmp/autobuild.rules "$"Report bugs to ." exit ${1:-1} } # check if all the needed tools are available #for tool in ... ; do # [ "$(type -p $tool)" ] || # notify.error $"utility not found": \`$tool'" #done case $1 in --autospec-args-file*) if echo $1 | grep -q '=' ; then argsfile=`echo $1 | sed 's/^--autospec-args-file=//'` else argsfile=$2 fi [ -r "$argsfile" ] || notify.error $"cannot read"": \`$argsfile'" . $argsfile && rm -f $argsfile ;; esac for arg in $@; do case $arg in -h|--help) usage 0 ;; -V|--version) version; echo; copying; exit 0 ;; esac done exec_options=`LANG=C getopt \ -o b:T:DqrhV \ --long batch:,target:,\ debug,quiet,colorize,help,version,\ frontend_opts: \ -n "$me" -- "$@"` [ $? = 0 ] || exit 1 notify.debug "[ ${0} ${exec_options} ]\n" eval set -- "$exec_options" while :; do case $1 in -b|--batch) batchfile=$2; shift ;; -T|--target) batchtargetpck=$2; shift ;; # FIXME : currently ignored! -D|--debug) let "verbose = 2" ;; -q|--quiet) let "verbose = 0" ;; -r|--colorize) let "colorize = 1" ;; -h|--help) usage 0 ;; -V|--version) version; echo; copying; exit 0 ;; --) shift; break ;; *) notify.error $"unrecognized option"" -- \`$1'" ;; esac shift done for arg in $@; do notify.error $"unrecognized option"" -- \`$arg'" done [ "$logging" = "1" ] && let "colorize = 0" [ "$colorize" = "1" ] && notify.enable_colors # default values for non mandatory configuration variables [ "$logging_dir" ] || logging_dir="${tmppath_dir:-/var/tmp}/@package@" # function autobuild.build() # execute the commands contained in all the rules blocks # args: # $1 : none function autobuild.build() { # function autobuild.do_current() # execute the commands contained in a rules block # args: # $1 : name (and path) of the rules file function autobuild.do_current() { local steps [ "$download" = true ] && steps="1" # FIXME: support for `update' is not complete ! if [ -n "$update" ]; then steps="${steps:+$steps,}4" [ "$update" = rebuild ] && let "rebuild = 1" fi [[ "$build" = true || "$build" = force ]] && steps="${steps:+$steps,}5" [ "$build" = force ] && let "force_build = 1" [ "$install" = testonly ] && steps="${steps:+$steps,}7" [ "$install" = true ] && steps="${steps:+$steps,}11" [ "$install" = force ] && { steps="${steps:+$steps,}11"; let "force_install = 1"; } [ "$upload" = true ] && steps="${steps:+$steps,}10" ( let "colorize = 0" notify.disable_colors package.update \ "${spec_format:-0}" \ "$pck_name" "$pck_newver" "$pck_newrel" \ "$steps" \ "" "" \ "${spec_name:-"${pck_name}.spec"}" \ "$define_list" \ "$ftp_server_download_num" \ "$ftp_server_upload_num"; ) # FIXME: "$changelog_userdef" let "error = $?" [ "$error" = 0 ] || notify.warning $"error detected!" } local rulesfile="$1" notify.debug "rulesfile = \"$rulesfile\"" [ "$batchfile" ] || notify.error $"\ (bug)"" -- $FUNCNAME: "$"rulesfile unset" [ -r $rulesfile ] || notify.error $"file not found"": \`$rulesfile'" notify.note $"parsing"" ${NOTE}$rulesfile${NORM}..." local linenum=1 unset pck_name while read line; do set -- $line notify.debug "line = \"$line\"" notify.debug " \$1 = \"$1\"" case "$1" in \#*|"") # skip comments and blank lines ;; "[COMMANDS]"|"[GLOBAL]"|"[PACKAGES]") section="$1" notify.debug "parsing $1 section (line #$linenum)..." if [ "$section" = "[PACKAGES]" ]; then # check for syntax errors [ "$logging_dir" ] || notify.error $"undefined directive"" \`logdir'" [ "$spec_dir" ] || notify.error $"undefined directive"" \`specdir'" fi # if a package block is yet cached, do autobuild it # (this happens for the last package listed in the rules file) if [ "$pck_name" ]; then notify.debug "batchtargetpck = \"$batchtargetpck\"" notify.debug "pck_name = \"$pck_name\"" [ "$pck_name" = "${batchtargetpck:-$pck_name}" ] && autobuild.do_current unset pck_name fi ;; logdir) [ "$section" = "[GLOBAL]" ] || notify.error \ $"misplaced directive"" \`logdir', "$"line"" #$linenum" logging_dir="$(eval echo $2)" notify.note "logdir: ${NOTE}$logging_dir${NORM}" ;; specdir) [ "$section" = "[GLOBAL]" ] || notify.error \ $"misplaced directive"" \`specdir', "$"line"" #$linenum" spec_dir="$(eval echo $2)" notify.note "specdir: ${NOTE}$spec_dir${NORM}" ;; package) if [ "$pck_name" ]; then # the previous package block has ended, so the corresponding # actions must be taken now notify.debug "batchtargetpck = \"$batchtargetpck\"" notify.debug "pck_name = \"$pck_name\"" if [ "$pck_name" = "${batchtargetpck:-$pck_name}" ]; then autobuild.do_current let "error = $?" [ "$error" = 0 ] || notify.warning $"error detected!"" ($pck_name)" fi unset pck_name fi let "error = 0" pck_name="$(eval echo $2)" notify.debug "batchtargetpck = \"$batchtargetpck\"" notify.debug "pck_name = \"$pck_name\"" [ "$pck_name" = "${batchtargetpck:-$pck_name}" ] && notify.note "\n*** "$"package"": ${NOTE}$pck_name${NORM}" ;; specfile_name) # optional: if missing, specfile_name is set to .spec spec_name="$2" ;; download) [ "$error" = 0 ] || continue download="$(eval echo $2)" # legal values: true, false case "$download" in true|false) ;; *) notify.warning \ $"unknown rvalue"" \`$upload', "$"line"" #$linenum" let "error+=1" ;; esac ;; download_server) [ "$error" = 0 ] || continue ftp_server_download_num="$(eval echo $2)" ;; update) [ "$error" = 0 ] || continue # legal values are , rebuild, false # ex: <*.2n.*> (any, even number, any) # <*.2n+1.*> (any, odd number, any) # <*> (any number) update="$(eval echo $2)" case "$update" in rebuild|false) ;; *) # FIXME : implementation is incomplete # should perhaps make a syntax checking pck_newver="$update" notify.debug "pck_newver = \"$pck_newver\"" pck_newrel="$(eval echo $3)" notify.debug "pck_newrel = \"$pck_newrel\"" ;; esac ;; build) [ "$error" = 0 ] || continue # legal values: false, force, true build="$(eval echo $2)" case "$build" in false|force|true) ;; *) notify.warning \ $"unknown rvalue"" \`$upload', "$"line"" #$linenum" let "error+=1" ;; esac ;; build_define) [ "$error" = 0 ] || continue shift; define_list="$(eval echo $*)" ;; install) [ "$error" = 0 ] || continue # legal values: false, force, testonly, true install="$(eval echo $2)" case "$install" in false|force|testonly|true) ;; *) notify.warning \ $"unknown rvalue"" \`$upload', "$"line"" #$linenum" let "error+=1" ;; esac ;; upload) [ "$error" = 0 ] || continue # legal values: true, false upload="$(eval echo $2)" case "$upload" in true|false) ;; *) notify.warning \ $"unknown rvalue"" \`$upload', "$"line"" #$linenum" let "error+=1" ;; esac ;; upload_server) [ "$error" = 0 ] || continue ftp_server_upload_num="$(eval echo $2)" ;; *) [ "$section" = "[COMMANDS]" ] && { eval "$line"; continue; } notify.error \ $"unknown token"" \`$1', "$"line"" #$linenum" ;; esac let "linenum += 1" done < $rulesfile # if a package block is yet cached, do autobuild it if [ "$pck_name" ]; then [ "$pck_name" = "${batchtargetpck:-$pck_name}" ] && autobuild.do_current unset pck_name fi } # function autobuild.doall() # frontend for this plugin # args: # $1 : name (and path) of the rules file function autobuild.doall() { local rulesfile="$1" notify.debug "rulesfile = \"$rulesfile\"" [ "$batchfile" ] || notify.error $" (bug)"" -- $FUNCNAME: "$"rulesfile unset" notify.error "FIXME: sorry, this plugin is currently unmantained" ( # set some global variables used by the pck-update plugin let "logging = 1" notify.debug $"loading plugin"" \`$plugin_pck_update'..." # FIXME: switch to the new @package@ architecture !!! . $plugin_pck_update autobuild.build "$batchfile"; ) return $? } # user configuration file for @package@ required config.check4user # make some security checks config.security autobuild.doall "$batchfile"