Advertisement
Guest User

netmagis.posyinst

a guest
Jul 26th, 2013
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.61 KB | None | 0 0
  1. #! /bin/sh
  2.  
  3. # netmagis.postinst : Netmagis upgrade script for debian packaging
  4. # Copyright (C) 2013 Schplurtz le deboulonné <Schplurtz@laposte.net>
  5. #
  6. # This file is released under the GPL version 3 licence. See
  7. # /usr/share/common-licenses/GPL-3 file for exact conditions
  8.  
  9. # summary of how this script can be called:
  10. #        * <postinst> 'configure' <most-recently-configured-version>
  11. #        * <old-postinst> 'abort-upgrade' <new version>
  12. #        * <conflictor's-postinst> 'abort-remove' 'in-favour' <package>
  13. #          <new-version>
  14. #        * <postinst> 'abort-remove'
  15. #        * <deconfigured's-postinst> 'abort-deconfigure' 'in-favour'
  16. #          <failed-install-package> <version> 'removing'
  17. #          <conflicting-package> <version>
  18. # for details, see http://www.debian.org/doc/debian-policy/ or
  19. # the debian-policy package
  20.  
  21.  
  22. test configure = "$1" || exit 0
  23. test "$2" || exit 0 # new installation : no upgrade
  24.  
  25. IFS="$(printf ' \t')
  26. "
  27. NL='
  28. '
  29.  
  30. warn() { test "$*" && echo "$@" >&2; }
  31. fatal() { warn "$@"; exit 1; }
  32. pause() { local x; printf '%s Press return.' "$*"; read x; }
  33.  
  34. #setv var value
  35. # setv x 4 #x=4
  36. setv() { eval "$1=\$2"; }
  37.  
  38. #setp var var
  39. # setp x y # x=$y
  40. setp() { eval "$1=\$$2"; }
  41.  
  42. # ksql var
  43. # kwote SQL. : Make content of var a proper SQL string
  44. # a="toto l'héros des z'enfants"
  45. # ksql a; # Now, a="'toto l''héros des z''enfants'"
  46. ksql() {
  47.   local __v __p="'"
  48.   setp __v $1
  49.   while :
  50.   do
  51.     : __v "$__v"
  52.     : __p "$__p"
  53.     case "$__v" in
  54.     (*\'*)
  55.       : case 1
  56.       __p=$__p${__v%%\'*}"''"
  57.       __v=${__v#*\'}
  58.     ;;
  59.     (*)
  60.       : case 2
  61.       break
  62.     ;;
  63.     esac
  64.   done
  65.   __p=$__p$__v"'"
  66.   setp "$1" __p
  67. }
  68.  
  69. # cfv conffile key [key...]
  70. # Reads netmagis configfile and for each requested key
  71. # found in config file, prints with correct sh quote
  72. # assignments in the form key=val. This is rock solid
  73. # and an be safely used even if values contain such
  74. # chars as ' ` $ ; " etc...
  75. #
  76. # exple
  77. # eval "$( cfv /etc/netmagis.conf dnsdbhost dnsdbport )"
  78. # ==> eval "dnsdbhost='something' dnsdbport='somethingelse'"
  79. cfv() {
  80.   local i s configfile
  81.   configfile=$1
  82.   shift
  83.   for i
  84.   do
  85.     s="$s\$1 == \"$i\" { traite() }
  86. "
  87.   done
  88.   awk 'function traite(   a ) {
  89.          a=$1
  90.          sub( /^[ \t]*[^ \t]+[ \t]+/, "" )
  91.          printf "%s=%s\n", a, shkwote( $0 );
  92.       }
  93.       function shkwote( s ) {
  94.          gsub( /'\''/, "'\''\\'\'''\''", s )
  95.         return "'\''" s "'\''"
  96.       }'"
  97.       $s
  98.  "  "$configfile"
  99.   #'
  100. }
  101.  
  102. # loadconfig
  103. # *)  sets global vars dnsdbhost dnsdbport .... to the value they have in
  104. #     file /etc/netmagis.conf
  105. # *)  fills $PGPASSFILE with db and password content
  106. loadconfig() {
  107.   local dnsdbpassword macdbpassword # don't want these in memory longer than needed
  108.   eval "$(
  109.    cfv /etc/netmagis.conf \
  110.      dnsdbhost       \
  111.      dnsdbport       \
  112.      dnsdbname       \
  113.      dnsdbuser       \
  114.      dnsdbpassword   \
  115.      macdbhost       \
  116.      macdbport       \
  117.      macdbname       \
  118.      macdbuser       \
  119.      macdbpassword   \
  120.      
  121.  )"
  122.   {
  123.     echo "${dnsdbhost}:${dnsdbport}:${dnsdbname}:${dnsdbuser}:${dnsdbpassword}"
  124.     echo "${macdbhost}:${macdbport}:${macdbname}:${macdbuser}:${macdbpassword}"
  125.   } >>"$PGPASSFILE"
  126. }
  127.  
  128. # setdb dns|mac
  129. # sets PG* env var so that next psql query targets dns db or mac db
  130. setdb() {
  131.   case "$1" in
  132.   (dns)
  133.     export PGDATABASE=$dnsdbname PGHOST=$dnsdbhost PGPORT=$dnsdbport PGUSER=$dnsdbuser
  134.   ;;
  135.   (mac)
  136.     export PGDATABASE=$macdbname PGHOST=$macdbhost PGPORT=$macdbport PGUSER=$macdbuser
  137.   ;;
  138.   esac
  139. }
  140.  
  141. # pipesql [other psql options]
  142. # Runs any mix of sql and \ cmd from stdin
  143. # cmd | pipesql
  144. # pipesql < something
  145. # exple
  146. # echo '\d dns.*
  147. #       select * from dns.rr limit 5' | pipesql -E
  148. pipesql() {
  149.   psql -q1twXA "$@"
  150. }
  151.  
  152. # runsql [-pgopt opt [opt...] . ] cmd [cmd...]
  153. # run any mix of sql and \ cmd
  154. # exple
  155. # runsql -pgopt -E . '\d dns.*
  156. # '                    select '*' from dns.rr limit 5
  157. runsql() {
  158.   local args sep
  159.   eval "sep=$(printf \\003)"
  160.   test .-pgopt = ."$1" && {
  161.     shift
  162.     while test . != "$1"
  163.     do
  164.       args=$args${args:+$sep}$1
  165.       shift
  166.     done
  167.     shift
  168.   }
  169.   IFS=$sep
  170.   echo "$@" | pipesql $args
  171.   IFS=$DIFS
  172. }
  173.  
  174. #
  175. # main Main MAIN
  176. #
  177.  
  178.  
  179. DIFS=$IFS
  180. export PGPASSFILE=$(mktemp /tmp/totoXXXXX)
  181. test -r "$PGPASSFILE" || fatal "can't read pgpassfile '$PGPASSFILE'"
  182. trap "rm -rf $PGPASSFILE" EXIT
  183.  
  184. loadconfig
  185.  
  186. #
  187. # Real job now.
  188. #
  189.  
  190. TARGET_VERSION=22 # the db version we are trying to reach
  191. setdb dns
  192.  
  193. runsql "SELECT 1" >/dev/null 2>&1 ||
  194.   fatal "Cannot connect to database"
  195.  
  196. ##################################################################
  197. # first packaged version was 2.0
  198. # 2.0 database has dns.dr_mbox table. table is dropped in 2.1+
  199. # 2.1 database has no schemaversion key in global.config table
  200. #     and the database column names are in French (so query for
  201. #     'key' and 'value' in global.config table will fail).
  202. # 2.2 and upper have a schemaversion key in global.config table
  203. #     and column names are in english ( 'key' and 'value' ).
  204. #
  205. # upgrade sql scripts are in
  206. # /usr/share/doc/netmagis/examples/upgrade/XX-YY/upgrade.sql.gz
  207. #
  208. # Conclusion :
  209. # It is possible to determine the previous version and
  210. # upgrade from any version to any version, step by step, just by
  211. # following /usr/share/doc/netmagis/examples/upgrade/XX-YY/
  212. # until we reach the version we target.
  213. ##################################################################
  214.  
  215. # set -x
  216.  
  217. # Halt on error
  218. set -e
  219.  
  220. # check if we are upgrading from a 2.0 database
  221. is_20_db="$(
  222. runsql "
  223.   -- ask postgres if there is a table dr_mbox in dns schema
  224.   SELECT n.nspname, c.relname
  225.   FROM pg_catalog.pg_class c
  226.   LEFT JOIN pg_catalog.pg_namespace n
  227.   ON n.oid = c.relnamespace
  228.   WHERE
  229.   c.relname = 'dr_mbox' AND n.nspname = 'dns'
  230. "
  231. )"
  232.  
  233. if test "$is_20_db"
  234. then
  235.   schemaversion=20
  236. else
  237.  
  238.   # get schemaversion.
  239.   schemaversion="$(
  240.    runsql "
  241.       SELECT value
  242.       FROM global.config
  243.       WHERE key = 'schemaversion'
  244.     " 2>/dev/null || :
  245.  )"
  246.  
  247.   if test '' = "$schemaversion"
  248.   then
  249.     schemaversion=21
  250.   fi
  251. fi
  252.  
  253. while test $TARGET_VERSION != "$schemaversion"
  254. do
  255.   path=$( ls -d /usr/share/doc/netmagis/examples/upgrade/${schemaversion}-* 2>/dev/null || : )
  256.   test -d "$path" ||
  257.     fatal "No way to upgrade database from version $schemaversion"
  258.   next=$path
  259.   next=${next##*-}
  260.   test -r "$path/upgrade.sql.gz" ||
  261.     fatal "Can't upgrade from $schemaversion to $next : $path/upgrade.sql.gz unreadable"
  262.   gzip -cd "$path"/upgrade.sql.gz | pipesql
  263.   schemaversion=$next
  264. done
  265.  
  266. :
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement