Handle hostnames with upper-case letters
[webmin.git] / setup.sh
1 #!/bin/sh
2 # setup.sh
3 # This script should be run after the webmin archive is unpacked, in order
4 # to setup the various config files
5
6 # Find install directory
7 LANG=
8 export LANG
9 cd `dirname $0`
10 if [ -x /bin/pwd ]; then
11         wadir=`/bin/pwd`
12 else
13         wadir=`pwd`;
14 fi
15 srcdir=$wadir
16 ver=`cat "$wadir/version"`
17
18 # Find temp directory
19 if [ "$tempdir" = "" ]; then
20         tempdir=/tmp/.webmin
21 fi
22
23 if [ $? != "0" ]; then
24         echo "ERROR: Cannot find the Webmin install directory";
25         echo "";
26         exit 1;
27 fi
28
29 echo "***********************************************************************"
30 echo "*            Welcome to the Webmin setup script, version $ver        *"
31 echo "***********************************************************************"
32 echo "Webmin is a web-based interface that allows Unix-like operating"
33 echo "systems and common Unix services to be easily administered."
34 echo ""
35
36 # Only root can run this
37 id | grep "uid=0(" >/dev/null
38 if [ $? != "0" ]; then
39         uname -a | grep -i CYGWIN >/dev/null
40         if [ $? != "0" ]; then
41                 echo "ERROR: The Webmin install script must be run as root";
42                 echo "";
43                 exit 1;
44         fi
45 fi
46
47 # Use the supplied destination directory, if any
48 if [ "$1" != "" ]; then
49         wadir=$1
50         echo "Installing Webmin from $srcdir to $wadir ..."
51         if [ ! -d "$wadir" ]; then
52                 mkdir "$wadir"
53                 if [ "$?" != "0" ]; then
54                         echo "ERROR: Failed to create $wadir"
55                         echo ""
56                         exit 1
57                 fi
58         else
59                 # Make sure dest dir is not in use
60                 ls "$wadir" | grep -v rpmsave >/dev/null 2>&1
61                 if [ "$?" = "0" -a ! -r "$wadir/setup.sh" ]; then
62                         echo "ERROR: Installation directory $wadir contains other files"
63                         echo ""
64                         exit 1
65                 fi
66         fi
67 else
68         echo "Installing Webmin in $wadir ..."
69 fi
70 cd "$wadir"
71
72 # Work out perl library path
73 PERLLIB=$wadir
74 if [ "$perllib" != "" ]; then
75         PERLLIB="$PERLLIB:$perllib"
76 fi
77
78 # Validate source directory
79 allmods=`cd "$srcdir"; echo */module.info | sed -e 's/\/module.info//g'`
80 if [ "$allmods" = "" ]; then
81         echo "ERROR: Failed to get module list"
82         echo ""
83         exit 1
84 fi
85 echo ""
86
87 # Load package-defined variable overrides
88 if [ -r "$srcdir/setup-pre.sh" ]; then
89         . "$srcdir/setup-pre.sh"
90 fi
91
92 # Ask for webmin config directory
93 echo "***********************************************************************"
94 echo "Webmin uses separate directories for configuration files and log files."
95 echo "Unless you want to run multiple versions of Webmin at the same time"
96 echo "you can just accept the defaults."
97 echo ""
98 printf "Config file directory [/etc/webmin]: "
99 if [ "$config_dir" = "" ]; then
100         read config_dir
101 fi
102 if [ "$config_dir" = "" ]; then
103         config_dir=/etc/webmin
104 fi
105 abspath=`echo $config_dir | grep "^/"`
106 if [ "$abspath" = "" ]; then
107         echo "Config directory must be an absolute path"
108         echo ""
109         exit 2
110 fi
111 if [ ! -d $config_dir ]; then
112         mkdir $config_dir;
113         if [ $? != 0 ]; then
114                 echo "ERROR: Failed to create directory $config_dir"
115                 echo ""
116                 exit 2
117         fi
118 fi
119 if [ -r "$config_dir/config" ]; then
120         echo "Found existing Webmin configuration in $config_dir"
121         echo ""
122         upgrading=1
123 fi
124
125 # Check if upgrading from an old version
126 if [ "$upgrading" = 1 ]; then
127         echo ""
128
129         # Get current var path
130         var_dir=`cat $config_dir/var-path`
131
132         # Force creation if non-existant
133         mkdir -p $var_dir >/dev/null 2>&1
134
135         # Get current perl path
136         perl=`cat $config_dir/perl-path`
137
138         # Create temp files directory
139         $perl "$srcdir/maketemp.pl"
140         if [ "$?" != "0" ]; then
141                 echo "ERROR: Failed to create or check temp files directory $tempdir"
142                 echo ""
143                 exit 2
144         fi
145
146         # Get old os name and version
147         os_type=`grep "^os_type=" $config_dir/config | sed -e 's/os_type=//g'`
148         os_version=`grep "^os_version=" $config_dir/config | sed -e 's/os_version=//g'`
149         real_os_type=`grep "^real_os_type=" $config_dir/config | sed -e 's/real_os_type=//g'`
150         real_os_version=`grep "^real_os_version=" $config_dir/config | sed -e 's/real_os_version=//g'`
151
152         # Get old root, host, port, ssl and boot flag
153         oldwadir=`grep "^root=" $config_dir/miniserv.conf | sed -e 's/root=//g'`
154         port=`grep "^port=" $config_dir/miniserv.conf | sed -e 's/port=//g'`
155         ssl=`grep "^ssl=" $config_dir/miniserv.conf | sed -e 's/ssl=//g'`
156         atboot=`grep "^atboot=" $config_dir/miniserv.conf | sed -e 's/atboot=//g'`
157         inetd=`grep "^inetd=" $config_dir/miniserv.conf | sed -e 's/inetd=//g'`
158
159         if [ "$inetd" != "1" ]; then
160                 # Stop old version
161                 $config_dir/stop >/dev/null 2>&1
162         fi
163
164         # Copy files to target directory
165         if [ "$wadir" != "$srcdir" ]; then
166                 echo "Copying files to $wadir .."
167                 (cd "$srcdir" ; tar cf - . | (cd "$wadir" ; tar xf -))
168                 echo "..done"
169                 echo ""
170         fi
171
172         # Update ACLs
173         $perl "$wadir/newmods.pl" $config_dir $allmods
174
175         # Update miniserv.conf with new root directory and mime types file
176         grep -v "^root=" $config_dir/miniserv.conf | grep -v "^mimetypes=" | grep -v "^server=" >$tempdir/$$.miniserv.conf
177         if [ $? != "0" ]; then exit 1; fi
178         mv $tempdir/$$.miniserv.conf $config_dir/miniserv.conf
179         echo "root=$wadir" >> $config_dir/miniserv.conf
180         echo "mimetypes=$wadir/mime.types" >> $config_dir/miniserv.conf
181         echo "server=MiniServ/$ver" >> $config_dir/miniserv.conf
182         grep logout= $config_dir/miniserv.conf >/dev/null
183         if [ $? != "0" ]; then
184                 echo "logout=$config_dir/logout-flag" >> $config_dir/miniserv.conf
185         fi
186         
187         # Check for third-party modules in old version
188         if [ "$wadir" != "$oldwadir" ]; then
189                 echo "Checking for third-party modules .."
190                 if [ "$webmin_upgrade" != "" ]; then
191                         autothird=1
192                 fi
193                 $perl "$wadir/thirdparty.pl" "$wadir" "$oldwadir" $autothird
194                 echo "..done"
195                 echo ""
196         fi
197
198         # Remove old cache of module infos
199         rm -f $config_dir/module.infos.cache
200 else
201         # Config directory exists .. make sure it is not in use
202         ls $config_dir | grep -v rpmsave >/dev/null 2>&1
203         if [ "$?" = "0" -a "$config_dir" != "/etc/webmin" ]; then
204                 echo "ERROR: Config directory $config_dir is not empty"
205                 echo ""
206                 exit 2
207         fi
208
209         # Ask for log directory
210         printf "Log file directory [/var/webmin]: "
211         if [ "$var_dir" = "" ]; then
212                 read var_dir
213         fi
214         if [ "$var_dir" = "" ]; then
215                 var_dir=/var/webmin
216         fi
217         abspath=`echo $var_dir | grep "^/"`
218         if [ "$abspath" = "" ]; then
219                 echo "Log file directory must be an absolute path"
220                 echo ""
221                 exit 3
222         fi
223         if [ "$var_dir" = "/" ]; then
224                 echo "Log directory cannot be /"
225                 exit ""
226                 exit 3
227         fi
228         if [ ! -d $var_dir ]; then
229                 mkdir $var_dir
230                 if [ $? != 0 ]; then
231                         echo "ERROR: Failed to create directory $var_dir"
232                         echo ""
233                         exit 3
234                 fi
235         fi
236         echo ""
237
238         # Ask where perl is installed
239         echo "***********************************************************************"
240         echo "Webmin is written entirely in Perl. Please enter the full path to the"
241         echo "Perl 5 interpreter on your system."
242         echo ""
243         if [ -x /usr/bin/perl ]; then
244                 perldef=/usr/bin/perl
245         elif [ -x /usr/local/bin/perl ]; then
246                 perldef=/usr/local/bin/perl
247         else
248                 perldef=""
249         fi
250         if [ "$perl" = "" ]; then
251                 if [ "$perldef" = "" ]; then
252                         printf "Full path to perl: "
253                         read perl
254                         if [ "$perl" = "" ]; then
255                                 echo "ERROR: No path entered!"
256                                 echo ""
257                                 exit 4
258                         fi
259                 else
260                         printf "Full path to perl (default $perldef): "
261                         read perl
262                         if [ "$perl" = "" ]; then
263                                 perl=$perldef
264                         fi
265                 fi
266         fi
267         echo ""
268
269         # Test perl 
270         echo "Testing Perl ..."
271         if [ ! -x $perl ]; then
272                 echo "ERROR: Failed to find perl at $perl"
273                 echo ""
274                 exit 5
275         fi
276         $perl -e 'print "foobar\n"' 2>/dev/null | grep foobar >/dev/null
277         if [ $? != "0" ]; then
278                 echo "ERROR: Failed to run test perl script. Maybe $perl is"
279                 echo "not the perl interpreter, or is not installed properly"
280                 echo ""
281                 exit 6
282         fi
283         $perl -e 'exit ($] < 5.002 ? 1 : 0)'
284         if [ $? = "1" ]; then
285                 echo "ERROR: Detected old perl version. Webmin requires"
286                 echo "perl 5.002 or better to run"
287                 echo ""
288                 exit 7
289         fi
290         $perl -e 'use Socket; print "foobar\n"' 2>/dev/null | grep foobar >/dev/null
291         if [ $? != "0" ]; then
292                 echo "ERROR: Perl Socket module not installed. Maybe Perl has"
293                 echo "not been properly installed on your system"
294                 echo ""
295                 exit 8
296         fi
297         $perl -e '$c = crypt("xx", "yy"); exit($c ? 0 : 1)'
298         if [ $? != "0" ]; then
299                 $perl -e 'use Crypt::UnixCrypt' >/dev/null 2>&1
300         fi
301         if [ $? != "0" ]; then
302                 echo "ERROR: Perl crypt function does not work. Maybe Perl has"
303                 echo "not been properly installed on your system"
304                 echo ""
305                 exit 8
306         fi
307         echo "Perl seems to be installed ok"
308         echo ""
309
310         # Create temp files directory
311         $perl "$srcdir/maketemp.pl"
312         if [ "$?" != "0" ]; then
313                 echo "ERROR: Failed to create or check temp files directory $tempdir"
314                 echo ""
315                 exit 2
316         fi
317
318         # Ask for operating system type
319         echo "***********************************************************************"
320         if [ "$os_type" = "" ]; then
321                 if [ "$autoos" = "" ]; then
322                         autoos=2
323                 fi
324                 $perl "$srcdir/oschooser.pl" "$srcdir/os_list.txt" $tempdir/$$.os $autoos
325                 if [ $? != 0 ]; then
326                         exit $?
327                 fi
328                 . $tempdir/$$.os
329                 rm -f $tempdir/$$.os
330         fi
331         echo "Operating system name:    $real_os_type"
332         echo "Operating system version: $real_os_version"
333         echo ""
334
335         # Ask for web server port, name and password
336         echo "***********************************************************************"
337         echo "Webmin uses its own password protected web server to provide access"
338         echo "to the administration programs. The setup script needs to know :"
339         echo " - What port to run the web server on. There must not be another"
340         echo "   web server already using this port."
341         echo " - The login name required to access the web server."
342         echo " - The password required to access the web server."
343         echo " - If the webserver should use SSL (if your system supports it)."
344         echo " - Whether to start webmin at boot time."
345         echo ""
346         printf "Web server port (default 10000): "
347         if [ "$port" = "" ]; then
348                 read port
349                 if [ "$port" = "" ]; then
350                         port=10000
351                 fi
352         fi
353         if [ $port -lt 1 ]; then
354                 echo "ERROR: $port is not a valid port number"
355                 echo ""
356                 exit 11
357         fi
358         if [ $port -gt 65535 ]; then
359                 echo "ERROR: $port is not a valid port number. Port numbers cannot be"
360                 echo "       greater than 65535"
361                 echo ""
362                 exit 12
363         fi
364         $perl -e 'use Socket; socket(FOO, PF_INET, SOCK_STREAM, getprotobyname("tcp")); setsockopt(FOO, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)); bind(FOO, pack_sockaddr_in($ARGV[0], INADDR_ANY)) || exit(1); exit(0);' $port
365         if [ $? != "0" ]; then
366                 echo "ERROR: TCP port $port is already in use by another program"
367                 echo ""
368                 exit 13
369         fi
370         printf "Login name (default admin): "
371         if [ "$login" = "" ]; then
372                 read login
373                 if [ "$login" = "" ]; then
374                         login="admin"
375                 fi
376         fi
377         echo "$login" | grep : >/dev/null
378         if [ "$?" = "0" ]; then
379                 echo "ERROR: Username contains a : character"
380                 echo ""
381                 exit 14
382         fi
383         echo $login | grep " " >/dev/null
384         if [ "$?" = "0" ]; then
385                 echo "ERROR: Username contains a space"
386                 echo ""
387                 exit 14
388         fi
389         if [ "$login" = "webmin" ]; then
390                 echo "ERROR: Username 'webmin' is reserved for internal use"
391                 echo ""
392                 exit 14
393         fi
394         printf "Login password: "
395         if [ "$password" = "" -a "$crypt" = "" ]; then
396                 stty -echo
397                 read password
398                 stty echo
399                 printf "\n"
400                 printf "Password again: "
401                 stty -echo
402                 read password2
403                 stty echo
404                 printf "\n"
405                 if [ "$password" != "$password2" ]; then
406                         echo "ERROR: Passwords don't match"
407                         echo ""
408                         exit 14
409                 fi
410                 echo $password | grep : >/dev/null
411                 if [ "$?" = "0" ]; then
412                         echo "ERROR: Password contains a : character"
413                         echo ""
414                         exit 14
415                 fi
416         fi
417
418         # Ask the user if SSL should be used
419         if [ "$ssl" = "" ]; then
420                 ssl=0
421                 $perl -e 'use Net::SSLeay' >/dev/null 2>/dev/null
422                 if [ $? = "0" ]; then
423                         printf "Use SSL (y/n): "
424                         read sslyn
425                         if [ "$sslyn" = "y" -o "$sslyn" = "Y" ]; then
426                                 ssl=1
427                         fi
428                 else
429                         echo "The Perl SSLeay library is not installed. SSL not available."
430                         rm -f core
431                 fi
432         fi
433
434         # Don't use SSL if missing Net::SSLeay
435         if [ "$ssl" = "1" ]; then
436                 $perl -e 'use Net::SSLeay' >/dev/null 2>/dev/null
437                 if [ $? != "0" ]; then
438                         ssl=0
439                 fi
440         fi
441
442         # Ask whether to run at boot time
443         if [ "$atboot" = "" ]; then
444                 initsupp=`grep "^os_support=" "$srcdir/init/module.info" | sed -e 's/os_support=//g' | grep $os_type`
445                 atboot=0
446                 if [ "$initsupp" != "" ]; then
447                         printf "Start Webmin at boot time (y/n): "
448                         read atbootyn
449                         if [ "$atbootyn" = "y" -o "$atbootyn" = "Y" ]; then
450                                 atboot=1
451                         fi
452                 else
453                         echo "Webmin does not support being started at boot time on your system."
454                 fi
455         fi
456
457         # Copy files to target directory
458         echo "***********************************************************************"
459         if [ "$wadir" != "$srcdir" ]; then
460                 echo "Copying files to $wadir .."
461                 (cd "$srcdir" ; tar cf - . | (cd "$wadir" ; tar xf -))
462                 echo "..done"
463                 echo ""
464         fi
465
466         # Create webserver config file
467         echo $perl > $config_dir/perl-path
468         echo $var_dir > $config_dir/var-path
469         echo "Creating web server config files.."
470         cfile=$config_dir/miniserv.conf
471         echo "port=$port" >> $cfile
472         echo "root=$wadir" >> $cfile
473         echo "mimetypes=$wadir/mime.types" >> $cfile
474         echo "addtype_cgi=internal/cgi" >> $cfile
475         echo "realm=Webmin Server" >> $cfile
476         echo "logfile=$var_dir/miniserv.log" >> $cfile
477         echo "errorlog=$var_dir/miniserv.error" >> $cfile
478         echo "pidfile=$var_dir/miniserv.pid" >> $cfile
479         echo "logtime=168" >> $cfile
480         echo "ppath=$ppath" >> $cfile
481         echo "ssl=$ssl" >> $cfile
482         echo "env_WEBMIN_CONFIG=$config_dir" >> $cfile
483         echo "env_WEBMIN_VAR=$var_dir" >> $cfile
484         echo "atboot=$atboot" >> $cfile
485         echo "logout=$config_dir/logout-flag" >> $cfile
486         if [ "$listen" != "" ]; then
487                 echo "listen=$listen" >> $cfile
488         else
489                 echo "listen=10000" >> $cfile
490         fi
491         echo "denyfile=\\.pl\$" >> $cfile
492         echo "log=1" >> $cfile
493         echo "blockhost_failures=5" >> $cfile
494         echo "blockhost_time=60" >> $cfile
495         echo "syslog=1" >> $cfile
496         if [ "$allow" != "" ]; then
497                 echo "allow=$allow" >> $cfile
498         fi
499         if [ "$session" != "" ]; then
500                 echo "session=$session" >> $cfile
501         else
502                 echo "session=1" >> $cfile
503         fi
504         if [ "$pam" != "" ]; then
505                 echo "pam=$pam" >> $cfile
506         fi
507         echo premodules=WebminCore >> $cfile
508         echo "server=MiniServ/$ver" >> $cfile
509
510         # Append package-specific info to config file
511         if [ -r "$wadir/miniserv-conf" ]; then
512                 cat "$wadir/miniserv-conf" >>$cfile
513         fi
514
515         md5pass=`$perl -e 'print crypt("test", "\\$1\\$A9wB3O18\\$zaZgqrEmb9VNltWTL454R/") eq "\\$1\\$A9wB3O18\\$zaZgqrEmb9VNltWTL454R/" ? "1\n" : "0\n"'`
516
517         ufile=$config_dir/miniserv.users
518         if [ "$crypt" != "" ]; then
519                 echo "$login:$crypt:0" > $ufile
520         else
521                 if [ "$md5pass" = "1" ]; then
522                         $perl -e 'print "$ARGV[0]:",crypt($ARGV[1], "\$1\$XXXXXXXX"),":0\n"' "$login" "$password" > $ufile
523                 else
524                         $perl -e 'print "$ARGV[0]:",crypt($ARGV[1], "XX"),":0\n"' "$login" "$password" > $ufile
525                 fi
526         fi
527         chmod 600 $ufile
528         echo "userfile=$ufile" >> $cfile
529
530         kfile=$config_dir/miniserv.pem
531         openssl version >/dev/null 2>&1
532         if [ "$?" = "0" ]; then
533                 # We can generate a new SSL key for this host
534                 host=`hostname`
535                 openssl req -newkey rsa:512 -x509 -nodes -out $tempdir/cert -keyout $tempdir/key -days 1825 >/dev/null 2>&1 <<EOF
536 .
537 .
538 .
539 Webmin Webserver on $host
540 .
541 *
542 root@$host
543 EOF
544                 if [ "$?" = "0" ]; then
545                         cat $tempdir/cert $tempdir/key >$kfile
546                 fi
547                 rm -f $tempdir/cert $tempdir/key
548         fi
549         if [ ! -r $kfile ]; then
550                 # Fall back to the built-in key
551                 cp "$wadir/miniserv.pem" $kfile
552         fi
553         chmod 600 $kfile
554         echo "keyfile=$config_dir/miniserv.pem" >> $cfile
555
556         chmod 600 $cfile
557         echo "..done"
558         echo ""
559
560         echo "Creating access control file.."
561         afile=$config_dir/webmin.acl
562         rm -f $afile
563         if [ "$defaultmods" = "" ]; then
564                 echo "$login: $allmods" >> $afile
565         else
566                 echo "$login: $defaultmods" >> $afile
567         fi
568         chmod 600 $afile
569         echo "..done"
570         echo ""
571
572         if [ "$login" != "root" -a "$login" != "admin" ]; then
573                 # Allow use of RPC by this user
574                 echo rpc=1 >>$config_dir/$login.acl
575         fi
576 fi
577
578 if [ "$noperlpath" = "" ]; then
579         echo "Inserting path to perl into scripts.."
580         (find "$wadir" -name '*.cgi' -print ; find "$wadir" -name '*.pl' -print) | $perl "$wadir/perlpath.pl" $perl -
581         echo "..done"
582         echo ""
583 fi
584
585 echo "Creating start and stop scripts.."
586 rm -f $config_dir/stop $config_dir/start $config_dir/restart $config_dir/reload
587 echo "#!/bin/sh" >>$config_dir/start
588 echo "echo Starting Webmin server in $wadir" >>$config_dir/start
589 echo "trap '' 1" >>$config_dir/start
590 echo "LANG=" >>$config_dir/start
591 echo "export LANG" >>$config_dir/start
592 echo "#PERLIO=:raw" >>$config_dir/start
593 echo "unset PERLIO" >>$config_dir/start
594 echo "export PERLIO" >>$config_dir/start
595 echo "PERLLIB=$PERLLIB" >>$config_dir/start
596 echo "export PERLLIB" >>$config_dir/start
597 uname -a | grep -i 'HP/*UX' >/dev/null
598 if [ $? = "0" ]; then
599         echo "exec '$wadir/miniserv.pl' $config_dir/miniserv.conf &" >>$config_dir/start
600 else
601         echo "exec '$wadir/miniserv.pl' $config_dir/miniserv.conf" >>$config_dir/start
602 fi
603
604 echo "#!/bin/sh" >>$config_dir/stop
605 echo "echo Stopping Webmin server in $wadir" >>$config_dir/stop
606 echo "pidfile=\`grep \"^pidfile=\" $config_dir/miniserv.conf | sed -e 's/pidfile=//g'\`" >>$config_dir/stop
607 echo "kill \`cat \$pidfile\`" >>$config_dir/stop
608
609 echo "#!/bin/sh" >>$config_dir/restart
610 echo "$config_dir/stop && $config_dir/start" >>$config_dir/restart
611
612 echo "#!/bin/sh" >>$config_dir/reload
613 echo "echo Reloading Webmin server in $wadir" >>$config_dir/reload
614 echo "pidfile=\`grep \"^pidfile=\" $config_dir/miniserv.conf | sed -e 's/pidfile=//g'\`" >>$config_dir/reload
615 echo "kill -USR1 \`cat \$pidfile\`" >>$config_dir/reload
616
617 chmod 755 $config_dir/start $config_dir/stop $config_dir/restart $config_dir/reload
618 echo "..done"
619 echo ""
620
621 if [ "$upgrading" = 1 ]; then
622         echo "Updating config files.."
623 else
624         echo "Copying config files.."
625 fi
626 newmods=`$perl "$wadir/copyconfig.pl" "$os_type/$real_os_type" "$os_version/$real_os_version" "$wadir" $config_dir "" $allmods`
627 if [ "$upgrading" != 1 ]; then
628         # Store the OS and version
629         echo "os_type=$os_type" >> $config_dir/config
630         echo "os_version=$os_version" >> $config_dir/config
631         echo "real_os_type=$real_os_type" >> $config_dir/config
632         echo "real_os_version=$real_os_version" >> $config_dir/config
633         if [ -r /etc/system.cnf ]; then
634                 # Found a caldera system config file .. get the language
635                 source /etc/system.cnf
636                 if [ "$CONF_LST_LANG" = "us" ]; then
637                         CONF_LST_LANG=en
638                 elif [ "$CONF_LST_LANG" = "uk" ]; then
639                         CONF_LST_LANG=en
640                 fi
641                 grep "lang=$CONF_LST_LANG," "$wadir/lang_list.txt" >/dev/null 2>&1
642                 if [ "$?" = 0 ]; then
643                         echo "lang=$CONF_LST_LANG" >> $config_dir/config
644                 fi
645         fi
646
647         # Turn on logging by default
648         echo "log=1" >> $config_dir/config
649
650         # Use licence module specified by environment variable
651         if [ "$licence_module" != "" ]; then
652                 echo licence_module=$licence_module >>$config_dir/config
653         fi
654
655         # Disallow unknown referers by default
656         echo "referers_none=1" >>$config_dir/config
657 else
658         # one-off hack to set log variable in config from miniserv.conf
659         grep log= $config_dir/config >/dev/null
660         if [ "$?" = "1" ]; then
661                 grep log= $config_dir/miniserv.conf >> $config_dir/config
662                 grep logtime= $config_dir/miniserv.conf >> $config_dir/config
663                 grep logclear= $config_dir/miniserv.conf >> $config_dir/config
664         fi
665
666         # Disallow unknown referers if not set
667         grep referers_none= $config_dir/config >/dev/null
668         if [ "$?" != "0" ]; then
669                 echo "referers_none=1" >>$config_dir/config
670         fi
671 fi
672 echo $ver > $config_dir/version
673 echo "..done"
674 echo ""
675
676 # Set passwd_ fields in miniserv.conf from global config
677 for field in passwd_file passwd_uindex passwd_pindex passwd_cindex passwd_mindex; do
678         grep $field= $config_dir/miniserv.conf >/dev/null
679         if [ "$?" != "0" ]; then
680                 grep $field= $config_dir/config >> $config_dir/miniserv.conf
681         fi
682 done
683 grep passwd_mode= $config_dir/miniserv.conf >/dev/null
684 if [ "$?" != "0" ]; then
685         echo passwd_mode=0 >> $config_dir/miniserv.conf
686 fi
687
688 # If Perl crypt supports MD5, then make it the default
689 if [ "$md5pass" = "1" ]; then
690         echo md5pass=1 >> $config_dir/config
691 fi
692
693 # Set a special theme if none was set before
694 if [ "$theme" = "" ]; then
695         theme=`cat "$wadir/defaulttheme" 2>/dev/null`
696 fi
697 oldthemeline=`grep "^theme=" $config_dir/config`
698 oldtheme=`echo $oldthemeline | sed -e 's/theme=//g'`
699 if [ "$theme" != "" ] && [ "$oldthemeline" = "" ] && [ -d "$wadir/$theme" ]; then
700         themelist=$theme
701 fi
702
703 # Set a special overlay if none was set before
704 if [ "$overlay" = "" ]; then
705         overlay=`cat "$wadir/defaultoverlay" 2>/dev/null`
706 fi
707 if [ "$overlay" != "" ] && [ "$theme" != "" ] && [ -d "$wadir/$overlay" ]; then
708         themelist="$themelist $overlay"
709 fi
710
711 # Apply the theme and maybe overlay
712 if [ "$themelist" != "" ]; then
713         echo "theme=$themelist" >> $config_dir/config
714         echo "preroot=$themelist" >> $config_dir/miniserv.conf
715 fi
716
717 # Set the product field in the global config
718 grep product= $config_dir/config >/dev/null
719 if [ "$?" != "0" ]; then
720         echo product=webmin >> $config_dir/config
721 fi
722
723 if [ "$makeboot" = "1" ]; then
724         echo "Configuring Webmin to start at boot time.."
725         (cd "$wadir/init" ; WEBMIN_CONFIG=$config_dir WEBMIN_VAR=$var_dir "$wadir/init/atboot.pl" $bootscript)
726         echo "..done"
727         echo ""
728 fi
729
730 # If password delays are not specifically disabled, enable them
731 grep passdelay= $config_dir/miniserv.conf >/dev/null
732 if [ "$?" != "0" ]; then
733         echo passdelay=1 >> $config_dir/miniserv.conf
734 fi
735
736 if [ "$nouninstall" = "" ]; then
737         echo "Creating uninstall script $config_dir/uninstall.sh .."
738         cat >$config_dir/uninstall.sh <<EOF
739 #!/bin/sh
740 printf "Are you sure you want to uninstall Webmin? (y/n) : "
741 read answer
742 printf "\n"
743 if [ "\$answer" = "y" ]; then
744         $config_dir/stop
745         echo "Running uninstall scripts .."
746         (cd "$wadir" ; WEBMIN_CONFIG=$config_dir WEBMIN_VAR=$var_dir LANG= "$wadir/run-uninstalls.pl")
747         echo "Deleting $wadir .."
748         rm -rf "$wadir"
749         echo "Deleting $config_dir .."
750         rm -rf "$config_dir"
751         echo "Done!"
752 fi
753 EOF
754         chmod +x $config_dir/uninstall.sh
755         echo "..done"
756         echo ""
757 fi
758
759 echo "Changing ownership and permissions .."
760 # Make all config dirs non-world-readable
761 for m in $newmods; do
762         chown -R root $config_dir/$m
763         chgrp -R bin $config_dir/$m
764         chmod -R og-rw $config_dir/$m
765 done
766 # Make miniserv config files non-world-readable
767 for f in miniserv.conf miniserv.pem miniserv.users; do
768         chown -R root $config_dir/$f
769         chgrp -R bin $config_dir/$f
770         chmod -R og-rw $config_dir/$f
771 done
772 chmod +r $config_dir/version
773 if [ "$nochown" = "" ]; then
774         # Make program directory non-world-writable, but executable
775         chown -R root "$wadir"
776         chgrp -R bin "$wadir"
777         chmod -R og-w "$wadir"
778         chmod -R a+rx "$wadir"
779 fi
780 if [ $var_dir != "/var" ]; then
781         # Make log directory non-world-readable or writable
782         chown -R root $var_dir
783         chgrp -R bin $var_dir
784         chmod -R og-rwx $var_dir
785 fi
786 # Fix up bad permissions from some older installs
787 for m in ldap-client ldap-server ldap-useradmin mailboxes mysql postgresql servers virtual-server; do
788         if [ -d "$config_dir/$m" ]; then
789                 chown root $config_dir/$m
790                 chgrp bin $config_dir/$m
791                 chmod og-rw $config_dir/$m
792                 chmod og-rw $config_dir/$m/config 2>/dev/null
793         fi
794 done
795 echo "..done"
796 echo ""
797
798 # Save target directory if one was specified
799 if [ "$wadir" != "$srcdir" ]; then
800         echo $wadir >$config_dir/install-dir
801 else
802         rm -f $config_dir/install-dir
803 fi
804
805 if [ "$nopostinstall" = "" ]; then
806         echo "Running postinstall scripts .."
807         (cd "$wadir" ; WEBMIN_CONFIG=$config_dir WEBMIN_VAR=$var_dir "$wadir/run-postinstalls.pl")
808         echo "..done"
809         echo ""
810 fi
811
812 # Enable background collection
813 if [ "$upgrading" != 1 -a -r $config_dir/system-status/enable-collection.pl ]; then
814         echo "Enabling background status collection .."
815         $config_dir/system-status/enable-collection.pl 5
816         echo "..done"
817         echo ""
818 fi
819
820 # Run package-defined post-install script
821 if [ -r "$srcdir/setup-post.sh" ]; then
822         . "$srcdir/setup-post.sh"
823 fi
824
825 if [ "$nostart" = "" ]; then
826         if [ "$inetd" != "1" ]; then
827                 echo "Attempting to start Webmin mini web server.."
828                 $config_dir/start
829                 if [ $? != "0" ]; then
830                         echo "ERROR: Failed to start web server!"
831                         echo ""
832                         exit 14
833                 fi
834                 echo "..done"
835                 echo ""
836         fi
837
838         echo "***********************************************************************"
839         echo "Webmin has been installed and started successfully. Use your web"
840         echo "browser to go to"
841         echo ""
842         host=`hostname`
843         if [ "$ssl" = "1" ]; then
844                 echo "  https://$host:$port/"
845         else
846                 echo "  http://$host:$port/"
847         fi
848         echo ""
849         echo "and login with the name and password you entered previously."
850         echo ""
851         if [ "$ssl" = "1" ]; then
852                 echo "Because Webmin uses SSL for encryption only, the certificate"
853                 echo "it uses is not signed by one of the recognized CAs such as"
854                 echo "Verisign. When you first connect to the Webmin server, your"
855                 echo "browser will ask you if you want to accept the certificate"
856                 echo "presented, as it does not recognize the CA. Say yes."
857                 echo ""
858         fi
859 fi
860
861 if [ "$oldwadir" != "$wadir" -a "$upgrading" = 1 -a "$deletedold" != 1 ]; then
862         echo "The directory from the previous version of Webmin"
863         echo "   $oldwadir"
864         echo "Can now be safely deleted to free up disk space, assuming"
865         echo "that all third-party modules have been copied to the new"
866         echo "version."
867         echo ""
868 fi
869
870