X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;f=functions.sh;h=2ab04ff124f4e450a84492b2c72d6b59d7f43861;hb=f65804c1b92f032afd4e09b7f01ea48de446ac6d;hp=4b3013d1ca07333c32589bac60d16adfc1c768d5;hpb=45351df2bc9832d4ce2f9ee6a2b19370236e89a8;p=carnet-tools-cn.git diff --git a/functions.sh b/functions.sh index 4b3013d..2ab04ff 100644 --- a/functions.sh +++ b/functions.sh @@ -1,6 +1,13 @@ +# Initialize "public" CP_ECHO_RETURN variable once +if [ -z "$_CP_INIT_ECHO_RETURN" ]; then + _CP_INIT_ECHO_RETURN=1 + CP_ECHO_RETURN="" +fi + # by ddzeko & ico, Fri, 18 Mar 2005 14:44:08 +0100 cp_get_ifaddr() { [ "$CP_SCRIPT_DEBUG" ] && set -vx + local ifaddr interface echo_return echo_return="$CP_ECHO_RETURN" # since we're making our own calls # in our own way we need to set CP_ECHO_RETURN the way we want it @@ -36,6 +43,7 @@ cp_get_ifaddr() { # by ddzeko & ico, Fri, 18 Mar 2005 14:44:08 +0100 cp_get_ifmask() { [ "$CP_SCRIPT_DEBUG" ] && set -vx + local ifmask interface echo_return echo_return="$CP_ECHO_RETURN" # since we're making our own calls # in our own way we need to set CP_ECHO_RETURN the way we want it @@ -70,28 +78,42 @@ cp_get_ifmask() { # by ddzeko, Mon, 21 Mar 2005 07:00:22 +0100 cp_get_ifdefault() { + [ "$CP_SCRIPT_DEBUG" ] && set -vx + local echo_return echo_return="$CP_ECHO_RETURN" # since we're making our own calls # in our own way we need to set CP_ECHO_RETURN the way we want it # but preserving initial state so it could be used afterwards CP_ECHO_RETURN="" - [ "$CP_SCRIPT_DEBUG" ] && set -vx RET="" case $1 in - dev) RET=`route -n | awk '/^0.0.0.0/{print $8}'` ;; - addr) RET=`route -n | awk '/^0.0.0.0/{print $2}'` ;; - *) echo "cp_get_ifdefault: Argument required (dev or addr)" >&2 ;; + dev) + RET=`route -n | awk 'BEGIN {m = 2^32} + /^0\.0\.0\.0[ \t]/ {if ($5 < m) {r = $8; m = $5}} + END {print r}'` + ;; + addr) + RET=`route -n | awk 'BEGIN {m = 2^32} + /^0\.0\.0\.0[ \t]/ {if ($5 < m) {r = $2; m = $5}} + END {print r}'` + ;; + *) + echo "cp_get_ifdefault: Argument required (dev or addr)" >&2 + ;; esac + [ -z "$RET" -a "$1" ] && echo "cp_get_ifdefault: No default route" >&2 + [ -z "$echo_return" ] || echo $RET CP_ECHO_RETURN="$echo_return" - [ -z "$RET" ] && return 1 + [ -n "$RET" ] || return 1 } # by ico, Tue, 15 Mar 2005 14:04:21 +0100 cp_get_netaddr() { [ "$CP_SCRIPT_DEBUG" ] && set -vx + local netmask ipaddress interface cidr echo_return echo_return="$CP_ECHO_RETURN" # since we're making our own calls # in our own way we need to set CP_ECHO_RETURN the way we want it @@ -138,17 +160,59 @@ cp_get_netaddr() { } cp_check_and_backup() { + [ "$CP_SCRIPT_DEBUG" ] && set -vx + cp_backup_conffile -r "$@" } # by ico, Tue, 15 Mar 2005 14:04:21 +0100 cp_backup_conffile() { [ "$CP_SCRIPT_DEBUG" ] && set -vx - local file_bak check did + + local dir ext file_bak check did opt_p opt_d - if [ "x$1" = "x-r" ]; then - check=1 - shift + dir=/var/backups + ext=.bak + + while echo "x$1" |grep -q '^x-'; do + case "$1" in + -r) + shift + check=1 + ;; + -p) + shift + opt_p=1 + ;; + -d) + shift + opt_d=1 + # Is argument to -d full path or relative? + if echo "$1" |grep -q '^/'; then + dir="$1" + else + dir="$dir/$1" + fi + shift + ;; + -n) + shift + ext= + ;; + esac + done + if [ "$opt_d" ]; then + if [ ! -e "$dir" -a "$opt_p" ]; then + mkdir "$dir" + fi + if [ $? -ne 0 ]; then + echo "cp_backup_conffile: Error creating backup directory $dir" 1>&2 + return 3 + fi + fi + if [ ! -d "$dir" ]; then + echo "cp_backup_conffile: Invalid backup directory $dir" 1>&2 + return 3 fi if [ -z "$1" ]; then return 1 @@ -158,9 +222,9 @@ cp_backup_conffile() { return 2 fi if [ -z "$2" ]; then - file_bak="/var/backups/`basename $1`.bak" + file_bak="$dir/`basename $1`$ext" else - file_bak="/var/backups/`basename $2`.bak" + file_bak="$dir/`basename $2`$ext" fi if [ ! -f "$file_bak" ]; then @@ -173,11 +237,13 @@ cp_backup_conffile() { did=1 fi fi - - if [ "$check" -a "$did" ]; then - return 0 - else + + [ -z "$check" ] && return 0 + + if [ "$check" -a ! "$did" ]; then return 3 + else + return 0 fi } @@ -190,6 +256,7 @@ cp_backup_conffile() { # cp_check_and_sed() { [ "$CP_SCRIPT_DEBUG" ] && set -vx + local s sedcmd grepret ret i if [ -z "$3" ]; then return 1 @@ -220,13 +287,14 @@ cp_check_and_sed() { fi ret=0 done - [ "$ret" -eq 2 -a "$grepret" ] && ret=1 || true + [ "$ret" -eq 2 -a "$grepret" ] && ret=1 return $ret } # by jelly, Sun, 20 Mar 2005 20:12:19 +0100 cp_echo () { [ "$CP_SCRIPT_DEBUG" ] && set -vx + if [ "x$1" = "x-mailonly" -o "x$1" = "x-m" ]; then shift else @@ -242,13 +310,18 @@ cp_echo () { # by jelly, Sun, 20 Mar 2005 20:12:19 +0100 cp_mail () { [ "$CP_SCRIPT_DEBUG" ] && set -vx + local pkg version quiet if [ "x$1" = "x-q" ]; then quiet=1 shift fi - [ -n "$1" ] && pkg="$1" # barf if no package - [ -n "$2" ] && version=" $2" || true + if [ -n "$1" ]; then + pkg="$1" + else + return 1 # must have at least the package name as argument + fi + [ -n "$2" ] && version=" $2" if [ "$(echo $CP_NOTICE|wc -w)" -gt 0 ]; then [ -n "$quiet" ] || echo "Mailing upgrade output to root." CP_NOTICE="From: $pkg postinst script @@ -273,6 +346,7 @@ ${CP_NOTICE}----------" # by ddzeko, Mon, 21 Mar 2005 11:31:59 +0100 cp_mv () { [ "$CP_SCRIPT_DEBUG" ] && set -vx + local new old if [ -z "$2" ]; then return 1 @@ -329,6 +403,8 @@ cp_yes_no () { # instead of some gibberish error message that our script does # not expect cp_db_get() { + [ "$CP_SCRIPT_DEBUG" ] && set -vx + local var var="$1" @@ -353,14 +429,14 @@ cp_db_get() { # by ico, Wed, 20 Apr 2005 21:09:54 +0200 cp_get_ldap_suffix() { + [ "$CP_SCRIPT_DEBUG" ] && set -vx + local echo_return echo_return="$CP_ECHO_RETURN" # since we're making our own calls # in our own way we need to set CP_ECHO_RETURN the way we want it # but preserving initial state so it could be used afterwards CP_ECHO_RETURN="" - [ "$CP_SCRIPT_DEBUG" ] && set -vx - if [ ! -f /etc/ldap/slapd.conf ]; then echo "cp_get_ldap_suffix: /etc/ldap/slapd.conf: No such file" >&2 return 2 @@ -383,14 +459,14 @@ cp_get_ldap_suffix() { # by ico, Wed, 20 Apr 2005 21:09:54 +0200 cp_get_ldap_realm() { + [ "$CP_SCRIPT_DEBUG" ] && set -vx + local echo_return echo_return="$CP_ECHO_RETURN" # since we're making our own calls # in our own way we need to set CP_ECHO_RETURN the way we want it # but preserving initial state so it could be used afterwards CP_ECHO_RETURN="" - [ "$CP_SCRIPT_DEBUG" ] && set -vx - if [ ! -f /etc/ldap/slapd.conf ]; then echo "cp_get_ldap_realm: /etc/ldap/slapd.conf: No such file" >&2 return 2 @@ -404,3 +480,41 @@ cp_get_ldap_realm() { CP_ECHO_RETURN="$echo_return" } +_cp_customize() { + [ "$CP_SCRIPT_DEBUG" ] && set -vx + # < input functions > output_functions + # new-prefix list-of-functions + perl -e ' + $prefix = shift; %keep = (); $output = ""; + $keep{$_} = 1 for @ARGV; + # add dependent functions + %deps = ( + get_ifaddr => [ "get_ifdefault" ], + get_netaddr => [ "get_ifdefault", "get_ifaddr", "get_ifmask" ], + check_and_backup => [ "backup_conffile" ], + check_and_sed => [ "mv" ], + get_ldap_realm => [ "get_ldap_suffix" ], + ); + foreach my $f (keys(%keep)) { + if (exists($deps{$f})) { + $keep{$_} = 1 for (@{$deps{$f}}); + } + } + while () { + if (/^_?cp_(\w+) *\(\) *\{/) { + if (! exists($keep{$1})) { + while () { last if /^\}/; } # skip it + next; + } else { + $output .= "\n"; + } + } + next if /^\s*(\#|$)/; + $output .= $_; + } + $output =~ s/\b(_?)cp_/$1${prefix}_/sg; + $prefix = uc($prefix); + $output =~ s/\b(_?)CP_/$1${prefix}_/sg; + print $output; + ' -- $* +}