#!/bin/bash echo " ======================================================================== WARNING ======================================================================== This script modifies the SOGo database schema so that it complies to the new optional 9-table model. It is *not* part of a normal upgrade. It is *strongly* recommended you backup your database before proceeding. In other words, only run this if you absolutely know what you're doing. " while [[ -z "${GO_WITH_INSTALL}" ]]; do read -p "Do you really want to proceed (yes/no)? " GO_WITH_INSTALL done if [[ ${GO_WITH_INSTALL:0:1} != "Y" && ${GO_WITH_INSTALL:0:1} != "y" ]]; then echo "User-aborted." exit; fi STOREFIELDS="c_name, c_content, c_creationdate, c_lastmodified, c_version, c_deleted" APPOINTMENTFIELDS="c_name, c_uid, c_startdate, c_enddate, c_cycleenddate, c_title, c_participants, c_isallday, c_iscycle, c_cycleinfo, \ c_classification, c_isopaque, c_status, c_priority, c_location, c_orgmail, c_partmails, c_partstates, c_category, c_sequence, c_component, c_nextalarm, c_description" CONTACTFIELDS="c_name, c_givenname, c_cn, c_sn, c_screenname, c_l, c_mail, c_o, c_ou, c_telephonenumber, c_categories, c_component" IFS=" " # Parse postgres connection string from OCSFolderInfoURL in sogo.conf set $(sogo-tool dump-defaults -f /etc/sogo/sogo.conf | awk -F\" '/ OCSFolderInfoURL =/ {print $2}' \ | sed -n 's/\([^:]\+\):\/\/\([^:]\+\):\([^@]\+\)@\([^:\/]\+\)\(:\([^/]\+\)\)\?\/\([^/]\+\)\/\([^/]\+\)/\1 \2 \3 \4 \7 \8 \6/p') PROTOCOL=$1 USER=$2 PWD=$3 HOST=$4 DB=$5 TABLE=$6 PORT=${7:-5432} if [ -z "$PROTOCOL" ] || [ -z "$USER" ] || [ -z "$HOST" ] || [ -z "$PORT" ] || [ -z "$DB" ] || [ -z "$TABLE" ]; then echo "ERROR: Failed to parse value of OCSFolderInfoURL in /etc/sogo/sogo.conf" 1>&2 exit 1 fi if ! [ "$PROTOCOL" = "postgresql" ]; then echo "ERROR: Unsupported protocol $PROTOCOL. Use this script for migrating postgresql databases." 1>&2 exit 1 fi # Create temporary files export PGPASSFILE=$(mktemp) TABLEFILE=$(mktemp) SQLFILE=$(mktemp) trap "rm -rf $TABLEFILE $PGPASSFILE $SQLFILE" EXIT # Save password for subsequent batch-mode calls of psql echo "*:*:*:$USER:$PWD" > $PGPASSFILE ######################### # Create new tables # Check if table sogo_store exists CHECK=$(psql -A -F " " -w -t -U $USER -h $HOST $DB -c "SELECT TRUE FROM information_schema.tables WHERE table_name='sogo_store'") RET=$? if [ $RET -ne 0 ]; then echo "ERROR: postgresql returned error $RET" 1>&2 exit 1 fi if [ "$CHECK" != "t" ]; then cat >> $SQLFILE < $TABLEFILE RET=$? if [ $RET -ne 0 ]; then echo "ERROR: postgresql returned error $RET" 1>&2 exit 1 fi while read LINE do set $LINE FOLDERID=$2 FOLDERTYPE=$3 QUICKTABLE=$4 STORETABLE=$5 ACLTABLE=$6 if [ "$FOLDERTYPE" != "Appointment" ] && [ "$FOLDERTYPE" != "Contact" ]; then echo "ERROR: Unknown folder type $FOLDERTYPE, folder id $FOLDERID" 1>&2 exit 1 fi # Merge content and acl echo "INSERT INTO sogo_store(c_folder_id, $STOREFIELDS) SELECT $FOLDERID, $STOREFIELDS FROM $STORETABLE;" >> $SQLFILE echo "INSERT INTO sogo_acl(c_folder_id, c_object, c_uid, c_role) SELECT $FOLDERID, c_object, c_uid, c_role FROM $ACLTABLE;" >> $SQLFILE # Merge quick table if [ "$FOLDERTYPE" = "Appointment" ]; then echo "INSERT INTO sogo_quick_appointment(c_folder_id, $APPOINTMENTFIELDS) SELECT $FOLDERID, $APPOINTMENTFIELDS FROM $QUICKTABLE;" >> $SQLFILE else echo "INSERT INTO sogo_quick_contact(c_folder_id, $CONTACTFIELDS) SELECT $FOLDERID, $CONTACTFIELDS FROM $QUICKTABLE;" >> $SQLFILE fi # Drop migrated tables and update folder info echo "DROP TABLE $QUICKTABLE;" >> $SQLFILE echo "DROP TABLE $STORETABLE;" >> $SQLFILE echo "DROP TABLE $ACLTABLE;" >> $SQLFILE echo "UPDATE $TABLE SET c_location = NULL, c_quick_location = NULL, c_acl_location = NULL WHERE c_folder_id = $FOLDERID;" >> $SQLFILE echo >> $SQLFILE done < $TABLEFILE echo "Merging tables...." psql -v ON_ERROR_STOP=1 -w -U $USER -h $HOST $DB < $SQLFILE RET=$? if [ $RET -ne 0 ]; then echo "ERROR: postgresql returned error $RET" 1>&2 exit 1 fi ######################### # Patch sogo.conf if ! (grep -q "OCSStoreURL" /etc/sogo/sogo.conf); then echo "Patching /etc/sogo/sogo.conf...." # Generate properties OCSStoreURL and OCSAclURL sed "s/\(.*\)OCSFolderInfoURL.*$/\0\n\1OCSStoreURL = \"postgresql:\/\/$USER:$PWD@$HOST:$PORT\/$DB\/sogo_store\";\ \n\1OCSAclURL = \"postgresql:\/\/$USER:$PWD@$HOST:$PORT\/$DB\/sogo_acl\";\ \n\1OCSCacheFolderURL = \"postgresql:\/\/$USER:$PWD@$HOST:$PORT\/$DB\/sogo_cache_folder\";/g" -i /etc/sogo/sogo.conf fi