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