Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /bin/sh
- # netmagis.postinst : Netmagis upgrade script for debian packaging
- # Copyright (C) 2013 Schplurtz le deboulonné <Schplurtz@laposte.net>
- #
- # This file is released under the GPL version 3 licence. See
- # /usr/share/common-licenses/GPL-3 file for exact conditions
- # summary of how this script can be called:
- # * <postinst> 'configure' <most-recently-configured-version>
- # * <old-postinst> 'abort-upgrade' <new version>
- # * <conflictor's-postinst> 'abort-remove' 'in-favour' <package>
- # <new-version>
- # * <postinst> 'abort-remove'
- # * <deconfigured's-postinst> 'abort-deconfigure' 'in-favour'
- # <failed-install-package> <version> 'removing'
- # <conflicting-package> <version>
- # for details, see http://www.debian.org/doc/debian-policy/ or
- # the debian-policy package
- test configure = "$1" || exit 0
- test "$2" || exit 0 # new installation : no upgrade
- IFS="$(printf ' \t')
- "
- NL='
- '
- warn() { test "$*" && echo "$@" >&2; }
- fatal() { warn "$@"; exit 1; }
- pause() { local x; printf '%s Press return.' "$*"; read x; }
- #setv var value
- # setv x 4 #x=4
- setv() { eval "$1=\$2"; }
- #setp var var
- # setp x y # x=$y
- setp() { eval "$1=\$$2"; }
- # ksql var
- # kwote SQL. : Make content of var a proper SQL string
- # a="toto l'héros des z'enfants"
- # ksql a; # Now, a="'toto l''héros des z''enfants'"
- ksql() {
- local __v __p="'"
- setp __v $1
- while :
- do
- : __v "$__v"
- : __p "$__p"
- case "$__v" in
- (*\'*)
- : case 1
- __p=$__p${__v%%\'*}"''"
- __v=${__v#*\'}
- ;;
- (*)
- : case 2
- break
- ;;
- esac
- done
- __p=$__p$__v"'"
- setp "$1" __p
- }
- # cfv conffile key [key...]
- # Reads netmagis configfile and for each requested key
- # found in config file, prints with correct sh quote
- # assignments in the form key=val. This is rock solid
- # and an be safely used even if values contain such
- # chars as ' ` $ ; " etc...
- #
- # exple
- # eval "$( cfv /etc/netmagis.conf dnsdbhost dnsdbport )"
- # ==> eval "dnsdbhost='something' dnsdbport='somethingelse'"
- cfv() {
- local i s configfile
- configfile=$1
- shift
- for i
- do
- s="$s\$1 == \"$i\" { traite() }
- "
- done
- awk 'function traite( a ) {
- a=$1
- sub( /^[ \t]*[^ \t]+[ \t]+/, "" )
- printf "%s=%s\n", a, shkwote( $0 );
- }
- function shkwote( s ) {
- gsub( /'\''/, "'\''\\'\'''\''", s )
- return "'\''" s "'\''"
- }'"
- $s
- " "$configfile"
- #'
- }
- # loadconfig
- # *) sets global vars dnsdbhost dnsdbport .... to the value they have in
- # file /etc/netmagis.conf
- # *) fills $PGPASSFILE with db and password content
- loadconfig() {
- local dnsdbpassword macdbpassword # don't want these in memory longer than needed
- eval "$(
- cfv /etc/netmagis.conf \
- dnsdbhost \
- dnsdbport \
- dnsdbname \
- dnsdbuser \
- dnsdbpassword \
- macdbhost \
- macdbport \
- macdbname \
- macdbuser \
- macdbpassword \
- )"
- {
- echo "${dnsdbhost}:${dnsdbport}:${dnsdbname}:${dnsdbuser}:${dnsdbpassword}"
- echo "${macdbhost}:${macdbport}:${macdbname}:${macdbuser}:${macdbpassword}"
- } >>"$PGPASSFILE"
- }
- # setdb dns|mac
- # sets PG* env var so that next psql query targets dns db or mac db
- setdb() {
- case "$1" in
- (dns)
- export PGDATABASE=$dnsdbname PGHOST=$dnsdbhost PGPORT=$dnsdbport PGUSER=$dnsdbuser
- ;;
- (mac)
- export PGDATABASE=$macdbname PGHOST=$macdbhost PGPORT=$macdbport PGUSER=$macdbuser
- ;;
- esac
- }
- # pipesql [other psql options]
- # Runs any mix of sql and \ cmd from stdin
- # cmd | pipesql
- # pipesql < something
- # exple
- # echo '\d dns.*
- # select * from dns.rr limit 5' | pipesql -E
- pipesql() {
- psql -q1twXA "$@"
- }
- # runsql [-pgopt opt [opt...] . ] cmd [cmd...]
- # run any mix of sql and \ cmd
- # exple
- # runsql -pgopt -E . '\d dns.*
- # ' select '*' from dns.rr limit 5
- runsql() {
- local args sep
- eval "sep=$(printf \\003)"
- test .-pgopt = ."$1" && {
- shift
- while test . != "$1"
- do
- args=$args${args:+$sep}$1
- shift
- done
- shift
- }
- IFS=$sep
- echo "$@" | pipesql $args
- IFS=$DIFS
- }
- #
- # main Main MAIN
- #
- DIFS=$IFS
- export PGPASSFILE=$(mktemp /tmp/totoXXXXX)
- test -r "$PGPASSFILE" || fatal "can't read pgpassfile '$PGPASSFILE'"
- trap "rm -rf $PGPASSFILE" EXIT
- loadconfig
- #
- # Real job now.
- #
- TARGET_VERSION=22 # the db version we are trying to reach
- setdb dns
- runsql "SELECT 1" >/dev/null 2>&1 ||
- fatal "Cannot connect to database"
- ##################################################################
- # first packaged version was 2.0
- # 2.0 database has dns.dr_mbox table. table is dropped in 2.1+
- # 2.1 database has no schemaversion key in global.config table
- # and the database column names are in French (so query for
- # 'key' and 'value' in global.config table will fail).
- # 2.2 and upper have a schemaversion key in global.config table
- # and column names are in english ( 'key' and 'value' ).
- #
- # upgrade sql scripts are in
- # /usr/share/doc/netmagis/examples/upgrade/XX-YY/upgrade.sql.gz
- #
- # Conclusion :
- # It is possible to determine the previous version and
- # upgrade from any version to any version, step by step, just by
- # following /usr/share/doc/netmagis/examples/upgrade/XX-YY/
- # until we reach the version we target.
- ##################################################################
- # set -x
- # Halt on error
- set -e
- # check if we are upgrading from a 2.0 database
- is_20_db="$(
- runsql "
- -- ask postgres if there is a table dr_mbox in dns schema
- SELECT n.nspname, c.relname
- FROM pg_catalog.pg_class c
- LEFT JOIN pg_catalog.pg_namespace n
- ON n.oid = c.relnamespace
- WHERE
- c.relname = 'dr_mbox' AND n.nspname = 'dns'
- "
- )"
- if test "$is_20_db"
- then
- schemaversion=20
- else
- # get schemaversion.
- schemaversion="$(
- runsql "
- SELECT value
- FROM global.config
- WHERE key = 'schemaversion'
- " 2>/dev/null || :
- )"
- if test '' = "$schemaversion"
- then
- schemaversion=21
- fi
- fi
- while test $TARGET_VERSION != "$schemaversion"
- do
- path=$( ls -d /usr/share/doc/netmagis/examples/upgrade/${schemaversion}-* 2>/dev/null || : )
- test -d "$path" ||
- fatal "No way to upgrade database from version $schemaversion"
- next=$path
- next=${next##*-}
- test -r "$path/upgrade.sql.gz" ||
- fatal "Can't upgrade from $schemaversion to $next : $path/upgrade.sql.gz unreadable"
- gzip -cd "$path"/upgrade.sql.gz | pipesql
- schemaversion=$next
- done
- :
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement