diff options
-rw-r--r-- | nisautofs_wizard/Makefile | 8 | ||||
-rw-r--r-- | nisautofs_wizard/Nisautofs.pm | 342 |
2 files changed, 350 insertions, 0 deletions
diff --git a/nisautofs_wizard/Makefile b/nisautofs_wizard/Makefile new file mode 100644 index 00000000..9fc46808 --- /dev/null +++ b/nisautofs_wizard/Makefile @@ -0,0 +1,8 @@ +install2: + su -c 'make install' + +install: + mkdir -p --mode=u=rwx,g=rx,o=rx ${prefix}/share/wizards/nisautofs_wizard/images + mkdir -p --mode=u=rwx,g=rx,o=rx ${prefix}/$(PERL_VENDORLIB)/MDK/Wizard + install --mode=u=rw,g=r,o=r -p *.pm ${prefix}/$(PERL_VENDORLIB)/MDK/Wizard/ + install --mode=a=r -p ./images/*.png ${prefix}/share/wizards/nisautofs_wizard/images diff --git a/nisautofs_wizard/Nisautofs.pm b/nisautofs_wizard/Nisautofs.pm new file mode 100644 index 00000000..f3d3c172 --- /dev/null +++ b/nisautofs_wizard/Nisautofs.pm @@ -0,0 +1,342 @@ +# version 0.2 +# +# Copyright (C) 2002,2003 Mandrakesoft +# +# Author: aginies _at_ mandrakesoft.com +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +package MDK::Wizard::nisautofs; +use lib qw(/usr/lib/libDrakX); +use ugtk2; +use strict; +use standalone; +use common; +use services; +use MDK::Wizard::Varspaceval; +use MDK::Wizard::Wizcommon; + + +# test root capa +my $wiz = new MDK::Wizard::Wizcommon; + +my $NISDOMAIN = $wiz->{net}->network_get("NISDOMAIN"); +my @HOST = split('\.', $wiz->{net}->network_get("HOSTNAME")); +my $HOST = @HOST[0]; # just need basename and not full qualified computer hostname (with domainaname) +my $NIS_DIRMAKEFILE = "/var/yp/"; +my $HOMENIS = "/home/nis"; +my $NETWORKFILE = "/etc/sysconfig/network"; +my $NFSEXPORTS = "/etc/exports"; +my $AUTOMASTER = "/etc/auto.master"; +my $AUTOHOME = "/etc/auto.home"; +my $YPCONF = "/etc/yp.conf"; + +my $o = { + name => 'LDAP Configuration Wizard', + var => { + NISDOMAIN => chomp_($NISDOMAIN), + NISSERVER => chomp_($HOST), + NIS_DIRMAKEFILE => "/var/yp/", + HOMENIS => "/home/nis", + NETWORKFILE => "/etc/sysconfg/network", + NFSEXPORTS => "/etc/exports", + AUTOMASTER => "/etc/auto.master", + AUTOHOME => "/etc/auto.home", + }, + needed_rpm => [ 'ypbind', 'nfs-utils', 'yp-tools', 'nfs-utils-clients' ], + defaultimage => "/usr/share/wizards/dns_wizard/images/NIS.png" + }; + +my %level = ( + 1 => N("Nis Server - Setup configuration NIS + Autofs(nfs) server"), + 2 => N("Nis Client - Setup a Nis Client"), + ); + +$o->{pages} = { + welcome => { + name => N("NIS+autofs configuration wizard") . "\n\n" . N('Setup a nis+autofs.'), + no_back => 1, + pre => sub { $o->{var}{wiz_level} ||= 1; }, + post => sub { if ($o->{var}{wiz_level} == 2) { + return 'nis_client' + } + }, + data => [ + { label => N("Wich operation on Wizard:"), val => \$o->{var}{wiz_level}, list => [ keys %level ], format => sub { $level{$_[0]} } }, + ], + next => 'nis_server', + }, + nis_client => { + name => N("Be a nis client") . "\n\n" . N("You just have to put nisdomain and nisserver"), + data => [ + { label => N("Nis Server:"), val => \$o->{var}{NISSERVER} }, + { label => N("Nis Domain:"), val => \$o->{var}{NISDOMAIN} }, + ], + next => 'summaryclient', + }, + nis_server => { + name => N('Nis+autofs') . "\n\n" . N(''), + data => [ + { label => N("Nis server:"), val => $HOST }, + { label => N("Home nis:"), val => \$o->{var}{HOMENIS} }, + { label => N("Nis directory Makefile:"), val => \$o->{var}{NIS_DIRMAKEFILE} }, + { label => N("Nis Domain:"), val => \$o->{var}{NISDOMAIN} }, + ], + post => \&test_set, + next => 'summaryserver', + }, + summaryserver => { + name => N('Will set your NIS + Autofs server with this configuration:'), + data => [ + { label => N("Nis server:"), fixed_val => \$HOST }, + { label => N("Home nis:"), fixed_val => \$o->{var}{HOMENIS} }, + { label => N("Nis Domain:"), fixed_val => \$o->{var}{NISDOMAIN} }, + { label => N("Nis directory Makefile:"), fixed_val => \$o->{var}{NIS_DIRMAKEFILE} }, + { label => N("Network File:"), fixed_val => \$o->{var}{NETWORKFILE}}, + { label => N("Nfs exports:"), fixed_val => \$o->{var}{NFSEXPORTS} }, + { label => N("Auto master:"), fixed_val => \$o->{var}{AUTOMASTER} }, + { label => N("Auto home:"), fixed_val => \$o->{var}{AUTOHOME} }, + ], + post => \&do_it_server, + next => 'endserver', + }, + summaryclient => { + name => N('Will set your machine has a NIS client with this configuration:'), + data => [ + { label => N("Nis Server:"), fixed_val => \$o->{var}{NISSERVER} }, + { label => N("Nis Domain:"), fixed_val => \$o->{var}{NISDOMAIN} }, + ], + post => \&do_it_client, + next => 'endclient', + }, + error_homedir => { + name => N('Error Should be a directory'), + next => 'nis_server', + }, + error_nisd => { + name => N('Error nisdomainame Should be correct (not none or localdomain)') . "\n\n" . N('Please adjust with domainname command or in /etc/sysconfig/network file (NISDOMAIN=yournisdomain)'), + end => 1, + next => 0, + }, + endclient => { + name => N('Congratulations'), + data => [ { label => N('The wizard successfully configured Your machine to be a nis client.') } ], + no_back => 1, + end => 1, + next => 0 + }, + endserver => { + name => N('Congratulations'), + data => [ { label => N('The wizard successfully configured Your machine to be a nis+autofs Server.') } ], + no_back => 1, + end => 1, + next => 0 + }, + }; + + +sub test_set { + if (member($o->{var}{NISDOMAIN}, qw(localdomain (none)))) { return 'error_nisd'; } + !-d $o->{var}{HOMENIS} or return 'error_dir'; + !-d $o->{var}{NIS_DIRMAKEFILE} or return 'error_dir'; +} +# update /etc/sysconfig/network +sub update_network { + save_config($NETWORKFILE); + if (any { /NISDOMAIN/ } cat_($NETWORKFILE)) { + substInFile { s/NISDOMAIN.*/NISDOMAIN=$o->{var}{NISDOMAIN}/g } $NETWORKFILE; + } else { + append_to_file($NETWORKFILE, "NISDOMAIN=$o->{var}{NISDOMAIN}\n"); + } +} + +# Setting nisdomainname +sub set_nisdomain { + system("nisdomainname $o->{var}{NISDOMAIN}"); +} + + +sub nfs_home_nis { + # test directory + if (-d $HOMENIS) { + print " - $HOMENIS directory exist\n"; + } else { + print " - Creating $HOMENIS directory\n"; + mkdir_p($HOMENIS); + } + + # check nis home + if (any { /$HOMENIS/ } cat_($NFSEXPORTS)) { + print " - " . $NFSEXPORTS . " ready\n"; + } else { + print " - Adjusting " . $NFSEXPORTS . "\n"; + append_to_file($NFSEXPORTS, "$HOMENIS *(async,rw,no_root_squash)\n"); + } +} + +# configure /etc/auto.* +sub configure_auto { + save_config($AUTOMASTER); + my $nisserver = chomp_($o->{var}{NISSERVER}); + output($AUTOMASTER, <<EOF); +$HOMENIS auto.home --timeout=60 +EOF + + save_config($AUTOHOME); + output($AUTOHOME, <<EOF); +* -rw,nfs,soft,intr,nosuid,rsize=8192,wsize=8192 $nisserver:$HOMENIS/& +EOF +} + +sub adjust_makefile { +# Makefile parameter + print " - Updating " . $NIS_DIRMAKEFILE . " to add autofs\n"; + mkdir_p('/etc/mail'); + system('touch /etc/mail/aliases'); + substInFile { + s!^ALIASES!#ALIASES=/etc/aliases!g; + s/^all.*/all: passwd group hosts rpc services netid protocols auto.master auto.home/g; + } $NIS_DIRMAKEFILE . '/Makefile'; +} + +# create yp base +sub make_yp { + system("make -C $NIS_DIRMAKEFILE"); +} + +sub needed_service { + my ($service) = @_; + if (services::is_service_running($service)) { + services::restart($service) + } else { services::start($service) } +} + +sub get_nis_users { + my @unwanted = qw(install maui nobody mpi); + my @users; + open(PASS, "ypcat passwd|") || die " cant exec ypcat passwd!"; + while(<PASS>) { + my ($login) = split(':'); + if (!member($login, @unwanted)) { + push(@users, $login); + } + } + close(PASS); + [ @users ]; +} + +sub update_yp { + my ($nd, $yps) = @_; + save_config($YPCONF); + output($YPCONF, <<EOF); +# /etc/yp.conf - ypbind configuration file +# domain NISDOMAIN server HOSTNAME +# Use server HOSTNAME for the domain NISDOMAIN. +#domain NISDOMAIN broadcast +# Use broadcast on the local net for domain NISDOMAIN +# +#ypserver HOSTNAME +# Use server HOSTNAME for the local domain. The +# IP-address of server must be listed in /etc/hosts. +# +domain $nd server $yps +EOF +} + +sub test_autofile { + map { if (-e $_) { rm_rf($_) } ; $_} $AUTOHOME, $AUTOMASTER; +} + +sub save_config { + my ($old) = @_; + my $DATE = chomp_(`date +%d-%m-20%y`); + if (-f $old) { + cp_af($old, $old . '.' . $DATE); + } + return($old . '.' . $DATE); +} + +sub update_network_nisdomain { + my ($nd) = @_; + my $nf = cluster_commonconf::system_network()->{NETWORKFILE}; + my %conf = getVarsFromSh($nf); + save_config($nf); + setVarsInSh($nf, { %conf, NISDOMAIN => $nd }); +} + +sub update_nsswitch { + substInFile { + s/automount:.*/automount: nis nisplus files/g; + s/hosts.*/hosts: dns nis files/; + } '/etc/nsswitch.conf'; +} + +sub uninstall_rpm { + my ($rpm) = @_; + system("urpme $rpm") if (system('/bin/rpm', '>/dev/null', '-q', $rpm)); +} + +sub do_it_server { + my $in = 'interactive'->vnew('su', 'nisautofsconfig'); + my $w = $in->wait_message(N("Nis+autofs Server"), N("Configuring your system as a Nis+Autofs(nfs) server ...")); +# system("urpme --auto autofs") if (system("/bin/rpm -q autofs >/dev/null")); + uninstall_rpm('autofs'); + system("urpmi --auto-select ypserv"); + needed_service('ypserv'); + # configure autofs to fit nis + configure_auto(); + # set correct nis + set_nisdomain(); + # create all make file needed + adjust_makefile(); + make_yp(); + # update client conf file (also on server) + update_yp(chomp_($o->{var}{NISDOMAIN}), chomp_($HOST)); + # update conf file + update_network(); + # update nsswitch.conf + update_nsswitch(); + # update nfs to fit nis + nfs_home_nis(); + # restart all needed services + map { needed_service($_); $_ } qw(ypserv nfs); + undef $w; +} + +sub do_it_client { + my $in = 'interactive'->vnew('su', 'nisautofsclient'); + my $w = $in->wait_message(N("Nis Client"), N("Configuring your system as Nis Client ...")); + uninstall_rpm('ypserv'); + system("urpmi --auto-select --auto autofs"); + test_autofile(); + # set correct nis + set_nisdomain(); + # update client conf file (also on server) + update_yp(chomp_($o->{var}{NISDOMAIN}), chomp_($o->{var}{NISSERVER})); + # update conf file + update_network(); + map { needed_service($_); $_ } qw(ypbind autofs); + undef $w; +} + +sub new { + my ($class, $conf) = @_; + bless { + o => $o, + }, $class; +} + +1; |