tags 603428 +patch tags 603428 +penting thanks Hi!
* Alexander Reichle-Schmehl <toli...@debian.org> [101216 14:14]: > The only part missing would to make sure, snort-{mysql,pgsql} write into > the new file instead of the old one, and purge the new file. But the > main part taking care of this bug can already be reviewed if someone > likes to do so ;) Attached is now a proposal to solve this bug. I must confess, that I didn't had the change to do extensive testing (I did only upgrade tests, no functionality tests), but I think I covered most scenarios. The only thing I can think of that might fail, is if a user modified his /etc/snort/snort.conf himselve, and upgrades. In this case the db configuration is splitt into a sepperate file, but the new "include" line isn't added automatically, but the user will have the usual "new configuration file, but you modified it, look at it" thing and hopefully see the db releated chances. I'm not sure, if that problem can be solved in a better way. As I'm not a user of snort myself, I enourage more testing of this patch. Packages are available at http://people.debian.org/~tolimar/tmp/snort-nmu/ Best Regards, Alexander
diff -u snort-2.8.5.2/etc/snort.conf snort-2.8.5.2/etc/snort.conf --- snort-2.8.5.2/etc/snort.conf +++ snort-2.8.5.2/etc/snort.conf @@ -701,16 +701,11 @@ # output database: log, odbc, user=snort dbname=snort # output database: log, mssql, dbname=snort user=snort password=test # output database: log, oracle, dbname=snort user=snort password=test -# <debian> -# Keep your paws off of these (#DBSTART#) and (#DBEND#) tokens -# or you *will* break the configure process (snort-pgsql/snort-mysql only) -# Anything you put between them will be removed on (re)configure. -# -# (#DBSTART#) -# (#DBEND#) -# -# </debian> # +# On Debian Systems, the database configuration is sepperate into +# /etc/snort/database.conf. +# please edit it there, to ensure smoother upgrades of this file. +include database.conf # unified: Snort unified binary format alerting and logging diff -u snort-2.8.5.2/debian/snort-pgsql.postinst snort-2.8.5.2/debian/snort-pgsql.postinst --- snort-2.8.5.2/debian/snort-pgsql.postinst +++ snort-2.8.5.2/debian/snort-pgsql.postinst @@ -77,8 +77,7 @@ fi if [ "$STARTUP" != "manual" ]; then - if [ -f /etc/snort/snort.conf ]; then - # insert database config stuff in the configuration file, + # create database config stuff in the configuration file, # or configure it for syslog-logging. db_get snort-pgsql/configure_db if [ "$RET" = "true" ]; then @@ -87,52 +86,25 @@ db_get snort-pgsql/db_user || true; DB_USER=$RET db_get snort-pgsql/db_pass || true; DB_PASS=$RET - # Here we put the database stuff in the config file. TEMPFILE=`mktemp` - cat /etc/snort/snort.conf | while read LINE - do - if [ "$LINE" = "# (#DBSTART#)" ] - then - echo "# (#DBSTART#)" >> $TEMPFILE - echo -n "output database: log, postgresql, " >> $TEMPFILE - if [ $DB_USER ] - then - echo -n "user=$DB_USER " >> $TEMPFILE - fi - if [ $DB_PASS ] - then - echo -n "password=$DB_PASS " >> $TEMPFILE - fi - if [ $DB_DATABASE ] - then - echo -n "dbname=$DB_DATABASE " >> $TEMPFILE - fi - if [ $DB_HOST ] - then - echo -n "host=$DB_HOST " >> $TEMPFILE - fi - echo " " >> $TEMPFILE - echo "# (#DBEND#)" >> $TEMPFILE - break - else - echo $LINE >> $TEMPFILE - fi - done - - WRITE=0 - cat /etc/snort/snort.conf | while read LINE - do - if [ $WRITE -eq 1 ] - then - echo $LINE >> $TEMPFILE - fi - - if [ "$LINE" = "# (#DBEND#)" ] - then - WRITE=1 - fi - done - mv -f $TEMPFILE /etc/snort/snort.conf + echo -n "output database: log, postgresql, " >> $TEMPFILE + if [ $DB_USER ] + then + echo -n "user=$DB_USER " >> $TEMPFILE + fi + if [ $DB_PASS ] + then + echo -n "password=$DB_PASS " >> $TEMPFILE + fi + if [ $DB_DATABASE ] + then + echo -n "dbname=$DB_DATABASE " >> $TEMPFILE + fi + if [ $DB_HOST ] + then + echo -n "host=$DB_HOST " >> $TEMPFILE + fi + mv -f $TEMPFILE /etc/snort/database.conf fi # Ensure the config file is readable by root.root and mode 600 diff -u snort-2.8.5.2/debian/snort-mysql.postinst snort-2.8.5.2/debian/snort-mysql.postinst --- snort-2.8.5.2/debian/snort-mysql.postinst +++ snort-2.8.5.2/debian/snort-mysql.postinst @@ -78,63 +78,36 @@ fi if [ "$STARTUP" != "manual" ]; then - if [ -f /etc/snort/snort.conf ]; then - # insert database config stuff in the configuration file, - # or configure it for syslog-logging. - db_get snort-mysql/configure_db - if [ "$RET" = "true" ]; then - db_get snort-mysql/db_host || true; DB_HOST=$RET - db_get snort-mysql/db_database || true; DB_DATABASE=$RET - db_get snort-mysql/db_user || true; DB_USER=$RET - db_get snort-mysql/db_pass || true; DB_PASS=$RET - - # Here we put the database stuff in the config file. - TEMPFILE=`mktemp` - cat /etc/snort/snort.conf | while read LINE - do - if [ "$LINE" = "# (#DBSTART#)" ] - then - echo "# (#DBSTART#)" >> $TEMPFILE - echo -n "output database: log, mysql, " >> $TEMPFILE - if [ $DB_USER ] - then - echo -n "user=$DB_USER " >> $TEMPFILE - fi - if [ $DB_PASS ] - then - echo -n "password=$DB_PASS " >> $TEMPFILE - fi - if [ $DB_DATABASE ] - then - echo -n "dbname=$DB_DATABASE " >> $TEMPFILE - fi - if [ $DB_HOST ] - then - echo -n "host=$DB_HOST " >> $TEMPFILE - fi - echo " " >> $TEMPFILE - echo "# (#DBEND#)" >> $TEMPFILE - break - else - echo $LINE >> $TEMPFILE - fi - done - - WRITE=0 - cat /etc/snort/snort.conf | while read LINE - do - if [ $WRITE -eq 1 ] - then - echo $LINE >> $TEMPFILE - fi - - if [ "$LINE" = "# (#DBEND#)" ] - then - WRITE=1 - fi - done - mv -f $TEMPFILE /etc/snort/snort.conf + # create database config stuff in the configuration file, + # or configure it for syslog-logging. + db_get snort-mysql/configure_db + if [ "$RET" = "true" ]; then + db_get snort-mysql/db_host || true; DB_HOST=$RET + db_get snort-mysql/db_database || true; DB_DATABASE=$RET + db_get snort-mysql/db_user || true; DB_USER=$RET + db_get snort-mysql/db_pass || true; DB_PASS=$RET + + # Here we put the database stuff in the config file. + TEMPFILE=`mktemp` + echo -n "output database: log, mysql, " >> $TEMPFILE + if [ $DB_USER ] + then + echo -n "user=$DB_USER " >> $TEMPFILE + fi + if [ $DB_PASS ] + then + echo -n "password=$DB_PASS " >> $TEMPFILE + fi + if [ $DB_DATABASE ] + then + echo -n "dbname=$DB_DATABASE " >> $TEMPFILE + fi + if [ $DB_HOST ] + then + echo -n "host=$DB_HOST " >> $TEMPFILE fi + echo " " >> $TEMPFILE + mv -f $TEMPFILE /etc/snort/database.conf # Ensure the config file is readable by root.root and mode 600 if ! dpkg-statoverride --list /etc/snort/snort.conf >/dev/null @@ -142,7 +115,7 @@ chown root:snort /etc/snort/snort.conf chmod 640 /etc/snort/snort.conf fi - fi + fi fi db_stop diff -u snort-2.8.5.2/debian/snort-mysql.postrm snort-2.8.5.2/debian/snort-mysql.postrm --- snort-2.8.5.2/debian/snort-mysql.postrm +++ snort-2.8.5.2/debian/snort-mysql.postrm @@ -36,6 +36,9 @@ if [ -e /etc/snort/db-pending-config ] ; then rm /etc/snort/db-pending-config fi + if [ -e /etc/snort/database.conf ] ; then + rm /etc/snort/database.conf + fi # Remove configuration dir [ -d /etc/snort ] && rmdir --ignore-fail-on-non-empty /etc/snort diff -u snort-2.8.5.2/debian/changelog snort-2.8.5.2/debian/changelog --- snort-2.8.5.2/debian/changelog +++ snort-2.8.5.2/debian/changelog @@ -1,3 +1,16 @@ +snort (2.8.5.2-2.1) unstable; urgency=low + + * Non-maintainer upload. + * Move the DB-Configuration into a sepperate file, instead of modifying + /etc/snort/snort.conf, which causes upgrade problems (Closes: #603428) + * Adding snort-common-preinst to split off exiting config or touch the + new database config file on new installations to ensure it exists + * modify etc/snort.conf to include the new database conf file + * modify snort-{mysql,pgsql}.postinst to use new config file + * modify snort-{mysql,pgsql,common}.postrm to purge new config file + + -- Alexander Reichle-Schmehl <toli...@debian.org> Thu, 16 Dec 2010 14:30:46 +0100 + snort (2.8.5.2-2) unstable; urgency=low * Remove the reverse_order debconf option since Snort no longer supports the diff -u snort-2.8.5.2/debian/snort-pgsql.postrm snort-2.8.5.2/debian/snort-pgsql.postrm --- snort-2.8.5.2/debian/snort-pgsql.postrm +++ snort-2.8.5.2/debian/snort-pgsql.postrm @@ -36,6 +36,9 @@ if [ -e /etc/snort/db-pending-config ] ; then rm /etc/snort/db-pending-config fi + if [ -e /etc/snort/database.conf ] ; then + rm /etc/snort/database.conf + fi # Remove configuration dir [ -d /etc/snort ] && rmdir --ignore-fail-on-non-empty /etc/snort only in patch2: unchanged: --- snort-2.8.5.2.orig/debian/snort-common.postrm +++ snort-2.8.5.2/debian/snort-common.postrm @@ -0,0 +1,39 @@ +#! /bin/sh +# postrm script for snort +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * <postrm> `remove' +# * <postrm> `purge' +# * <old-postrm> `upgrade' <new-version> +# * <new-postrm> `failed-upgrade' <old-version> +# * <new-postrm> `abort-install' +# * <new-postrm> `abort-install' <old-version> +# * <new-postrm> `abort-upgrade' <old-version> +# * <disappearer's-postrm> `disappear' <r>overwrit>r> <new-version> +# for details, see /usr/doc/packaging-manual/ + + +case "$1" in + purge) + # on installation we touch this file to ensure it's there + # if it's still there and emmpty, we can remove it + # if it's not empty, snort-{mysql,pgsql} have added content and + # should deal with it themselve on purge + if [ -e /etc/snort/database.conf ] && [ ! -s /etc/snort/database.conf ] + then + rm -f /etc/snort/database.conf + fi + ;; + remove|upgrade|failed-upgrade|abort-install|abort-upgrade) + # nothing +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + only in patch2: unchanged: --- snort-2.8.5.2.orig/debian/snort-common.preinst +++ snort-2.8.5.2/debian/snort-common.preinst @@ -0,0 +1,70 @@ +#!/bin/sh + +set -e + +# summary of how this script can be called: +# * <new-preinst> `install' +# * <new-preinst> `install' <old-version> +# * <new-preinst> `upgrade' <old-version> +# * <old-preinst> `abort-upgrade' <new-version> + +DBCONF="/etc/snort/database.conf" +GENCONF="/etc/snort/snort.conf" + +case "$1" in + install) + # make sure database configuration file exists + touch $DBCONF + ;; + upgrade) + # earlier versions modified /etc/snort/snort.conf directly for the + # DB stuff, we splitt it off in a sepperate file, to ensure smooth + # upgrades + if dpkg --compare-versions "$2" le "2.8.5.2-2"; + then + GENCONF_TEMPFILE=`mktemp` + DBCONF_TEMPFILE=`mktemp` + WRITE_DB=0 + WRITE_GEN=1 + cat $GENCONF | while read LINE + do + if [ "$LINE" = "# (#DBEND#)" ] + then + WRITE_DB=0 + WRITE_GEN=1 + fi + if [ $WRITE_DB -eq 1 ] + then + echo $LINE >> $DBCONF_TEMPFILE + fi + if [ $WRITE_GEN -eq 1 ] + then + echo $LINE >> $GENCONF_TEMPFILE + fi + if [ "$LINE" = "# (#DBSTART#)" ] + then + WRITE_DB=1 + WRITE_GEN=0 + fi + done + mv $DBCONF_TEMPFILE $DBCONF + mv $GENCONF_TEMPFILE $DBCONF + fi + ;; + configure) + ;; + abort-upgrade) + ;; + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 +