Priprema za bullseye, ne briĊĦemo se iz prerm
[amavisd-cn.git] / src / functions.sh
1 #####
2 ##
3 ## first, some generic functions
4 ##
5
6 # find first free uid/gid in range
7 # find_id passwd 100 999
8 find_id() {
9   local db first last ids
10   db=$1
11   first=$2
12   last=$3
13   ids=$(getent $db | awk -F: "\$3 >= $first && \$3 <= $last {print \$3}")
14   for i in $(seq $first $last)
15   do
16     if ! echo $ids |grep -q $i; then
17       echo $i
18       return 0
19     fi
20   done
21   return 1
22 }
23
24 #
25 # Update uid for user from reserved system range (0-99) to dynamic system
26 # range (100-999).  Optionally update ownerships of given directories.
27 # $0 user [directory ...]
28 #
29 check_and_update_ugid() {
30   local user newgid newuid
31   user=$1
32   if [ "$(getent passwd $user | awk -F: '$3 >= 100 {print "ok"; exit 0}')" ]; then
33     return 0
34   fi
35   shift
36   newgid=$(find_id group 100 999)
37   newuid=$(find_id passwd 100 999)
38   # other directories/files
39   chown -R $newuid:$newgid $* 2>/dev/null || true
40   groupmod -g $newgid $user
41   usermod -u $newuid -g $newgid $user
42   cp_echo "CN: Fixed $user user uid/gid."
43 }
44
45 wait_for_fds () {
46   # wait until process shows some I/O readiness :)
47   [ "$DEBIAN_SCRIPT_DEBUG" ] && set -vx
48   local name IFSOLD num sleep maxtry script user psname pidfile fdname
49   name="$1"
50   [ -z "$name" ] && return 1
51   IFSOLD="$IFS"
52   IFS=" " # tab
53   read name script user psname pidfile num fdname <<-EOPTS
54         $(echo "$options" | sed 's/             */      /g' | grep ^$name)
55         EOPTS
56   IFS="$IFSOLD"
57   num=${num:-4}
58   sleep=${sleep:-1}
59   maxtry=${maxtry:-10}
60   if [ -n "$pidfile" ]; then
61     pidfile=/var/run/$pidfile
62     findpid="[ -f $pidfile ] && cat $pidfile || true"
63   else
64     findpid="pgrep -u $user -f \"$psname\" -P 1 | head -1"
65   fi
66
67   # loop the loop the loop
68   try=1
69   while /bin/true
70   do
71     sleep $sleep                           # 1st, give it a chance to run
72     pid=`eval $findpid`                    # 2nd: find it
73     [ -z "$pid" ]           && return 1    # not running at all
74     count=`ls -1 /proc/$pid/fd 2> /dev/null| wc -l`    # 3rd: count all it's worth
75     [ "$count" -ge "$num" ] && ls -l /proc/$pid/fd | grep -q $fdname \
76                             && return      # success -- release
77     try=$(($try+1))
78     [ "0$try" -ge "0$maxtry" ] && return 1 # no luck this time
79   done
80 }
81
82 failed() {
83   if [ -n "$failed" ]; then
84     failed="$failed, $1"
85   else
86     failed="$1"
87   fi
88 }
89
90 check_and_add_alias () {
91   if ! grep -q "^$1:" $ALIASES; then
92     echo "$1: $2" >> $ALIASES
93     # both postfix and sendmail use newaliases
94     newaliases > /dev/null
95   fi
96 }
97
98 noisy_backup() {
99   cp_backup_conffile "$1"
100   cp_echo "CN: Current configuration saved in /var/backups/`basename $1`.bak"
101 }
102
103 # XXX TODO implement per paragraph conditional munging some day
104 in_paragraph() {
105   return 1
106 }
107   
108 commented_in_paragraph() {
109   local s
110   s="$1"
111   shift
112   s=`echo $s|sed 's/^/[[:blank:]]*#[[:blank:]]/'`
113   set -- "$s" "$@"
114   in_paragraph "$@"
115 }
116
117 uncommented_in_paragraph() {
118   local s
119   s="$1"
120   shift
121   s=`echo $s|sed 's/^/[[:blank:]]*/'`
122   set -- "$s" "$@"
123   in_paragraph "$@"
124 }
125
126 catpatch() {
127   cat "$postdiff" | sed "s,amavisd\.conf[a-z.-]*\t,$1\t,"
128 }
129
130 #####
131 ##
132 ## amavisd-cn specific functions bloated enough to be moved here
133 ##
134
135 conf_from_template() {
136   cp /dev/null $ACONF
137   sed -e "s/_CN_DOMAIN_/$domain/g; s/_CN_HOST_/$host/g" $ACONFTMPL >> $ACONF
138   restart_daemon=1
139   changed_config=1
140 }
141
142 # Place configuration tweaks done on upgrades into this function
143 update_conf() {
144   # placeholder.
145   # remember to set changed_config=1 and restart_daemon=1 if necessary
146   #:
147   if dpkg --compare-versions "$2" lt "$MASTTMPLVERSION"; then
148     conf_from_template
149   fi
150 }
151
152 add_redirection() {
153     until [ -z "$1" ]
154     do
155         if [ -e "$1" ] && egrep -q 'amavisd-new-cronjob (sa-sync|sa-clean)$' "$1"; then
156 sed -i -e 's:\(^.*amavisd-new-cronjob \(sa-sync\|sa-clean\)$\):\1 1>/dev/null 2>\&1:g' "$1"
157         fi
158         shift
159     done
160 }