# -*- mode: sh -*- ### ### load up common variables and functions ### dbc_go(){ local importing_from_non_dbc upgrading reconfiguring f tsubstfile upgrades_pending dbc_dumpfile _dbc_asuser reinstall nowtime need_adminpw _tmp_result . /usr/share/dbconfig-common/dpkg/common _dbc_debug "(postinst) dbc_go() $@" ## With dbconfig-no-thanks installed we don't need to do anything. if dbc_no_thanks ; then return 0 fi dbc_config "$@" || return $? # the maintainer has the option of telling us to not generate include files # for manual installs in case it changes the apps behavior to have the file dbc_dgi_on_manual=${dbc_dgi_on_manual:-true} ### ### begin main code execution ### if [ "$dbc_command" = "configure" ] || [ "$dbc_command" = "reconfigure" ]; then # read in debconf responses (which are seeded from the config) dbc_read_package_debconf || return $? # and write them to file. dbc_write_package_config || return $? # finally, re-read in the configuration from this file dbc_read_package_config || return $? ### ### if they don't want our help, quit ### if [ "$dbc_install" != "true" ]; then # Probably a little too much in most cases, but it is possible # that the app password is loaded or that the user backed up after # providing the admin password and decided not too install in the end dbc_postinst_cleanup || return $? return 0 fi # export the config file if it exists, for the scripts if [ "$dbc_generate_include" ]; then # strip the leading format string for convenience dbc_config_include=$(echo "$dbc_generate_include" | sed -e 's/^[^:]*://') export dbc_generate_include export dbc_config_include fi # find out if we're upgrading/reinstalling if [ "$dbc_oldversion" ]; then # read that little crumb left in config if we're reconfiguring db_get $dbc_package/internal/reconfiguring && reconfiguring="$RET" # if not, we're definitely upgrading if [ "$reconfiguring" = "false" ]; then upgrading="yes" else db_get $dbc_package/dbconfig-reinstall && reinstall=$RET # if they've said they don't want to reinstall stuff... if [ "$reinstall" = "false" ]; then dbc_postinst_cleanup return 0 fi fi fi # now, determine if we're upgrading from a non-dbc version. if so, # there's a bunch of stuff that we do NOT want to do if [ "$upgrading" ] && [ "$dbc_first_version" ]; then if dpkg --compare-versions "$dbc_first_version" gt "$dbc_oldversion"; then dbc_logline "detected upgrade from previous non-dbconfig version" importing_from_non_dbc="true" fi fi # don't perform the following block of code during upgrades if [ ! "$upgrading" ]; then ### ### first things first, see if the database client package is installed, ### and in case of failure provide a more sensible error message. ### dbc_detect_installed_dbtype $dbc_dbtype || \ dbc_missing_db_package_error $dbc_dbclientpackage || return $? [ "$dbc_tried_again" ] && return 0 ### ### next, if we're connecting to a local database, ### see if the database server package is installed, ### and in case of failure provide a more sensible error message. ### if [ "$dbc_method" = "unix socket" ]; then $dbc_db_installed_cmd || dbc_missing_db_package_error $dbc_dbpackage || \ return $? [ "$dbc_tried_again" ] && return 0 fi ### ### now, create the app user account ### # We check in multiple locations if we need the admin password to # either create the user and/or the database and/or run admin # scripts. We do that here in postinst instead of during config # because we want to avoid asking the password as much as possible # to enable setups where the system admin doesn't have database # admin rights (mostly remote db setups) and the installing package # doesn't need it for its scripts. _dbc_asuser=true _tmp_result=0 $dbc_checkuser_cmd || _tmp_result=$? _dbc_asuser="" if [ $_tmp_result = 0 ] ; then dbc_logline "$dbc_dbuser already exists and has privileges on $dbc_dbname" else dbc_get_admin_pass || dbc_install_error "obtaining administator password" || return $? [ "$dbc_tried_again" ] && return 0 $dbc_createuser_cmd || dbc_install_error "creating user" || return $? [ "$dbc_tried_again" ] && return 0 fi ### ### If we are reconfiguring, we should empty the old database ### to prevent errors like "table exists". ### if [ "$reconfiguring" = "true" ]; then # dump the database into a temporary file # Note: nearly equal logic exists in prerm; probably # should stay in sync nowtime=$(date +%Y-%m-%d-%H.%M) if [ ! $(dirname /var/tmp/$dbc_package) = /var/tmp ]; then mkdir -p $(dirname /var/tmp/$dbc_package) fi dbc_dumpfile=$(mktemp /var/tmp/$dbc_package.$dbc_dbname.$nowtime.$dbc_dbtype.XXXXXX) if [ ! -f $dbc_dumpfile ]; then dbc_install_error "creating temporary file for database dump" || return $? [ "$dbc_tried_again" ] && return 0 fi dbc_logline "dbconfig-common: dumping $dbc_dbtype database $dbc_dbname to $dbc_dumpfile" # Dump as user to enable admin password agnostic setups. _dbc_asuser=true _tmp_result=0 $dbc_dump_cmd $dbc_dumpfile || _tmp_result=$? if [ $_tmp_result != 0 ] ; then # If the dump fails as user, try again with dbadmin credentials (bug: #850190) dbc_logline "dumping database as user failed, retrying with administrator credentials" dbc_get_admin_pass || dbc_install_error "obtaining administator password" || \ return $? [ "$dbc_tried_again" ] && return 0 _dbc_asuser="" $dbc_dump_cmd $dbc_dumpfile || dbc_install_error "dumping old database" || \ return $? [ "$dbc_tried_again" ] && return 0 fi _dbc_asuser="" dbc_logline "dbconfig-common: dropping old $dbc_dbtype database $dbc_dbname" # Drop as user if possible to enable admin password agnostic # setups. Currently PostgreSQL doesn't support this. if [ "$dbc_dbtype" = pgsql ] ; then dbc_get_admin_pass || dbc_install_error "obtaining administator password" || return $? [ "$dbc_tried_again" ] && return 0 else _dbc_asuser=true fi $dbc_dropdb_cmd || dbc_install_error "dropping old database" || return $? [ "$dbc_tried_again" ] && return 0 _dbc_asuser="" fi ### ### create the database ### # Create database as user if possible to enable admin password # agnostic setups. Currently PostgreSQL doesn't support this. if [ "$dbc_dbtype" = pgsql ] ; then dbc_get_admin_pass || dbc_install_error "obtaining administator password" || return $? [ "$dbc_tried_again" ] && return 0 else _dbc_asuser=true fi $dbc_createdb_cmd || dbc_install_error "creating database" || return $? [ "$dbc_tried_again" ] && return 0 _dbc_asuser="" ### ### populate the database ### # sqlfile is the file to use for installing the database dbc_sqlfile=$dbc_share/data/$dbc_basepackage/install/$dbc_dbtype dbc_sqlfile_adm=$dbc_share/data/$dbc_basepackage/install-dbadmin/$dbc_dbtype dbc_scriptfile=$dbc_share/scripts/$dbc_basepackage/install/$dbc_dbtype if [ -f "$dbc_scriptfile" ]; then dbc_logpart "populating database via scriptfile... " if ! sh -c "$dbc_scriptfile $*"; then dbc_error="$dbc_scriptfile exited with non-zero status\nIf the script logged anything about what went wrong,\n it can be found in /var/log/apt/term.log." dbc_install_error "populating database" || return $? [ "$dbc_tried_again" ] && return 0 fi dbc_logline "done" fi if [ -f "$dbc_sqlfile_adm" ]; then dbc_logpart "populating database via administrative sql... " if [ ! "$dbc_sql_substitutions" ]; then $dbc_sqlfile_cmd $dbc_sqlfile_adm || \ dbc_install_error "populating database with administrative sql" || \ return $? [ "$dbc_tried_again" ] && return 0 else tsubstfile=$(dbc_mktemp) /usr/sbin/dbconfig-generate-include -f template -o \ template_infile=$dbc_sqlfile_adm $dbc_packageconfig > $tsubstfile || \ dbc_install_error "populating database with administrative sql" || \ return $? $dbc_sqlfile_cmd $tsubstfile || \ dbc_install_error "populating database with administrative sql" || \ return $? rm -f $tsubstfile [ "$dbc_tried_again" ] && return 0 fi dbc_logline "done" fi if [ -f "$dbc_sqlfile" ]; then dbc_logpart "populating database via sql... " _dbc_asuser="yes" if [ ! "$dbc_sql_substitutions" ]; then $dbc_sqlfile_cmd $dbc_sqlfile || dbc_install_error "populating database" || \ return $? [ "$dbc_tried_again" ] && return 0 else tsubstfile=$(dbc_mktemp) /usr/sbin/dbconfig-generate-include -f template -o \ template_infile=$dbc_sqlfile $dbc_packageconfig > $tsubstfile || \ dbc_install_error "populating database" || \ return $? $dbc_sqlfile_cmd $tsubstfile || dbc_install_error "populating database" || \ return $? rm -f $tsubstfile [ "$dbc_tried_again" ] && return 0 fi _dbc_asuser="" dbc_logline "done" fi # now that we are sure that the database has been # (re-)installed, we can reset the purge flag. db_set $dbc_package/purge false db_fset $dbc_package/purge seen false fi # end install/reconfigure section if [ "$importing_from_non_dbc" ]; then if ! $dbc_checkuser_command; then upgrade_error "importing dbconfig-settings" || return $? [ "$dbc_tried_again" ] && return 0 fi fi # begin upgrade section if [ "$upgrading" ]; then # Initialize need_adminpw to false, only set to true when we find # upgrade queries that require admin rights to avoid needless # querying the sysadmin need_adminpw="false" # next call may change need_adminpw upgrades_pending=$(_dbc_find_upgrades) # if there are any upgrades to be applied if [ "$upgrades_pending" ]; then # ask if they want our help in the process at all # but only if they didn't see the question before # or if we are here after an error db_set $dbc_package/dbconfig-upgrade $dbc_upgrade db_input $dbc_prio_high $dbc_package/dbconfig-upgrade || true db_go || true db_get $dbc_package/dbconfig-upgrade && dbc_upgrade="$RET" # and if they don't want our help, we'll go away if [ "$dbc_upgrade" != "true" ]; then return 0; fi # get the admin password if it's needed if [ "$need_adminpw" != "false" ] ; then if echo "$dbc_authenticated_dbtypes" | grep -q "$dbc_dbtype"; then if [ ! "$dbc_frontend" ]; then if [ ! "$dbc_dbtype" = "pgsql" ] || [ ! "$dbc_authmethod_admin" = "ident" ]; then dbc_get_admin_pass || return $? fi fi fi fi db_input $dbc_prio_low $dbc_package/upgrade-backup || true db_go || true db_get $dbc_package/upgrade-backup && dbc_backup="$RET" if [ "$dbc_backup" = "true" ] ; then # this is the file into which upgrade backups go nowtime=$(date +%Y-%m-%d-%H.%M.%S) dbc_dumpfile=/var/cache/dbconfig-common/backups/${dbc_package}_${dbc_oldversion}.$dbc_dbtype_$nowtime dbc_logline "creating database backup in $dbc_dumpfile" # backup before we upgrade _dbc_asuser="yes" _tmp_result=0 $dbc_dump_cmd $dbc_dumpfile || _tmp_result=$? if [ $_tmp_result != 0 ] ; then # If the dump fails as user, try again with dbadmin credentials (bug: #850190) dbc_logline "dumping database as user failed, retrying with administrator credentials" dbc_get_admin_pass || dbc_upgrade_error "obtaining administator password" || \ return $? [ "$dbc_tried_again" ] && return 0 _dbc_asuser="" $dbc_dump_cmd $dbc_dumpfile || dbc_upgrade_error "backing up the old database" || \ return $? [ "$dbc_tried_again" ] && return 0 fi _dbc_asuser="" fi fi # now perform the updates for f in $upgrades_pending; do _dbc_apply_upgrades $f || return $? done fi # end upgrade section fi # don't forget to clean up after ourselves dbc_postinst_cleanup } ## ## search through the predefined upgrade directories, and return ## the versions for which *some* upgrade is available. later for each ## upgrade version with a script we again search through the predefined ## directories to find which upgrade provides it. it's definitely ## less efficient this way, but it's much cleaner and ensures that ## upgrades are provided in-order regardless of which methods are used. ## _dbc_find_upgrades(){ local f s sqldir admsqldir scriptdir upgradedirs pending sorted placed tlist # check for new upgrades in these three locations sqldir=$dbc_share/data/$dbc_basepackage/upgrade/$dbc_dbtype admsqldir=$dbc_share/data/$dbc_basepackage/upgrade-dbadmin/$dbc_dbtype scriptdir=$dbc_share/scripts/$dbc_basepackage/upgrade/$dbc_dbtype for f in $sqldir $admsqldir $scriptdir; do if [ -d "$f" ]; then upgradedirs="${upgradedirs:+$upgradedirs }$f" fi done if [ ! "${upgradedirs:-}" ]; then return 0; fi for f in $(find $upgradedirs -xtype f -print0 | \ xargs --no-run-if-empty -0 -n1 basename | sort -n | uniq); do if dpkg --compare-versions $dbc_oldversion lt $f; then pending="${pending:+$pending }$f" fi done # for each pending update for f in ${pending:-}; do if [ -f "$admsqldir/$f" ] ; then # If the pending update was in the dbadmin dir we # need the adminpw need_adminpw="true" fi # if the sorted list is empty if [ ! "${sorted:-}" ]; then sorted="$f" else # a scratch list for a sorted insert of the next version tlist="" # for each already sorted version for s in ${sorted:-}; do # if we haven't already placed it if [ ! "${placed:-}" ]; then # if the this version is less than the next sorted one if dpkg --compare-versions $f lt $s; then # insert it here tlist="$tlist $f" placed="yes" fi fi tlist="$tlist $s" done # if we still haven't placed it, tack it on to the end of the list if [ ! "${placed:-}" ]; then tlist="$tlist $f" fi # and now reset the placed variable, and update the sorted list placed="" sorted="$tlist" fi done echo $sorted } ## ## this function applies all available upgrade scripts/sql for a specific ## version ($1). no checking is done to make sure that the upgrade *should* ## be applied, that is assumed to have been done by _dbc_find_upgrades(). ## _dbc_apply_upgrades(){ local f vers sqlfile admsqlfile scriptfile tsubstfile error_msg_upgrade _dbc_debug "_dbc_apply_upgrades() $@" # check for new upgrades in these three locations vers="$1" sqlfile="$dbc_share/data/$dbc_basepackage/upgrade/$dbc_dbtype/$vers" admsqlfile="$dbc_share/data/$dbc_basepackage/upgrade-dbadmin/$dbc_dbtype/$vers" scriptfile="$dbc_share/scripts/$dbc_basepackage/upgrade/$dbc_dbtype/$vers" # now go through script updates if [ -f "$scriptfile" ]; then dbc_logline "applying upgrade script for $dbc_oldversion -> $vers" # XXX $* if ! sh -c "$scriptfile $*"; then dbc_error="$scriptfile exited with non-zero status" dbc_upgrade_error "processing $scriptfile" || return $? [ "$dbc_tried_again" ] && return 0 fi fi _dbc_asuser="" if [ -f "$admsqlfile" ]; then dbc_logline "applying upgrade admin sql for $dbc_oldversion -> $vers" tsubstfile=$admsqlfile error_msg_upgrade="processing $admsqlfile" if [ "$dbc_sql_substitutions" ]; then tsubstfile=$(dbc_mktemp) /usr/sbin/dbconfig-generate-include -f template -o template_infile=$admsqlfile \ $dbc_packageconfig > $tsubstfile || dbc_upgrade_error "$error_msg_upgrade" || \ return $? error_msg_upgrade="processing $admsqlfile (translated: $tsubstfile)" fi $dbc_sqlfile_cmd $tsubstfile || dbc_upgrade_error "$error_msg_upgrade" || return $? [ "$dbc_sql_substitutions" ] && rm -f $tsubstfile [ "$dbc_tried_again" ] && return 0 fi if [ -f "$sqlfile" ]; then _dbc_asuser="yes" dbc_logline "applying upgrade sql for $dbc_oldversion -> $vers" tsubstfile=$sqlfile error_msg_upgrade="processing $sqlfile" if [ "$dbc_sql_substitutions" ]; then tsubstfile=$(dbc_mktemp) /usr/sbin/dbconfig-generate-include -f template -o template_infile=$sqlfile \ $dbc_packageconfig > $tsubstfile || dbc_upgrade_error "$error_msg_upgrade" || \ return $? error_msg_upgrade="processing $sqlfile (translated: $tsubstfile)" fi $dbc_sqlfile_cmd $tsubstfile || dbc_upgrade_error "$error_msg_upgrade" || return $? [ "$dbc_sql_substitutions" ] && rm -f $tsubstfile [ "$dbc_tried_again" ] && return 0 _dbc_asuser="" fi }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
common | File | 38.37 KB | 0644 |
|
config | File | 22.05 KB | 0644 |
|
config.mysql | File | 68 B | 0644 |
|
config.pgsql | File | 69 B | 0644 |
|
config.sqlite | File | 70 B | 0644 |
|
config.sqlite3 | File | 71 B | 0644 |
|
frontend.config | File | 61 B | 0644 |
|
frontend.config.mysql | File | 67 B | 0644 |
|
frontend.config.pgsql | File | 67 B | 0644 |
|
frontend.postinst | File | 63 B | 0644 |
|
frontend.postinst.mysql | File | 69 B | 0644 |
|
frontend.postinst.pgsql | File | 69 B | 0644 |
|
frontend.postrm | File | 61 B | 0644 |
|
frontend.postrm.mysql | File | 67 B | 0644 |
|
frontend.postrm.pgsql | File | 67 B | 0644 |
|
frontend.preinst | File | 62 B | 0644 |
|
frontend.preinst.mysql | File | 68 B | 0644 |
|
frontend.preinst.pgsql | File | 68 B | 0644 |
|
frontend.prerm | File | 60 B | 0644 |
|
frontend.prerm.mysql | File | 66 B | 0644 |
|
frontend.prerm.pgsql | File | 66 B | 0644 |
|
postinst | File | 20.29 KB | 0644 |
|
postinst.mysql | File | 70 B | 0644 |
|
postinst.pgsql | File | 70 B | 0644 |
|
postinst.sqlite | File | 71 B | 0644 |
|
postinst.sqlite3 | File | 72 B | 0644 |
|
postrm | File | 986 B | 0644 |
|
postrm.mysql | File | 68 B | 0644 |
|
postrm.pgsql | File | 68 B | 0644 |
|
postrm.sqlite | File | 69 B | 0644 |
|
postrm.sqlite3 | File | 70 B | 0644 |
|
preinst | File | 431 B | 0644 |
|
preinst.mysql | File | 69 B | 0644 |
|
preinst.pgsql | File | 70 B | 0644 |
|
preinst.sqlite | File | 70 B | 0644 |
|
preinst.sqlite3 | File | 71 B | 0644 |
|
prerm | File | 5.69 KB | 0644 |
|
prerm.mysql | File | 67 B | 0644 |
|
prerm.pgsql | File | 67 B | 0644 |
|
prerm.sqlite | File | 68 B | 0644 |
|
prerm.sqlite3 | File | 69 B | 0644 |
|