User Tools

Site Tools


userspace:opsi-info

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
userspace:opsi-info [2013/09/03 16:39]
islam created
userspace:opsi-info [2013/12/10 18:00]
islam
Line 1: Line 1:
-opsi-info+**opsi-info**
  
 opsi-info.sh opsi-info.sh
  
 shell script to change version information of available opsi packages shell script to change version information of available opsi packages
 +
 +**Features:**
 +
 +- Display Version and package-version of any opsi product
 +
 +- Edit Version and package-version of any opsi product
 +
 +- Change Product version if defined in setup script (setup.ins)
 +
 +updates this File String in setup.ins:
 +<code>Set $ProductVersion$  = "24.1.1"</code>
 +replacing the version number can be useful if you use the version as parameter in your setup script, for example
 +<code>"%ScriptPath%\files\Firefox Setup $ProductVersion$esr.exe" -ms -ira</code>
 +
 +This means, updating Firefox would just require you to place the new setup exe file inside "%ScriptPath%\files\"
 +then setting the the new version with opsi-info.sh
 +
 +- optionally set "setup" action for the updated product on all clients with the product already installed
 +
  
 Download Link here: http://islamadel.com/en/downloads?func=fileinfo&id=12 Download Link here: http://islamadel.com/en/downloads?func=fileinfo&id=12
 +
 +############################
 +
 +opsi-info : view / edit opsi package information
 +
 +usage:
 +
 +opsi-info [arguments]
 +
 +arguments:
 +
 +-h : display help
 +
 +-prod [product-id] : view / edit info for product-id
 +
 +-ver [decimal] : set decimal value for product version
 +
 +-pver [integer] : set value for package version
 +
 +
 +example: <code Bash>opsi-info.sh -prod internet_firefox -ver 25.0.1</code>
 +
 + sets new version "25.0.1" for product-id "internet_firefox"
 +
 +
 +############################
 +
 +**opsi-info.sh**
 +
 +<code Bash>
 +#!/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
 +# 2013-12-10 added option to update clients with product already installed, set correct file rights for edited files
 +
 +# target: - prompt for software setup on all clients with status "installed"
 +
 +# General-Info to find installed product on client:
 +
 +# installed info:
 +# in /home/opsiproducts/client-name.ini
 +# internet_firefox = installed:none
 +# function:
 +# Find string "internet_firefox = installed:none" all "*.ini" Files in "/home/opsiproducts/" (replace internet_firefox by product name)
 +#
 +# Set for setup
 +# change from "internet_firefox = installed:none"
 +# to: "internet_firefox = installed:setup"
 +
 +#
 +#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.12.10"
 +#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
 +}
 +
 +#find clients with installed product and set for setup
 +f_UpdateClients() {
 + # Find string "internet_firefox = installed:none" all "*.ini" Files in "/home/opsiproducts/" (replace internet_firefox by product name)
 +
 + # first find clients, display names and prompt
 + # use: grep -l "internet_firefox = installed:none" /var/lib/opsi/config/clients/*.ini
 +
 + echo
 + echo "Searching for clients with [ ${product} ] status: installed .."
 + echo
 +
 + # Set number of clients found with product already installed
 + updclient=0
 + #Path of clients Folder
 + clientspath="/var/lib/opsi/config/clients/"
 + #backup path for clients
 + client_bak_dir="/var/lib/opsi/config/clients/archiv/"
 + #create backup folder if not exist
 + if [ ! -d "$client_bak_dir" ]; then mkdir -p "$client_bak_dir"; fi
 +
 + # find all clients with product already installed and not set to setup
 + for c in $(grep -l "${product} = installed:none" "${clientspath}"*.ini 2>/dev/null); do
 + # print client names with product already installed, trim .ini extension
 + # print client name only - trim .ini extension, trim dir path
 + #echo ${c%.ini}
 + echo "$(echo ${c%.ini} | xargs -n1 basename)"
 + # Add number of clients and check later if results >0
 + updclient=$((updclient + 1))
 + done
 +
 + #If results found, begin interaction
 + if [ "${updclient}" == "0" ]; then
 + # message if search results is 0 
 + echo
 + echo "[ ${product} ] is not installed on any client."
 + echo
 + else
 + echo
 + echo "[ ${updclient} ] clients found."
 + echo
 + # Now ask if setup action should be set.
 +
 + ###
 + read -n1 -p  " Set SETUP action for [ ${product} ] on listed clients ? : [ y=Yes | n=No ]: [Default: y ] "
 + case "${REPLY}" in
 + # use last path accepted
 + "" | "y" | "Y" | "yes" | "Yes")
 + # yes I want to set product for setup on clients
 + #echo
 + echo "Setting SETUP action.."
 + echo
 + for c in $(grep -l "${product} = installed:none" "${clientspath}"*.ini 2>/dev/null); do
 + # print client names with product already installed, trim .ini extension
 + #echo ${c%.ini}
 + # Add number of clients and check later if results >0
 + #updclient=$((updclient + 1))
 +
 + # backup client files first
 + #cp -f "${c}" "${c}_$NOW.bak"
 + # backup original file to backup dir, trimming source file name only adding date.bak as suffix
 + cp -f "${c}" "${client_bak_dir}$(echo ${c} | xargs -n1 basename)_$NOW.bak"
 + # begin replacing string into tmp file
 + cat "${c}" | sed 's/'${product}' = installed:none/'${product}' = installed:setup/g' >"${c}".tmp
 + # replace tmp file with original file
 + mv -f "${c}".tmp "${c}"
 + # set file rights
 + chown opsiconfd:opsifileadmins "${c}"
 + chmod 660 "${c}"
 +
 + #verify edit
 + if grep -q "${product} = installed:setup" "${c}"
 + then
 +  # code if found
 +  echo "OK: SETUP action set for: $(echo ${c} | xargs -n1 basename)"
 + else
 +  # code if not found
 +  error "SETUP action NOT set for: $(echo ${c} | xargs -n1 basename)"
 + fi
 + done
 + ;;
 + # skip file, any other entry
 + *)
 + # Any other answer is now
 + # No changes
 + echo "No clients have been modified."
 + echo
 + ;;
 + esac
 +
 + 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"
 + # set file rights
 + chown opsiconfd:opsifileadmins "$inst_dir""$setup_file"
 + chmod 660 "$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'
 + # set file rights
 + chown opsiconfd:opsifileadmins "$product_dir""$product_file_new"
 + chmod 660 "$product_dir""$product_file_new"
 +
 + #### change file version in setup script
 + f_Install
 + ### update installed clients
 + f_UpdateClients
 + ;;
 + 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"
 + # set file rights
 + chown opsiconfd:opsifileadmins "$product_dir""$product_file_new"
 + chmod 660 "$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"
 + # set file rights
 + chown opsiconfd:opsifileadmins "$product_dir""$product_file_new"
 + chmod 660 "$product_dir""$product_file_new"
 + #### change file version in setup script
 + f_Install
 + ### update installed clients
 + f_UpdateClients
 + ;;
 + 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
 + # set file rights
 + chown opsiconfd:opsifileadmins $depot
 + chmod 660 $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
 + # set file rights
 + chown opsiconfd:opsifileadmins $depot
 + chmod 660 $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
 + # set file rights
 + chown opsiconfd:opsifileadmins $depot
 + chmod 660 $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
 + # set file rights
 + chown opsiconfd:opsifileadmins $depot
 + chmod 660 $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 
 +
  
  
 +</code>
userspace/opsi-info.txt ยท Last modified: 2021/08/23 08:37 (external edit)