source: trunk/dsys/funcINSTALL@ 520

Last change on this file since 520 was 518, checked in by katerina, 8 years ago

Fix for ticket #412 and ticket #413.

File size: 13.3 KB
Line 
1#########################################################################
2#
3# Subroutines for installing
4#
5#########################################################################
6#
7# Copyright Rainer Wichmann (2005)
8#
9# License Information:
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# along with this program; if not, write to the Free Software
22# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23#
24
25getconfopts () {
26 fconf="$1"
27
28 if test -f "$fconf"
29 then
30 #
31 # check if readable
32 #
33 cat "$fconf" >/dev/null 2>&1 || return 1
34 #
35 # empty string if no --enable-nocl=..., else password
36 #
37 is_nocl=`cat "$fconf" | tr -d '\n' | egrep "^ *'?--enable-nocl=" | sed -e "s%^ *%%" | sed -e "s%^'%%" | sed -e "s%^--enable-nocl=%%" | sed -e "s% *$%%" | sed -e "s%'$%%"`
38 if test x"${is_nocl}" = x
39 then
40 is_nocl="start"
41 else
42 printINFO "Option --enable-nocl=${is_nocl} used."
43 fi
44 #
45 #
46 #
47 is_xor=`cat "$fconf" | tr -d '\n' | egrep "^ *'?--enable-stealth=" | sed -e "s%^ *%%" | sed -e "s%^'%%" | sed -e "s%^--enable-nocl=%%" | sed -e "s% *$%%" | sed -e "s%'$%%"`
48 if test x"${is_xor}" = x
49 then
50 is_xor="no"
51 else
52 printINFO "Option --enable-stealth=${is_xor} used."
53 fi
54 return 0
55 else
56 return 1
57 fi
58}
59
60writerecord () {
61 IDATE=`date +"%Y-%m-%d %H:%M:%S"`
62 echo " <client>"
63 echo " <client_host>${host}</client_host>"
64 echo " <client_group>${hostgroup}</client_group>"
65 echo " <client_os_machine>${arch}</client_os_machine>"
66 echo " <client_install_status>${install_entry}</client_install_status>"
67 echo " <client_install_date>${IDATE}</client_install_date>"
68 echo " <client_install_name>${SH_NAME}</client_install_name>"
69 echo " <client_install_prefix>${SH_PREFIX}</client_install_prefix>"
70 echo " <client_install_version>${src_version}.${realformat}</client_install_version>"
71 echo " </client>"
72}
73
74FTEST=0
75
76set_flag () {
77 case "$line" in
78 *\</client\>*)
79 FTEST=0;
80 return 0;
81 ;;
82
83 *\<client_host\>${host}\</client_host\>*)
84 FTEST=1;
85 return 1;
86 ;;
87
88 *)
89 return ${FTEST};
90 ;;
91 esac
92}
93
94
95#------------------------------------------------------------------------
96# Update client db
97#------------------------------------------------------------------------
98updateDB() {
99
100 if test "x$1" = x
101 then
102 install_entry="D2_installed"
103 else
104 install_entry="$1"
105 fi
106 export install_entry
107
108 if test x"$DATABASE" = x
109 then
110 DATABASE="${basedir}/${defdatabase}"
111 fi
112
113 updlock="${DATABASE}.lockdir"
114 trap "rm -rf ${updlock}" 1 2 13 15
115
116 #
117 # A lockfile will not work, because 'root' can write anyway.
118 # However, 'mkdir' an existing directory will fail even for root
119 #
120 until (umask 222; mkdir "${updlock}") 2>/dev/null # test & set
121 do
122 printINFO "Waiting for lock"
123 sleep 1
124 done
125
126
127 IDATE=`date +"%Y-%m-%d %H:%M:%S"`
128 rm -f "$tmpF"; touch "$tmpF"
129
130 if test -f "$DATABASE"; then
131 rcfile_perm=`ls -l "${DATABASE}" | \
132 awk '{ u= substr($1,2,3); g=substr($1,5,3); o=substr($1,8,3); \
133 gsub("-","",u); gsub("-","",g); gsub("-","",o); \
134 print "u=" u ",g=" g ",o=" o; }'`
135 rcfile_perm=`echo ${rcfile_perm} | sed s%g=,%g-rwx,% | sed s%,o=$%,o-rwx%`
136 rcfile_owner=`ls -l "${DATABASE}" | \
137 awk '{print $3 }'`
138 rcfile_group=`ls -l "${DATABASE}" | \
139 awk '{print $4 }'`
140 else
141 rcfile_perm=640;
142 rcfile_owner=`ls -ld ${basedir} | awk '{print $3 }'`
143 rcfile_group=`ls -ld ${basedir} | awk '{print $4 }'`
144 fi
145
146
147 if test -f "${DATABASE}"
148 then
149 SStr1=`grep '<yule_db>' "${DATABASE}"`
150 if test "x${SStr1}" != "x"
151 then
152
153 SStr2=`grep "<client_host>${host}</client_host>" "${DATABASE}"`
154
155 SStr3=
156
157 if test "x${SStr2}" != "x"
158 then
159 # REPLACE
160
161 printINFO "Replace ${host} in ${DATABASE}"
162
163 exec 3<&0 <"${DATABASE}"
164 while
165 read line
166 do
167 # for some reason, var=xx only works in a function call (why?)
168 #
169 # here we test if we are still in the same client block
170 # (set_flag will return 0 for </client> and following)
171 set_flag "$line"
172
173 if test "x$?" = "x1"
174 then
175 #
176 # Write the full entry when client_os_machine is found
177 #
178 case "$line" in
179 *\<client_os_machine\>*\</client_os_machine\>)
180 echo " <client_group>${hostgroup}</client_group>" >>"${tmpF}"
181 echo " <client_os_machine>${arch}</client_os_machine>" >>"${tmpF}"
182 echo " <client_install_status>${install_entry}</client_install_status>" >>"${tmpF}"
183 echo " <client_install_date>${IDATE}</client_install_date>" >>"${tmpF}"
184 echo " <client_install_name>${SH_NAME}</client_install_name>" >>"${tmpF}"
185 echo " <client_install_prefix>${SH_PREFIX}</client_install_prefix>" >>"${tmpF}"
186 echo " <client_install_version>${src_version}.${realformat}</client_install_version>" >>"${tmpF}"
187 ;;
188
189 *\<client_group\>*\</client_group\>)
190 :
191 ;;
192
193 *\<client_install_status\>*\</client_install_status\>)
194 :
195 ;;
196
197 *\<client_install_date\>*\</client_install_date\>)
198 :
199 ;;
200
201 *\<client_install_name\>*\</client_install_name\>)
202 :
203 ;;
204
205 *\<client_install_prefix\>*\</client_install_prefix\>)
206 :
207 ;;
208
209 *\<client_install_version\>*\</client_install_version\>)
210 :
211 ;;
212
213 *)
214 echo "$line" >>"${tmpF}"
215 ;;
216
217 esac
218 else
219 echo "$line" >>"${tmpF}"
220 fi
221
222 done
223 exec 0<&3 3<&-
224 cp "${tmpF}" "${DATABASE}"
225 else
226 # WRITE NEW CLIENT RECORD
227
228 printINFO "Write record for ${host} in ${DATABASE}"
229
230 exec 3<&0 <"${DATABASE}"
231 while
232 read line
233 do
234 if test "x$line" = "x<yule_db>"
235 then
236 echo "$line" >>"${tmpF}"
237 writerecord >>"${tmpF}"
238 else
239 echo "$line" >>"${tmpF}"
240 fi
241 done
242 exec 0<&3 3<&-
243 cp "${tmpF}" "${DATABASE}"
244 fi
245 else
246 # COMPLAIN
247 printLOG "File ${DATABASE} exists, but has wrong format";
248 fi
249 else
250 # WRITE XML FROM SCRATCH
251 printINFO "Write ${DATABASE} from scratch"
252 echo '<?xml version="1.0" encoding="ISO-8859-1"?>' >"${tmpF}"
253 echo '<!DOCTYPE yule_db SYSTEM "http://la-samhna.de/yule_db-0.2.dtd">' \
254 >>"${tmpF}"
255 echo "<yule_db>" >>"${tmpF}"
256 writerecord >>"${tmpF}"
257 echo "</yule_db>" >>"${tmpF}"
258 cp "${tmpF}" "${DATABASE}"
259 fi
260
261 chown ${rcfile_owner}:${rcfile_group} "${DATABASE}"
262 if [ $? -ne 0 ]; then
263 rm -rf "${updlock}"
264 printFATAL "Could not chown ${rcfile_owner}:${rcfile_group} ${DATABASE}"
265 fi
266 chmod ${rcfile_perm} "${DATABASE}"
267 if [ $? -ne 0 ]; then
268 rm -rf "${updlock}"
269 printFATAL "Could not chmod ${rcfile_perm} ${DATABASE}"
270 fi
271
272 rm -rf "${updlock}"
273}
274
275
276ageFILE() {
277 file="$1"
278
279 if test -f "${file}"
280 then
281 test -f "${file}.9" && { rm -f "${file}.9" || printFATAL "rm -f ${file}.9 failed."; }
282 test -f "${file}.8" && { mv "${file}.8" "${file}.9" || printFATAL "mv ${file}.8 ${file}.9 failed."; }
283 test -f "${file}.7" && { mv "${file}.7" "${file}.8" || printFATAL "mv ${file}.7 ${file}.8 failed."; }
284 test -f "${file}.6" && { mv "${file}.6" "${file}.7" || printFATAL "mv ${file}.6 ${file}.7 failed."; }
285 test -f "${file}.5" && { mv "${file}.5" "${file}.6" || printFATAL "mv ${file}.5 ${file}.6 failed."; }
286 test -f "${file}.4" && { mv "${file}.4" "${file}.5" || printFATAL "mv ${file}.4 ${file}.5 failed."; }
287 test -f "${file}.3" && { mv "${file}.3" "${file}.4" || printFATAL "mv ${file}.3 ${file}.4 failed."; }
288 test -f "${file}.2" && { mv "${file}.2" "${file}.3" || printFATAL "mv ${file}.2 ${file}.3 failed."; }
289 test -f "${file}.1" && { mv "${file}.1" "${file}.2" || printFATAL "mv ${file}.1 ${file}.2 failed."; }
290 test -f "${file}" && { mv "${file}" "${file}.1" || printFATAL "mv ${file} ${file}.1 failed."; }
291 fi
292 return 0;
293}
294
295#------------------------------------------------------------------------
296# The path to yule data
297#------------------------------------------------------------------------
298pathYDATA() {
299 if test "x${yule_data}" = x
300 then
301 promptINPUT "Please enter the path to your yule executable"
302 yule_data="$INPUT"; export yule_data
303 fi
304 if test -d "${yule_data}"
305 then
306 :
307 else
308 printFATAL "Path to yule data directory not given."
309 fi
310}
311
312#------------------------------------------------------------------------
313# The path to yule
314#------------------------------------------------------------------------
315pathYULE() {
316
317 if test "x${yule_exec}" = x
318 then
319 findEXE yule
320 if test -n "$EXECUTABLE"
321 then
322 yule_exec="$EXECUTABLE"
323 export yule_exec
324 fi
325 else
326 if test -f "${yule_exec}"
327 then
328 :
329 else
330 yule_exec=""
331 findEXE yule
332 if test -n "$EXECUTABLE"
333 then
334 yule_exec="$EXECUTABLE"
335 export yule_exec
336 fi
337 fi
338 fi
339 if test "x${yule_exec}" = x
340 then
341 promptINPUT "Please enter the path to your yule executable"
342 yule_exec="$INPUT"; export yule_exec
343 fi
344 if test -f "${yule_exec}"
345 then
346 if "${yule_exec}" --help 2>&1 | grep qualified >/dev/null 2>&1
347 then
348 :
349 else
350 printFATAL "${yule_exec} is not Yule, or not executable."
351 fi
352 else
353 printFATAL "Path to yule executable directory not given."
354 fi
355}
356
357#------------------------------------------------------------------------
358# Select operating system
359#------------------------------------------------------------------------
360selbinARCH() {
361 #---------------------------------------------------------------------
362 # Select arch to build
363 #---------------------------------------------------------------------
364 if test x"$arch" = x
365 then
366 if test x"$assumeyes" = x1
367 then
368 printFATAL "No operating system selected, aborting."
369 fi
370 cd "$basedir/archpkg" || printFATAL "Cannot cd to $basedir/archpkg !"
371 LIST=`ls 2>/dev/null`
372 if test x"$LIST" = x
373 then
374 printFATAL "No OS directories found in ${basedir}/archpkg."
375 fi
376
377 n=0
378 command="promptMENU 'Please select operating system of host' "
379 ALIST=""
380 FLIST=""
381 for ff in $LIST
382 do
383 haspkg=`ls $ff/samhain-* 2>/dev/null`
384 if test x"$haspkg" = x
385 then
386 :
387 else
388 n=`expr $n + 1`
389 osp="$ff"
390 ALIST="$ALIST $ff"
391 FLIST="$FLIST $ff"
392 if test $n -lt 8
393 then
394 command="$command '${ff}'"
395 fi
396 fi
397 done
398 if test $n -ge 8
399 then
400 command="$command other"
401 fi
402 if test $n -eq 0
403 then
404 printFATAL "No binary packages built yet !"
405 fi
406
407 eval ${command}
408 m=$?
409 if test x$m = x1
410 then
411 (exit 0); exit 0;
412 elif test x$m = "x-1"
413 then
414 printFATAL "Something went wrong !"
415 else
416 arch="$MENU"; export arch
417 if test x"$arch" = xother
418 then
419 promptINPUT "Please select operating system of host from $FLIST"
420 if test x$m = x1
421 then
422 (exit 0); exit 0;
423 elif test x$m = "x-1"
424 then
425 printFATAL "Something went wrong !"
426 else
427 found=`echo $FLIST | sed -n /$INPUT/p 2>/dev/null`
428 if test x"$found" = x
429 then
430 printFATAL "There is no package for $INPUT"
431 fi
432 arch="$INPUT"; export arch
433 fi
434 fi
435 fi
436 fi
437 # arch selected or exited
438}
439
440selbinVERSION() {
441
442 OKVERLIST=""
443
444 #---------------------------------------------------------------------
445 # Select version
446 #---------------------------------------------------------------------
447 if test x"$src_version" = x
448 then
449 if test x"$assumeyes" = x1
450 then
451 printFATAL "No version selected, aborting."
452 fi
453 cd "${basedir}/archpkg/${arch}" || printFATAL "Cannot cd to ${basedir}/archpkg/${arch} !"
454 LIST=`ls samhain-* 2>/dev/null`
455 if test x"$LIST" = x
456 then
457 printFATAL "No binary package found in ${basedir}/archpkg/${arch}."
458 fi
459
460 # --------------------------------------------------
461 # Build a list of ${version}.${format}
462 # --------------------------------------------------
463
464 for ff in $LIST
465 do
466 sh_version=`echo "$ff" | sed 's/samhain\-//g'`
467 if test -f "install-${sh_version}"
468 then
469 OKVERLIST="$OKVERLIST ${sh_version}"
470 fi
471 done
472
473 rm -f "$tmpF" && touch "$tmpF"
474
475 for dd in $OKVERLIST
476 do
477 echo "$dd" >>"$tmpF"
478 done
479
480 OKVERLIST=`cat "$tmpF" | sort -r`
481
482 rm -f "$tmpF" && touch "$tmpF"
483
484 command="promptMENU 'Please select version to install' "
485 for word in $OKVERLIST
486 do
487 command="$command '${word}'"
488 done
489
490 eval ${command}
491 m=$?
492 if test x$m = x1
493 then
494 (exit 0); exit 0;
495 elif test x$m = "x-1"
496 then
497 printFATAL "Something went wrong !"
498 else
499 first_version="$MENU";
500 fi
501
502 src_version=`echo ${first_version} | sed s%\.run%% | sed s%\.rpm%% | sed s%\.deb%% | sed s%\.tbz2%% | sed s%\.depot%% | sed s%\.pkg%%`
503 export src_version
504
505 format=`echo ${first_version} | sed '/^\(.*\)\.\([0-9a-zA-Z]*\)$/{ s//\2/; q; }'`
506 if test "x$format" = xpkg
507 then
508 format="solaris-pkg"
509 fi
510 export format
511
512 fi
513}
Note: See TracBrowser for help on using the repository browser.