f2fc9a1add4f147e2433d6400ff8ff014fcb66e5
[carnet-tools-cn.git] / functions.sh
1 # by ddzeko & ico, Fri, 18 Mar 2005 14:44:08 +0100
2 cp_get_ifaddr() {
3   [ "$CP_SCRIPT_DEBUG" ] && set -vx
4   local ifaddr interface echo_return
5   echo_return="$CP_ECHO_RETURN" # since we're making our own calls
6   # in our own way we need to set CP_ECHO_RETURN the way we want it
7   # but preserving initial state so it could be used afterwards
8   CP_ECHO_RETURN=""
9
10   interface="$1"
11   if [ -z "$interface" ]; then
12     cp_get_ifdefault dev
13     interface="$RET"
14     [ -z "$interface" ] && interface=lo
15   fi
16
17   if ! ifconfig $interface 2> /dev/null >> /dev/null; then
18     echo "cp_get_ifaddr: $interface: No such interface" 1>&2
19     CP_ECHO_RETURN="$echo_return"
20     return 1
21   fi
22
23   ifaddr="`/sbin/ifconfig $interface | awk '/inet/{ printf("%s\n",substr($2,index($2,":")+1)) }'`"
24
25   if [ -z $ifaddr ]; then
26     echo "cp_get_ifaddr: $interface: No such ipaddress" 1>&2
27     CP_ECHO_RETURN="$echo_return"
28     return 1
29   fi
30
31   RET="$ifaddr"
32   [ -z "$echo_return" ] || echo $RET
33   CP_ECHO_RETURN="$echo_return"
34 }
35
36 # by ddzeko & ico, Fri, 18 Mar 2005 14:44:08 +0100
37 cp_get_ifmask() {
38   [ "$CP_SCRIPT_DEBUG" ] && set -vx
39   local ifmask interface echo_return
40   echo_return="$CP_ECHO_RETURN" # since we're making our own calls
41   # in our own way we need to set CP_ECHO_RETURN the way we want it
42   # but preserving initial state so it could be used afterwards
43   CP_ECHO_RETURN=""
44
45   interface="$1"
46   if [ -z "$interface" ]; then
47     cp_get_ifdefault dev
48     interface="$RET"
49     [ -z "$interface" ] && interface=lo
50   fi
51
52   if ! ifconfig $interface 2> /dev/null >> /dev/null; then
53     echo "cp_get_ifmask: $interface: No such interface" 1>&2
54     CP_ECHO_RETURN="$echo_return"
55     return 1
56   fi
57
58   ifmask="`/sbin/ifconfig $interface | awk '/Mask/{if($3~/Mask/)a=$3;else if ($4~/Mask/)a=$4;printf ("%s\n", substr(a,index(a,":")+1))}'`"
59
60   if [ -z "$ifmask" ]; then
61     echo "cp_get_ifmask: $interface: No such netmask" 1>&2
62     CP_ECHO_RETURN="$echo_return"
63     return 1
64   fi
65
66   RET="$ifmask"
67   [ -z "$echo_return" ] || echo $RET
68   CP_ECHO_RETURN="$echo_return"
69 }
70
71 # by ddzeko, Mon, 21 Mar 2005 07:00:22 +0100
72 cp_get_ifdefault() {
73   local echo_return
74   echo_return="$CP_ECHO_RETURN" # since we're making our own calls
75   # in our own way we need to set CP_ECHO_RETURN the way we want it
76   # but preserving initial state so it could be used afterwards
77   CP_ECHO_RETURN=""
78
79   [ "$CP_SCRIPT_DEBUG" ] && set -vx
80   RET=""
81   case $1 in
82     dev)  RET=`route -n | awk '/^0.0.0.0/{print $8}'` ;;
83     addr) RET=`route -n | awk '/^0.0.0.0/{print $2}'` ;;
84     *)    echo "cp_get_ifdefault: Argument required (dev or addr)" >&2 ;;
85   esac
86   [ -z "$RET" -a "$1" -a "$CP_VERBOSE" ] && echo "cp_get_ifdefault: No default route" >&2
87   [ -z "$echo_return" ] || echo $RET
88   CP_ECHO_RETURN="$echo_return"
89   [ -z "$RET" ] && return 1
90 }
91
92 # by ico, Tue, 15 Mar 2005 14:04:21 +0100
93 cp_get_netaddr() {
94   [ "$CP_SCRIPT_DEBUG" ] && set -vx
95   local netmask ipaddress interface cidr echo_return
96   echo_return="$CP_ECHO_RETURN" # since we're making our own calls
97   # in our own way we need to set CP_ECHO_RETURN the way we want it
98   # but preserving initial state so it could be used afterwards
99   CP_ECHO_RETURN=""
100
101   interface="$1"
102   if [ -z "$interface" ]; then
103     cp_get_ifdefault dev
104     interface="$RET"
105     [ -z "$interface" ] && interface=lo
106   fi
107
108   if ! ifconfig $interface 2> /dev/null >> /dev/null; then
109     echo "cp_get_netaddr: $interface: No such interface" 1>&2
110     CP_ECHO_RETURN="$echo_return"
111     return 1
112   fi
113
114   cp_get_ifaddr "$interface"
115   ipaddress="$RET"
116   if [ -z $ipaddress ]; then
117     echo "cp_get_netaddr: $interface: No such ipaddress" 1>&2
118     CP_ECHO_RETURN="$echo_return"
119     return 1
120   fi
121   cp_get_ifmask "$interface"
122   netmask="$RET"
123   if [ -z $netmask ]; then
124     echo "cp_get_netaddr: $interface: No such netmask" 1>&2
125     CP_ECHO_RETURN="$echo_return"
126     return 1
127   fi
128
129   if [ "$netmask" = "255.255.255.255" ]; then
130     cidr="$ipaddress/32"
131   else 
132     cidr="`ipcalc -ncb $ipaddress $netmask | awk '/^Network:/{print $2}'`"
133   fi
134   
135   RET="$cidr"
136   [ -z "$echo_return" ] || echo $RET
137   CP_ECHO_RETURN="$echo_return"
138 }
139
140 # by ico, Tue, 15 Mar 2005 14:04:21 +0100
141 cp_backup_conffile() {
142   [ "$CP_SCRIPT_DEBUG" ] && set -vx
143   local file_bak
144
145   if [ -z "$1" ]; then
146     return 1
147   fi
148   if [ ! -f "$1" ]; then
149     echo "cp_backup_conffile: $1: No such file" 1>&2
150     return 1
151   fi
152
153   file_bak="/var/backups/`basename $1`.bak"
154
155   if [ ! -f $file_bak ]; then
156     cp -pf "$1" $file_bak
157   else
158     if ! cmp -s "$1" $file_bak; then
159       /usr/bin/savelog -p -c 7 $file_bak > /dev/null 2> /dev/null
160       cp -pf $1 $file_bak
161     fi
162   fi
163 }
164
165 # by jelly, Tue, 15 Mar 2005 14:04:21 +0100
166 # A sed wrapper, to use instead of perl -pi -e
167 #  - relatively safe in-place s///g
168 #  - takes care of symlinks and ownership
169 # returns true if changed, false if nothing happened
170 #
171 cp_check_and_sed() {
172   [ "$CP_SCRIPT_DEBUG" ] && set -vx
173   local s sedcmd ret i
174   s="$1"
175   shift
176   sedcmd="$1"
177   shift
178   ret=2
179   for i in "$@"
180   do
181     [ -e "$i" ]        || continue
182     if egrep -q "$s" "$i"; then
183       continue
184     fi
185     [ -h "$i" ]        && i=$(readlink -f "$i")
186     sed "$sedcmd" "$i" > "$i.dpkg-tmp"
187     if ! cmp -s "$i" "$i.dpkg-tmp" 2>&1 >/dev/null; then
188       cp_mv "$i.dpkg-tmp" "$i"
189     else
190       rm "$i.dpkg-tmp"
191     fi
192     ret=0
193   done
194   return $ret
195 }
196
197 # by jelly, Sun, 20 Mar 2005 20:12:19 +0100
198 cp_echo () {
199   [ "$CP_SCRIPT_DEBUG" ] && set -vx
200   if [ "x$1" = "x-mailonly" -o "x$1" = "x-m" ]; then
201     shift
202   else   
203     echo "$*"
204   fi
205   CP_NOTICE="$CP_NOTICE$1"
206   if [ `echo -n "$*" | wc -l` -eq 0 ]; then
207     CP_NOTICE="$CP_NOTICE
208 "
209   fi
210 }   
211
212 # by jelly, Sun, 20 Mar 2005 20:12:19 +0100
213 cp_mail () {
214   [ "$CP_SCRIPT_DEBUG" ] && set -vx
215   local pkg version quiet
216   if [ "x$1" = "x-q" ]; then
217     quiet=1
218     shift
219   fi
220   [ -n "$1" ] && pkg="$1"       # barf if no package
221   [ -n "$2" ] && version=" $2" || true
222   if [ "$(echo $CP_NOTICE|wc -w)" -gt 0 ]; then
223     [ -n "$quiet" ] || echo "Mailing upgrade output to root."
224     CP_NOTICE="From: $pkg postinst script <root>
225 To: root
226 Subject: $pkg$version package install log
227 Date: $(/bin/date +'%a, %d %b %Y %H:%M:%S %z')
228  
229 Hello!
230
231 The $pkg package has been successfully installed on your computer.
232 For your convenience, a partial output of the last $pkg installation
233 is included below.
234
235 ----------
236 ${CP_NOTICE}----------"
237   
238     echo "$CP_NOTICE" | /usr/sbin/sendmail -t &
239     sleep 1
240   fi
241 }
242
243 # by ddzeko, Mon, 21 Mar 2005 11:31:59 +0100
244 cp_mv () {
245   [ "$CP_SCRIPT_DEBUG" ] && set -vx
246   local new old
247   if [ -z "$2" ]; then
248     return 1
249   fi
250   new="$1"
251   old="$2"
252   if [ -e "$old" ]; then
253     chown --reference "$old" "$new"
254     chmod --reference "$old" "$new"
255   fi
256   mv "$new" "$old"
257 }