#! /bin/sh # $Id$ # vim:et:ft=sh:sts=2:sw=2 # # Copyright 2008 Kate Ward. All Rights Reserved. # Copyright 2013 Mario Fetka. All Rights Reserved. # Released under the LGPL (GNU Lesser General Public License) # # Author: Mario Fetka # # treat unset variables as an error set -u die() { [ $# -gt 0 ] && echo "error: $@" | boxes -d shell >&2 exit 1 } BASE_DIR="`dirname $0`/.." LIB_DIR="${BASE_DIR}/lib" OPSI_WEB_ROOT="" # load libraries . ${LIB_DIR}/shflags || die 'unable to load shflags library' . ${LIB_DIR}/shlib || die 'unable to load shlib library' . ${LIB_DIR}/versions || die 'unable to load versions library' # Source local build configuration (must be done AFTER sourcing the builder-product.cfg.cfg) test -f $HOME/.opsi-administration.cfg && . $HOME/.opsi-administration.cfg # define flags DEFINE_string 'name' '' 'the name of the package' 'n' DEFINE_string 'version' '' 'the version of the package' 'v' DEFINE_string 'type' '' 'type of package' 'y' DEFINE_string 'from' '' 'source level of package' 'f' DEFINE_string 'to' '' 'output file to write to' 't' DEFINE_string 'root' '' 'output file to write to' 'r' DEFINE_string 'show' '' 'show a list of the' 's' DEFINE_string 'delete' '' 'delete specific versions of the package' 'd' DEFINE_boolean 'purge' false 'delete old versions of the package' 'p' FLAGS_HELP="USAGE: ${ARGV0} [flags]" #if [ `which 7z` ] || exit go_show() { local opsi_dir=$1 local show_name=$2 local show_type=$3 local show_from=$4 local show_to=$5 local show_version="" local show_dir="/${opsi_dir}/${show_type}/${show_from}/" # Find all revision files and sort them local file_list=`mktemp /tmp/opsi-administration.show.XXXXXXXXXXX` local file_list_version=`mktemp /tmp/opsi-administration.show.version.XXXXXXXXXXX` local file_list_release=`mktemp /tmp/opsi-administration.show.release.XXXXXXXXXXX` local file_list_final=`mktemp /tmp/opsi-administration.show.final.XXXXXXXXXXX` local show_list=`mktemp /tmp/opsi-administration.show.list.XXXXXXXXXXX` echo "" echo "Web Root: ${show_dir} Package Name: ${show_name}" >> $show_list echo "" >> $show_list for cfg_file in `find ${show_dir} -name "${show_name}-*.cfg" -print ` ; do . ${cfg_file} echo $REV_VERSION >> ${file_list} done sort -V ${file_list} | uniq > ${file_list_version} for pkg_version in `cat ${file_list_version}` ; do for cfg_file_ver in ${show_dir}/${show_name}-${pkg_version}-*.cfg ; do . ${cfg_file_ver} echo ${pkg_version}-$REV_CREATOR_TAG$REV_RELEASE >> ${file_list_release} done done sort -V ${file_list_release} | uniq > ${file_list_final} for release_file_list in `cat ${file_list_final}` ; do . ${show_dir}/${show_name}-${release_file_list}.cfg echo $REV_PN-$REV_VERSION-$REV_CREATOR_TAG$REV_RELEASE >> $show_list show_version=$REV_VERSION-$REV_CREATOR_TAG$REV_RELEASE done if [ -n "${show_version}" ];then echo "./${ARGV0} --root ${OPSI_ROOT} --name ${show_name} --type ${show_type} --from ${show_from} --to ${show_to} --version ${show_version} --purge" >> $show_list echo "./${ARGV0} --root ${OPSI_ROOT} --name ${show_name} --type ${show_type} --delete ${show_from} --version ${show_version} " >> $show_list else echo "no package named ${show_name}-* in this dir ${show_dir}" >> $show_list fi boxes -d shell $show_list echo "" rm -f ${show_list} rm -f ${file_list} rm -f ${file_list_final} rm -f ${file_list_version} rm -f ${file_list_release} } go_copy() { local opsi_dir=$1 local copy_name=$2 local copy_type=$3 local copy_from=$4 local copy_to=$5 local copy_version=$6 local copy_from_dir="/${opsi_dir}/${copy_type}/${copy_from}/" local copy_to_dir="/${opsi_dir}/${copy_type}/${copy_to}/" local copy_list=`mktemp /tmp/opsi-administration.copy.list.XXXXXXXXXXX` echo "" echo "Web Root Source: ${copy_from_dir} Web Root Destination: ${copy_to_dir}" >> $copy_list echo "Package Name: ${copy_name}" >> $copy_list echo "" >> $copy_list if [ ${FLAGS_purge} -eq ${FLAGS_TRUE} ]; then rm -f ${copy_to_dir}/${copy_name}* >> $copy_list fi ln -vf ${copy_from_dir}/${copy_name}?${copy_version}* ${copy_to_dir}/ >> $copy_list boxes -d shell $copy_list echo "" rm -f ${copy_list} } go_delete() { local opsi_dir=$1 local delete_name=$2 local delete_type=$3 local delete_delete=$4 local delete_version=$5 local delete_dir="/${opsi_dir}/${delete_type}/${delete_delete}/" local delete_list=`mktemp /tmp/opsi-administration.delete.list.XXXXXXXXXXX` echo "" echo "Web Root : ${delete_dir} Package Name: ${delete_name}" >> $delete_list echo "" >> $delete_list rm -f ${delete_dir}/${delete_name}?${delete_version}* >> $delete_list boxes -d shell $delete_list echo "" rm -f ${delete_list} } main() { # checks # check if a config file is present or the --root flag has been added if [ -n "${OPSI_WEB_ROOT}" ];then OPSI_ROOT="${OPSI_WEB_ROOT}" else if [ -n "${FLAGS_root}" ];then OPSI_ROOT=${FLAGS_root} else die 'root flag or config file mising' fi fi # the name falg is always needed [ -n "${FLAGS_name:-}" ] || die 'name flag missing' # check if the type is correctly set if [ -n "${FLAGS_type}" ] ; then case "${FLAGS_type}" in public) ;; restricted) ;; *) die "type is only public or restricted" ;; esac fi # check if the show is correctly set if [ -n "${FLAGS_show}" ] ; then case "${FLAGS_show}" in integration) ;; testing) ;; release) ;; *) die "show is onyl integration testing or release" ;; esac fi # check if the from is correctly set if [ -n "${FLAGS_from}" ] ; then case "${FLAGS_from}" in integration) ;; testing) ;; release) ;; *) die "from is onyl integration testing or release" ;; esac fi # check if the to is correctly set if [ -n "${FLAGS_to}" ] ; then case "${FLAGS_to}" in integration) ;; testing) ;; release) ;; *) die "to is onyl integration testing or release" ;; esac fi # check if the delete is correctly set if [ -n "${FLAGS_delete}" ] ; then case "${FLAGS_delete}" in integration) ;; testing) ;; release) ;; *) die "to is onyl integration testing or release" ;; esac fi # set some local vars local show_from="" local show_to="" if [ -z "${FLAGS_from}" ] && [ -z "${FLAGS_to}" ] && [ -z "${FLAGS_type}" ] ; then go_show ${OPSI_ROOT} ${FLAGS_name:-} "public" "integration" "testing" elif [ -n "${FLAGS_show}" ] && [ -n "${FLAGS_type}" ] ; then case "${FLAGS_show}" in integration) show_from="integration" show_to="testing" ;; testing) show_from="testing" show_to="release" ;; esac go_show ${OPSI_ROOT} ${FLAGS_name:-} ${FLAGS_type:-} ${show_from} ${show_to} elif [ -z "${FLAGS_show}" ] && [ -n "${FLAGS_type}" ] && [ -n "${FLAGS_from}" ] && [ -n "${FLAGS_to}" ] && [ -n "${FLAGS_version}" ]; then go_copy ${OPSI_ROOT} ${FLAGS_name:-} ${FLAGS_type:-} ${FLAGS_from:-} ${FLAGS_to:-} ${FLAGS_version:-} ${FLAGS_purge} elif [ -z "${FLAGS_show}" ] && [ -n "${FLAGS_type}" ] && [ -n "${FLAGS_delete}" ] && [ -n "${FLAGS_version}" ]; then go_delete ${OPSI_ROOT} ${FLAGS_name:-} ${FLAGS_type:-} ${FLAGS_delete:-} ${FLAGS_version:-} else die "read documetation for how to use" fi } FLAGS "$@" || exit $? [ ${FLAGS_help} -eq ${FALSE} ] || exit eval set -- "${FLAGS_ARGV}" main "$@"