This is an old revision of the document!
opsi-info
opsi-info.sh
shell script to change version information of available opsi packages
Download Link here: http://islamadel.com/en/downloads?func=fileinfo&id=12
#!/bin/bash ############### # opsi-info # read / edit opsi-package info # By Islam Adel ############### #usage: opsi-info -h (help file) ############### #change log: # 2013-09-02 view, edit product version, depot file autodetection # 2013-09-03 view, edit package version, backup all edited files #target: - read/edit opsi package information # - list all package-ids # - error verification / reporting # - read / edit package version # - backup all relevant files # - fix conflict if product version = package version #to-do: auto detect depot files #input: arguments 1. option, 2. product_id, 3. value # option: -ver (product version) ###################### # global variables ver="13.09.03" #set loop delimiter as "newline" IFS=$'\n' #current_date_time NOW="$(date '+%Y-%m-%d_%H-%M-%S')" ###################### # user variables # opsi="local" #for local test # opsi="remote" #for remote usage on server opsi="remote" ###################### #functions #error message error() { echo "ERROR: $@" echo # echo "use -h argument for help" # echo #exit } #display hel f_printUsage() { echo "opsi-info : view / edit opsi package information" echo echo "usage:" echo echo "opsi-info [arguments]" echo echo "arguments:" echo echo "-h : display help" echo "-prod [product-id] : view / edit info for product-id" #echo "-ver | --version : view current product version" echo "-ver [decimal] : set decimal value for product version" #echo "-pver | --pkgversion : view current package version" echo "-pver [integer] : set value for package version" echo echo echo "example: opsi-info.sh -prod internet_firefox -ver 25.0.1" echo " sets new version \"25.0.1\" for product-id \"internet_firefox\"" echo exit } # read all passed arguments f_GetArgs() { #echo "all args=[${@}]" #echo "number of args=[${#}]" #echo "1=${1}" #echo "2=${2}" #echo "3=${3}" #echo "4=${4}" i=0 argv=() for arg in "$@"; do argv[$i]="$arg" i=$((i + 1)) #debug# echo $i=$arg done # Handle OPTIONS and build directory array #n_threads=1 #check_env=1 #run_jobs=0 #set_version="3c4n.15" #is_2010="" i=0 dir_index=0 while test $i -lt $# ; do arg="${argv[$i]}" case "$arg" in #--2010) is_2010="--2010";; -h|--help) f_printUsage;; #-j|--jobs) i=$((i + 1)); n_threads=${argv[$i]};; #-rj|--run-jobs) run_jobs=1;; #--no-env-check) check_env=0;; #verify decimal value before setting --version|-ver) i=$((i + 1)); if [ "$(echo "${argv[$i]}" | tr -d ".")" -eq "$(echo "${argv[$i]}" | tr -d ".")" ] > /dev/null 2>&1; then new_version="${argv[$i]}"; else error "value for -ver must be decimal"; fi;; #verify integer value before setting --pkgversion|-pver) i=$((i + 1)); if [ "$(echo "${argv[$i]}")" -eq "$(echo "${argv[$i]}")" ] > /dev/null 2>&1; then new_pkg_version="${argv[$i]}"; else error "value for -pver must be an integer";fi;; --product|-prod) i=$((i + 1)); product="${argv[$i]}";; *) if ! test -d "$arg" ; then error "Unknown argument or directory '$arg'"; exit else source_dirs[$dir_index]="$arg" dir_index=$((dir_index + 1)) fi;; esac i=$((i + 1)) done } # input file f_Depot() { #autodetect depot file if [ "$opsi" == "remote" ]; then depot_dir="/var/lib/opsi/config/depots/"; fi #local_test if [ "$opsi" == "local" ]; then depot_dir="/Users/islam/Documents/rechnerpool/opsi/updater/opsi-server/config/depots/"; fi dep=0 for d in $(ls "$depot_dir"*.ini 2>/dev/null | xargs -n1 basename); do # add depot number dep=$((dep + 1)) dep_[$i]="$d" #echo "$d" #prompt to choose depot number if multiple found depot_name="$d" depot="$depot_dir""$d" #echo $depot_name #echo $depot if [ "$dep" -gt "1" ]; then echo "[ $dep ] depots have been found" echo "using: $depot" #add this feature later, to choose depot number fi done if [ ! "$depot" ]; then error "No Depot has been found in: $depot_dir"; exit ; fi depot_bak_dir="$depot_dir""archiv/" depot_bak_file="$depot_bak_dir""$depot_name""_$NOW.bak" #create backup folder if not exist if [ ! -d "$depot_bak_dir" ]; then mkdir -p "$depot_bak_dir"; fi #tmp files depot_tmp1="$depot.1.tmp" # remove existing tmp file if [ -f $depot_tmp1 ]; then rm -f $depot_tmp1; fi depot_tmp2="$depot.2.tmp" if [ -f $depot_tmp2 ]; then rm -f $depot_tmp2; fi } #version info in install script f_Install() { if [ "$opsi" == "remote" ]; then inst_dir="/opt/pcbin/install/""$product"/; fi #local_test if [ "$opsi" == "local" ]; then inst_dir="/Users/islam/Documents/rechnerpool/opsi/updater/opsi-server/install/""$product"/; fi setup_file="setup.ins" setup_bak_dir="$inst_dir""archiv/" setup_bak_file="$setup_bak_dir""$setup_file""_$NOW.bak" #create backup folder if not exist if [ ! -d "$setup_bak_dir" ]; then mkdir -p "$setup_bak_dir"; fi #Set $ProductVersion$ = "17.0.7" if [ -f "$inst_dir""$setup_file" ]; then #echo "setup.ins found" #change version info in setup-script #echo "-----------" $old_version #cat "$inst_dir""$setup_file" | grep "Set \$ProductVersion\$ = \"$old_version" #echo "-----------" #backup cp -f "$inst_dir""$setup_file" "$setup_bak_file" cat "$inst_dir""$setup_file" | sed 's/Set \$ProductVersion\$ = "'$old_version'"/Set \$ProductVersion\$ = "'$new_version'"/g' >"$inst_dir""$setup_file".tmp mv -f "$inst_dir""$setup_file".tmp "$inst_dir""$setup_file" #verify edit if grep -q "Set \$ProductVersion\$ = \"$new_version\"" "$inst_dir""$setup_file" then # code if found echo "OK: ProductVersion replaced in $setup_file" else # code if not found error "ProductVersion NOT replaced in $setup_file" fi fi } # products info f_Product() { if [ "$opsi" == "remote" ]; then product_dir="/var/lib/opsi/config/products/"; fi #local test if [ "$opsi" == "local" ]; then product_dir="/Users/islam/Documents/rechnerpool/opsi/updater/opsi-server/config/products/"; fi #echo "$new_version" #echo "$product" #read pkg_ver #set old packageversion if new is not defined if [ ! "$new_pkg_version" ]; then new_pkg_version="$old_pkg_version"; fi #set old product version if new is not defined if [ ! "$new_version" ]; then new_version="$old_version"; fi #prod_pkg_ver="$old_pkg_version" #identify type .localboot or .netboot #later feature product_file_old="$product"_"$old_version"-"$old_pkg_version".localboot product_file_new="$product"_"$new_version"-"$new_pkg_version".localboot # echo # echo old_version="$old_version" # echo new_version="$new_version" # echo old_pkg_version="$old_pkg_version" # echo new_pkg_version="$new_pkg_version" product_bak_dir="$product_dir""archiv/" product_bak_file="$product_bak_dir""$product_file_old""_$NOW.bak" #create backup folder if not exist if [ ! -d $product_bak_dir ]; then mkdir -p $product_bak_dir; fi #check if product file exists if [ -f "$product_dir""$product_file_old" ]; then #### rename product file #backup file? #later cp -f "$product_dir""$product_file_old" "$product_bak_file" mv -f "$product_dir""$product_file_old" "$product_dir""$product_file_new" #check if renamed file exists? #later_feature #### change file version in content case "$change" in 1) # change product version cat "$product_dir""$product_file_new" | sed 's/version: '$old_version'/version: '$new_version'/g' >"$product_dir""$product_file_new".tmp mv -f "$product_dir""$product_file_new".tmp "$product_dir""$product_file_new" # verify change, #later # cat "$product_dir""$product_file_new" | grep version: '$new_version' #### change file version in setup script f_Install ;; 3) # change package version / sed ====> first match for version: only / first occurence cat "$product_dir""$product_file_new" | awk '/version: '$old_pkg_version'/{if (M==""){sub("version: '$old_pkg_version'","version: '$new_pkg_version'");M=1}}{print}' >"$product_dir""$product_file_new".tmp # all occurences #cat "$product_dir""$product_file_new" | sed 's/version: '$old_pkg_version'/version: '$new_pkg_version'/g' > "$product_dir""$product_file_new".tmp mv -f "$product_dir""$product_file_new".tmp "$product_dir""$product_file_new" ;; 4) #change prod. version first, then pkg version cat "$product_dir""$product_file_new" | sed 's/version: '$old_version'/version: '$new_version'/g' >"$product_dir""$product_file_new".tmp cat "$product_dir""$product_file_new".tmp | awk '/version: '$old_pkg_version'/{if (M==""){sub("version: '$old_pkg_version'","version: '$new_pkg_version'");M=1}}{print}' >"$product_dir""$product_file_new" #mv -f "$product_dir""$product_file_new".tmp2 "$product_dir""$product_file_new" #### change file version in setup script f_Install ;; esac if [ -f "$product_dir""$product_file_new".tmp ]; then rm -f "$product_dir""$product_file_new".tmp; fi else error "Product file: [ $product_file_old ] not found in: [ $product_dir ]" #restore backed up file mv -f $depot_bak_file $depot fi } ###################### #script start echo echo "#################################" echo "# #" echo "# opsi-info version: $ver #" echo "# #" echo "# use -h for help #" echo "# #" echo "#################################" echo # read arguments f_GetArgs $@ f_Depot #display values #echo "using depot file :" #echo " $depot" #echo ver = $new_version #echo product = $product #read depot file # sed '/^start_string/s/search_string/replace_string/' # replace line starting with "[" by "@" # replace new lines by ";" # replace "@" by "new line" # replace ";;" by ";" # replace ";" by "newline" #cat $depot | sed '/^\[/s/\[/@\[/' | tr '\n' ';' | tr '@' '\n' | sed 's/;;/;/g' | tr ';' '\n' #create tmp file and change structure for search cat $depot | sed '/^\[/s/\[/@\[/' | tr '\n' ';' | tr '@' '\n' > $depot_tmp1 # find line with product name and replace string (version value) till ";" found=0 change=0 for v in $(cat $depot_tmp1 | grep "\[$product-state\]"); do found=$((found + 1)) if [ "$found" == "1" ]; then # must find 1 instance only - replace only one product # read current version #last working: old_version=$(echo $v | sed 's/\[.*productversion.*= //g' | tr -d ";") old_version=$(echo "$v" | sed -e 's/^.*productversion = \([.[:digit:]]*\);.*$/\1/g') old_pkg_version=$(echo "$v" | sed -e 's/^.*packageversion = \([.[:digit:]]*\);.*$/\1/g') # echo old_version="$old_version" # echo new_version="$new_version" # echo old_pkg_version="$old_pkg_version" # echo new_pkg_version="$new_pkg_version" # echo v="$v" #edit only if new_version is defined if [ "$new_version" ]; then change=$((change + 1)) # replace old version with new, retain whole string n=$(echo "$v" | sed -e 's/productversion = '$old_version';/\productversion = '$new_version';;/g') #echo n="$n" #exit echo "replacing product version for: [ $product ], from: [ $old_version ] to: [ $new_version ]" else echo "current product version for: [ $product ], is: [ $old_version ]" fi #edit only if new_pkg_version is defined if [ "$new_pkg_version" ]; then change=$((change + 3)) # replace old version with new, retain whole string p=$(echo "$v" | sed -e 's/packageversion = '$old_pkg_version';/\packageversion = '$new_pkg_version';;/g') echo "replacing package version for: [ $product ], from: [ $old_pkg_version ] to: [ $new_pkg_version ]" else echo "current package version for: [ $product ], is: [ $old_pkg_version ]" fi else error "[ $found ] matches found for: $product " fi done #case for changes case "$change" in # 0) echo "# nothing to change";; 1) #echo "# change version only" # backup original depot file cp -f $depot $depot_bak_file # replace version info and retain original file structure sed 's/\'$v'/\'$n'/g' $depot_tmp1 | sed 's/;;/;/g' | tr ';' '\n' >$depot f_Product ;; 3) #echo "# change pkg version only" # backup original depot file cp -f $depot $depot_bak_file sed 's/\'$v'/\'$p'/g' $depot_tmp1 | sed 's/;;/;/g' | tr ';' '\n' >$depot # change further files f_Product ;; 4) #echo "# change pver + ver" p=$(echo "$n" | sed -e 's/packageversion = '$old_pkg_version';/\packageversion = '$new_pkg_version';;/g') # backup original depot file cp -f $depot $depot_bak_file # replace version info and retain original file structure sed 's/\'$v'/\'$p'/g' $depot_tmp1 | sed 's/;;/;/g' | tr ';' '\n' >$depot # change further files f_Product ;; esac # errors only if product / arguments specified #echo $i if [ "$i" -gt "0" ]; then if [ "$found" == "0" ]; then error "no matching product found"; fi else error "no arguments specified" echo "use -h argument for help" fi # file end echo echo "###############################" echo echo "process done." # remove existing tmp file if [ -f $depot_tmp1 ]; then rm -f $depot_tmp1; fi if [ -f $depot_tmp2 ]; then rm -f $depot_tmp2; fi echo #read -p "" #exit