+
+# 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
+ echo "$*"
+ fi
+ CP_NOTICE="$CP_NOTICE$1"
+ if [ `echo -n "$*" | wc -l` -eq 0 ]; then
+ CP_NOTICE="$CP_NOTICE
+"
+ fi
+}
+
+# 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
+ 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 <root>
+To: root
+Subject: $pkg$version package install log
+Date: $(LC_ALL=C /bin/date --rfc-2822)
+
+Hello!
+
+The $pkg package has been successfully installed on your computer.
+For your convenience, a partial output of the last $pkg installation
+is included below.
+
+----------
+${CP_NOTICE}----------"
+
+ if [ -x /usr/sbin/sendmail ]; then
+ echo "$CP_NOTICE" | /usr/sbin/sendmail -t -oi &
+ sleep 1
+ fi
+ fi
+}
+
+# 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
+ fi
+ new="$1"
+ old="$2"
+ if [ -e "$old" ]; then
+ chown --reference "$old" "$new"
+ chmod --reference "$old" "$new"
+ cp -pf "$old" "$old.cn-old"
+ fi
+ mv "$new" "$old"
+}
+
+# by ddzeko, Mon, 21 Mar 2005 13:35:42 +0100
+cp_yes_no () {
+ [ "$CP_SCRIPT_DEBUG" ] && set -vx
+ local prompt answer
+ prompt="$1"
+ [ "$prompt" ] || prompt="Are you sure?"
+ RET=""
+
+ # check to prevent user from using this when debconf is active
+ # (it would break communication with its backend - uses stdin/out)
+ if [ "$DEBCONF_REDIR" ]; then
+ echo "cp_yes_no: debconf redirection detected" >&2
+ return 1
+ fi
+
+ echo -n "$prompt (y)es/(n)o: "
+ read answer
+ case "$answer" in
+ Y*)
+ echo
+ RET=y
+ ;;
+ N*)
+ echo
+ RET=n
+ ;;
+ y*)
+ echo
+ RET=y
+ ;;
+ n*)
+ echo
+ RET=n
+ ;;
+ *)
+ echo
+ echo "Please read the message and choose y or n"
+ cp_yes_no "$prompt"
+ ;;
+ esac
+}
+
+# by ddzeko, Tue, 29 Mar 2005 17:37:52 +0200
+#
+# db_get seems to return error messages if the requested variable
+# is not found - we do not find that desirable, and checking $? with
+# set -e turned on seems to be a bit of a problem
+# --> that's why we wrap the db_get call to return unset RET variable
+# instead of some gibberish error message that our script does
+# not expect
+cp_db_get() {
+ [ "$CP_SCRIPT_DEBUG" ] && set -vx
+
+ local var
+ var="$1"
+
+ # check to prevent user from using this before activating debconf
+ # confmodule needs to be loaded before accessing db_* functions
+ if [ -z "$DEBCONF_REDIR" ]; then
+ echo "cp_db_get: debconf not activated!" >&2
+ return 1
+ fi
+
+ if ! db_get "$var"; then
+ case "$RET" in
+ *doesn\'t\ exist)
+ RET=""
+ ;;
+ [0-9][0-9]\ ?*) # other errors
+ RET=""
+ ;;
+ esac
+ fi
+}
+
+# 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=""
+
+ if [ ! -f /etc/ldap/slapd.conf ]; then
+ echo "cp_get_ldap_suffix: /etc/ldap/slapd.conf: No such file" >&2
+ return 2
+ fi
+
+ RET="`awk '/^suffix/ { exit }
+ END { gsub(/"/, "", $2); print $2 }' \
+ < /etc/ldap/slapd.conf`"
+
+ if [ "`echo $RET | sed 's/,/ /g' | wc -w`" -gt 2 ]; then
+ RET=""
+ echo "cp_get_ldap_suffix: Invalid LDAP suffix in /etc/ldap/slapd.conf" >&2
+ return 2
+ fi
+
+ [ -z "$RET" ] && echo "cp_get_ldap_suffix: No LDAP suffix in /etc/ldap/slapd.conf" >&2
+ [ -z "$echo_return" ] || echo $RET
+ CP_ECHO_RETURN="$echo_return"
+}
+
+# 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=""
+
+ if [ ! -f /etc/ldap/slapd.conf ]; then
+ echo "cp_get_ldap_realm: /etc/ldap/slapd.conf: No such file" >&2
+ return 2
+ fi
+
+ cp_get_ldap_suffix || true
+ RET="`echo $RET | awk -F, '{print $1}' | awk -F= '{print $2}'`"
+
+ [ -z "$RET" ] && echo "cp_get_ldap_realm: No LDAP REALM in /etc/ldap/slapd.conf" >&2
+}
+
+# if fqdn is name.dom3.dom2.dom1.hr, check if this host is MX for
+# either dom3.dom2.dom1.hr, dom2.dom1.hr or dom1.hr and dump highest level
+# domain on stdout
+cp_get_mx_domain() {
+ [ "$CP_SCRIPT_DEBUG" ] && set -vx
+
+ local domains d host
+
+ host=$(hostname -f)
+ RET="$host"
+ if ! echo "$host" | grep -q '\.'; then
+ return
+ fi
+ if [ ! -x /usr/bin/host ]; then
+ # no host command
+ return
+ fi
+ domains=$(/bin/hostname -f | awk -F. '
+ {
+ for (i=2; i<NF; i++) {
+ for (j=i; j<NF; j++) {
+ printf "%s", $(j)"."
+ };
+ print $NF
+ }
+ }' )
+ for d in $domains
+ do
+ mxes=$(/usr/bin/host -t mx $d)
+ # handle output of both /usr/bin/host providers
+ mxes=$(echo "$mxes"|\
+ awk '/mail is handled by/ || /MX/ {print $NF}'|sed 's/\.$//')
+ if echo "$mxes" |egrep -q "^$host$"; then
+ RET="$d"
+ fi
+ done
+
+ [ -z "$CP_ECHO_RETURN" ] || echo "$RET"
+}
+
+_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 (<STDIN>) {
+ if (/^_?cp_(\w+) *\(\) *\{/) {
+ if (! exists($keep{$1})) {
+ while (<STDIN>) { 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;
+ ' -- $*
+}