#!/bin/sh
#----------------------------------------------------------------------------
# /var/install/bin/config_shlib -
# shell library for advanced configfile handling
#
# Creation: 2003-12-24 ap
# Last Update: $Id$
#
# Copyright (c) 2001-2007 Ansgar Puester, Ansgar.Puester(at)T-Online(dot)de
# Copyright (c) 2008-@@YEAR@@ the eisfair team, team(at)eisfair(dot)org
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#----------------------------------------------------------------------------
#
# This library is used by
#
# /var/install/bin/edit
# /var/install/bin/template-backup-config and all it's links
# /var/install/bin/template-restore-bconf and all it's links
# /var/install/bin/template-restore-dconf and all it's links
# /var/install/bin/master-diff-config and all it's links
# /var/install/bin/backup-file
#
# include eislib
. /var/install/include/eislib
defaultd=/etc/default.d
configd=/etc/config.d
backupd=/etc/backup.d
fmask='*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
#debug='true'
#trace='true'
gotoyx () { echo -e "\033[$1;$2H\c"; }
#
# get_date
# ========
#
# Parameters: $1 name of file in backup directory
#
/.
# may contain .
#
# Returns:
#
get_date()
{
old_ifs="$IFS"
IFS=.
set $1
eval echo \$$#
IFS="$old_ifs"
}
#
# check_backupdir
# ===============
#
# Parameters: $1 name of backup directory
#
# Returns: 0 success
# 1 failure
#
check_backupdir()
{
dir=$1
if [ ! -d $dir ]
then
mkdir $dir
[ $? != 0 ] && return 1
chmod og-rw $dir
[ $? != 0 ] && return 1
fi
return 0
}
#
# check_config_files
# ==================
#
# Parameters: $1 package name
# $2 'quiet' - disable screen output
#
# Returns: 0 success
# 1 failure
#
check_config_files()
{
[ "$debug" = 'true' ] && mecho "call check_config_files: $*"
[ "$trace" = 'true' ] && set -x
package=$1
quiet=$2
# count files
fcount=`find $backupd -maxdepth 1 -type f -name "$package.$fmask" 2>/dev/null | wc -l`
fcount=`echo $fcount`
# verify environment variable MAX_BACKUP_CONFIG
_ccf_max_backup=`echo ${MAX_BACKUP_CONFIG} | sed 's/[^0-9]//g'`
[ "${_ccf_max_backup}" = '' ] && _ccf_max_backup=10
# check number of files
if [ "$fcount" -gt "${_ccf_max_backup}" ]
then
# number of files to remove
rmcount=`expr $fcount - ${_ccf_max_backup}`
count=0
# find files in sorted order
{
for FNAME in `find ${backupd} -maxdepth 1 -type f -name "${package}.${fmask}"`
do
# extract timestamp
FDATE=`get_date ${FNAME}`
# add timestamp as second field to in-transit output
echo "${FNAME}:${FDATE}"
done
} | sort -t: -k2 | while read line
do
# remove obsolete files
if [ "$count" -lt "$rmcount" ]
then
# extract filename from line
file=`echo ${line} | cut -d: -f1`
rm $file
count=`expr $count + 1`
else
break
fi
done
if [ "${quiet}" != "quiet" ]
then
mecho --info "Backup directory contained $fcount files for package $package ($rmcount removed)."
fi
fi
}
#
# backup_config
# =============
#
# Parameters: $1 package name
# $2 file to backup
# $3 individal backup suffix
# $4 'quiet' - disable screen output
#
# Returns: 0 backup O.K.
# 1 failure
#
backup_config()
{
[ "$debug" = 'true' ] && mecho "call backup_config: $*"
[ "$trace" = 'true' ] && set -x
package=$1
file=$2
suffix=$3
quiet=$4
# check backup directory
if ! check_backupdir $backupd
then
mecho --error "Error creating backup directory $backupd ..."
return 1
fi
if [ "$suffix" = "" ]
then
# timestamp to add to filename
stamp=`date +%Y-%m-%d-%H-%M-%S`
else
# individual suffix to add to filename
stamp=$suffix
fi
# do the backup
if [ -f $file ]
then
cp -p $file $backupd/$package.$stamp
chmod og-rw $backupd/$package.$stamp
if [ "$quiet" != "quiet" ]
then
mecho --info "Configuration file was saved as $package.$stamp in $backupd."
fi
else
if [ "$quiet" != "quiet" ]
then
mecho --warn "File $file not found - no backup done"
fi
fi
# check if files have to be deleted
check_config_files ${package} ${quiet}
}
#
# activate_hint
# =============
#
activate_hint()
{
mecho --info "Configuration file $configd/$package was overwritten."
mecho --info "You have to activate the configuration in order to"
mecho --info "let the changes take effect."
mecho --info "For most packages an 'Edit Configuration' without any"
mecho --info "changes followed by an answer 'yes' to the question"
mecho --info "'Activate the new configuration now (y/n)?' will do"
mecho --info "this job."
}
#
# select_file
# ===========
#
# Variables used by select_file
# MD_TITLE
# MD_SUBTITLE
#
select_file()
{
files=$(find ${backupd} -maxdepth 1 -type f -name "${package}.${fmask}" |
sort)
if [ -n "${omit_file}" ]
then
files=$(echo "${files}" | grep -v "${omit_file}")
fi
# header_md
if [ -n "${files}" ]
then
# find files in sorted order
MD_FLAGS='--indent 12 --spread'
MD_COLS='60*'
MD_ROWS=0
export MD_TITLE
export MD_FLAGS
export MD_COLS
for file in $(echo "${files}")
do
MD_ROWS=$(expr ${MD_ROWS} + 1)
eval bfile_${MD_ROWS}='"${file}"'
eval MD_${MD_ROWS}_1=\"'${file}'\"
export MD_${MD_ROWS}_1
export MD_ROWS
done
MD_QUESTION='Select'
export MD_QUESTION
_ask_tmpfile=$(/bin/mktemp -t XXXXXXXXXXXXX)
/var/install/bin/choose MD 1 > ${_ask_tmpfile}
rc=${?}
read answer < ${_ask_tmpfile}
rm -f ${_ask_tmpfile}
# if ask break, ask returned 255
if [ ${rc} = 255 ]
then
answer=''
fi
else
if [ -z "${omit_file}" ]
then
mecho --warn "No files for $package found in $backupd."
else
mecho --warn "Only one file for $package found in $backupd."
fi
anykey
answer=''
fi
}
# ---------------------------------------------------------------------------
# end
#----------------------------------------------------------------------------