From b194b5de32adbdb0e09acb7a4418ef66339c134c Mon Sep 17 00:00:00 2001 From: Stew Benedict Date: Thu, 15 Jan 2004 14:32:13 +0000 Subject: First time wizard --- perl-install/standalone/drakTermServ | 470 ++++++++++++++++++++++++----------- 1 file changed, 322 insertions(+), 148 deletions(-) (limited to 'perl-install/standalone/drakTermServ') diff --git a/perl-install/standalone/drakTermServ b/perl-install/standalone/drakTermServ index c899c53ac..15cf0e0f8 100755 --- a/perl-install/standalone/drakTermServ +++ b/perl-install/standalone/drakTermServ @@ -60,6 +60,14 @@ my $window1; my $windows; my $status_box; my $main_box; +my $wizard_buttons; +my $previous_button; +my $cancel_button; +my $next_button; +my $main_buttons; +my $in_wizard = 0; +my $config_written = 0; +my $clients_set = 0; my $nfs_subnet; my $nfs_mask; @@ -123,6 +131,12 @@ if ("@ARGV" =~ /--deluser/) { exit(0); } +if ("@ARGV" =~ /--syncusers/) { + my $cmd_line = 1; + sync_users($cmd_line); + exit(0); +} + if ("@ARGV" =~ /--addclient/) { die N("%s: %s requires hostname, MAC address, IP, nbi-image, 0/1 for THIN_CLIENT, 0/1 for Local Config...\n", $0, $ARGV[0]) if $#ARGV < 6; my $cmd_line = 1; @@ -262,78 +276,84 @@ sub interactive_mode() { if_(!$::isEmbedded, 0, $darea), 1, gtkpack_(new Gtk2::HBox(0,2), 1, gtkpack_(new Gtk2::VBox(0,2), - 1, gtkpack($status_box = new Gtk2::VBox(0,5), - $main_box = new Gtk2::VBox(0,10), - ), - 1, gtkpack_(new Gtk2::HBox(0,2), - 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), - gtksignal_connect(new Gtk2::Button(N("Enable Server")), clicked => sub { - destroy_widget(); - $windows = 1; - cursor_wait(); - enable_ts(); - cursor_norm(); - }), - gtksignal_connect(new Gtk2::Button(N("Disable Server")), clicked => sub { - destroy_widget(); - cursor_wait(); - disable_ts(); - cursor_norm(); - }), - ), - 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), - gtksignal_connect(new Gtk2::Button(N("Start Server")), clicked => sub { - destroy_widget(); - $windows = 0; - cursor_wait(); - start_ts(); - cursor_norm(); - }), - gtksignal_connect(new Gtk2::Button(N("Stop Server")), clicked => sub { - destroy_widget(); - cursor_wait(); - stop_ts(); - cursor_norm(); - }), - ), - 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), - gtksignal_connect(new Gtk2::Button(N("Etherboot Floppy/ISO")), clicked => sub { - destroy_widget(); - $windows = 1; - make_boot(); - }), - gtksignal_connect(new Gtk2::Button(N("Net Boot Images")), clicked => sub { - destroy_widget(); - make_nbi(); - }), - ), - 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), - gtksignal_connect(new Gtk2::Button(N("Add/Del Users")), clicked => sub { - destroy_widget(); - $windows = 0; - maintain_users(); - }), - gtksignal_connect(new Gtk2::Button(N("Add/Del Clients")), clicked => sub { destroy_widget(); maintain_clients() }), - ), - 1, new Gtk2::HBox(0,2), - 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), - gtksignal_connect(new Gtk2::Button(N("Help")),clicked => sub { - destroy_widget(); - help(); - }), - gtksignal_connect(new Gtk2::Button(N("Close")), clicked => sub { - write_conf_file(); - if ($changes_made == 1) { - restart_server(); - } - Gtk2->main_quit; - }), - ), + 1, gtkpack($status_box = new Gtk2::VBox(0,5), + $main_box = new Gtk2::VBox(0,10), + ), + 0, $wizard_buttons = gtkpack_(new Gtk2::HBox(1,2)), + 1, gtkpack_($main_buttons = new Gtk2::HBox(0,2), + 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), + gtksignal_connect(new Gtk2::Button(N("Enable Server")), clicked => sub { + destroy_widget(); + $windows = 1; + cursor_wait(); + enable_ts(); + cursor_norm(); + }), + gtksignal_connect(new Gtk2::Button(N("Disable Server")), clicked => sub { + destroy_widget(); + cursor_wait(); + disable_ts(); + cursor_norm(); + }), + ), + 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), + gtksignal_connect(new Gtk2::Button(N("Start Server")), clicked => sub { + destroy_widget(); + $windows = 0; + cursor_wait(); + start_ts(); + cursor_norm(); + }), + gtksignal_connect(new Gtk2::Button(N("Stop Server")), clicked => sub { + destroy_widget(); + cursor_wait(); + stop_ts(); + cursor_norm(); + }), + ), + 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), + gtksignal_connect(new Gtk2::Button(N("Etherboot Floppy/ISO")), clicked => sub { + destroy_widget(); + $windows = 1; + make_boot(); + }), + gtksignal_connect(new Gtk2::Button(N("Net Boot Images")), clicked => sub { + destroy_widget(); + make_nbi(); + }), + ), + 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), + gtksignal_connect(new Gtk2::Button(N("Add/Del Users")), clicked => sub { + destroy_widget(); + $windows = 0; + maintain_users(); + }), + gtksignal_connect(new Gtk2::Button(N("Add/Del Clients")), clicked => sub { destroy_widget(); maintain_clients() }), + ), + 1, new Gtk2::HBox(0,2), + 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), + gtksignal_connect(new Gtk2::Button(N("First Time Wizard")), clicked => sub { + destroy_widget(); + start_wizard(); + }), + new Gtk2::VBox(0,0), + ), + 0, gtkadd(gtkset_layout(Gtk2::VButtonBox->new, 'end'), + gtksignal_connect(new Gtk2::Button(N("Help")),clicked => sub { + destroy_widget(); + help(); + }), + gtksignal_connect(new Gtk2::Button(N("Close")), clicked => sub { + write_conf_file(); + restart_server() if $changes_made == 1; + Gtk2->main_quit; + }), ), ), ), - ), - ); + ), + ), + ); $central_widget = \$main_box; $window1->{rwindow}->show_all; $window1->{rwindow}->realize; @@ -343,6 +363,142 @@ sub interactive_mode() { ugtk2->exit(0); } +sub start_wizard() { + text_view(N(" + This wizard routine will: + 1) Ask you to select either 'thin' or 'fat' clients. + 2) Setup dhcp. + +After doing these steps, the wizard will: + + a) Make all nbis. + b) Activate the server. + c) Start the server. + d) Synchronize the shadow files so that all users, including root, + are added to the shadow\$\$CLIENT\$\$ file. + e) Ask you to make a boot floppy. + f) If it's thin clients, ask if you want to restart KDM. +"), "wizard"); +} + +sub do_wizard() { + destroy_widget(); + $main_buttons->hide; + $in_wizard = 1; + $config_written = 0; + wizard_step(\&client_type, 1); +} + +sub wizard_step { + my ($do_step, $step) = @_; + &$do_step(); + gtkadd($wizard_buttons, + gtksignal_connect($previous_button = new Gtk2::Button(N("<-- Wizard Previous Step")), clicked => sub { + clear_buttons(); + if ($step == 1) { + exit_wizard(); + start_wizard(); + } + wizard_step(\&client_type, 1) if $step == 2; + wizard_step(\&dhcpd_config, 2) if $step == 3; + wizard_step(\&make_nbis, 3) if $step == 4; + wizard_step(\&enable_ts, 4) if $step == 5; + wizard_step(\&restart_ts, 5) if $step == 6; + wizard_step(\&sync_users, 6) if $step == 7; + wizard_step(\&make_boot, 7) if $step == 8; + }) + ); + gtkadd($wizard_buttons, + gtksignal_connect($cancel_button = new Gtk2::Button(N("Cancel Wizard")), clicked => sub { + exit_wizard(); + }) + ); + gtkadd($wizard_buttons, + gtksignal_connect($next_button = new Gtk2::Button(N("Wizard Next Step -->")), clicked => sub { + clear_buttons(); + wizard_step(\&dhcpd_config, 2) if $step == 1; + if ($step == 2) { + if ($config_written == 1) { + wizard_step(\&make_nbis, 3); + } else { + $in->ask_warn('', N("Please save dhcpd config!")); + wizard_step(\&dhcpd_config, 2); + } + } + wizard_step(\&enable_ts, 4) if $step == 3; + wizard_step(\&restart_ts, 5) if $step == 4; + wizard_step(\&sync_users, 6) if $step == 5; + wizard_step(\&make_boot, 7) if $step == 6; + wizard_step(\&restart_dm, 8) if $step == 7; + }) + ); + exit_wizard() if $step == 8; +} + +sub exit_wizard() { + clear_buttons(); + $in_wizard = 0; + $main_buttons->show; +} + +sub clear_buttons() { + destroy_widget(); + $previous_button->destroy; + $cancel_button->destroy; + $next_button->destroy; +} + +sub client_type() { + text_view(N("Please select client type. + 'Thin' clients run everything off the server's CPU/RAM, using the client display. + 'Fat' clients use their own CPU/RAM but the server's filesystem."), "wizard"); + gtkpack_($$central_widget, + 1, gtkpack_(new Gtk2::HBox(1,0), + 0, new Gtk2::VBox(0,10), + 1, gtksignal_connect(new Gtk2::CheckButton(N("Allow thin clients.")), + clicked => sub { invbool \$thin_clients; client_set() }), + 0, new Gtk2::VBox(0,10) + ) + ) +} + +sub make_nbis() { + my $buff = N("Creating net boot images for all kernels"); + $in->ask_warn('', N("This will take a few minutes.")); + cursor_wait(); + system("/usr/bin/mknbi-set"); + cursor_norm(); + $buff .= "\n\n\t" . N("Done!"); + text_view($buff, "wizard"); +} + +sub sync_users { + my ($cmd_line) = @_; + my $buff = N("Syncing server user list with client list, including root."); + my @active_users = cat_("/etc/shadow"); + + local *SHADOW; + open(SHADOW, '> /etc/shadow$$CLIENT$$'); + + #- only users with home dirs, and root + foreach my $user (@active_users) { + my @fields = split(/:/, $user); + if (-d "/home/" . $fields[0] || $fields[0] eq "root") { + print SHADOW $user; + } + } + close SHADOW; + $buff .= "\n\n\t" . N("Done!"); + text_view($buff, "wizard") if !$cmd_line; +} + +sub restart_dm() { + if ($clients_set) { + my $result = $in->ask_okcancel('', N("In order to enable changes made for thin clients, the display manager must be restarted. Restart now?")); + system('/sbin/service dm restart') if $result; + } +} + sub about() { text_view(N(" Copyright (C) 2002 by MandrakeSoft @@ -354,11 +510,11 @@ sub about() { - LTSP Project http://www.ltsp.org - Michael Brown -")); +"), "close"); } sub text_view { - my ($text) = @_; + my ($text, $option) = @_; my $box; gtkpack($status_box, $box = gtkpack_(new Gtk2::VBox(0,10), @@ -368,14 +524,18 @@ sub text_view { ), ), 0, gtkpack(gtkset_layout(new Gtk2::HButtonBox, 'spread'), - gtksignal_connect(new Gtk2::Button(N("OK")), clicked => - sub { destroy_widget() }), + gtksignal_connect(my $ok_button = new Gtk2::Button(N("OK")), clicked => sub { + destroy_widget() if $option eq "close"; + do_wizard() if $option eq "wizard"; + }), ), ) ); gtkset_size_request($box, 580, 280); $central_widget = \$box; $status_box->show_all; + $ok_button->hide if $in_wizard; + $main_buttons->hide if $in_wizard; } sub help() { @@ -488,7 +648,7 @@ N(" - Create etherboot floppies/CDs: cat /usr/lib/etherboot/floppyload.bin \\ /usr/share/etherboot/start16.bin \\ - /usr/lib/etherboot/zimg/3c509.zimg > /dev/fd0") . "\n\n"); + /usr/lib/etherboot/zimg/3c509.zimg > /dev/fd0") . "\n\n", "close"); } sub make_boot() { @@ -531,7 +691,7 @@ sub make_boot() { sub make_nbi() { my $nbi_box; - my @kernels = grep { /vmlinuz/ } all("/boot"); + my @kernels = grep { /vmlinuz-/ } all("/boot"); my $kernel; my $nic; @@ -601,61 +761,61 @@ sub make_nbi() { 0, gtkadd(new Gtk2::HBox(0,10), create_scrolled_window($tree_kernels), gtkadd(new Gtk2::VBox(1,10), - gtksignal_connect(new Gtk2::Button(N("Build Whole Kernel -->")), clicked => - sub { if ($kernel) { - $in->ask_warn('', N("This will take a few minutes.")); - cursor_wait(); - system("/usr/bin/mknbi-set -k /boot/$kernel"); - $list_model->clear; - @nbis = grep { /\.nbi/ } all("/var/lib/tftpboot"); - foreach (@nbis) { - $list_model->append_set($iter, $_); - } - cursor_norm(); - } else { - $in->ask_warn('', N("No kernel selected!")) if !($kernel); - } - }), - gtksignal_connect(new Gtk2::Button(N("Build Single NIC -->")), clicked => - sub { if ($nic) { - system("/usr/bin/mknbi-set -k /boot/$kernel -r $nic"); - $list_model->clear; - @nbis = grep { /\.nbi/ } all("/var/lib/tftpboot"); - foreach (@nbis) { - $list_model->append_set($iter, $_); - } - } else { - $in->ask_warn('', N("No NIC selected!")); - } - }), - gtksignal_connect(new Gtk2::Button(N("Build All Kernels -->")), clicked => sub { - $in->ask_warn('', N("This will take a few minutes.")); + gtksignal_connect(new Gtk2::Button(N("Build Whole Kernel -->")), clicked => sub { + if ($kernel) { + $in->ask_warn('', N("This will take a few minutes.")); cursor_wait(); - system("/usr/bin/mknbi-set"); + system("/usr/bin/mknbi-set -k /boot/$kernel"); $list_model->clear; @nbis = grep { /\.nbi/ } all("/var/lib/tftpboot"); foreach (@nbis) { - $list_model->append_set($iter, $_); + $list_model->append_set($iter, $_); } cursor_norm(); - }), - new Gtk2::HBox(1,1), - gtksignal_connect(new Gtk2::Button(N("<-- Delete")), clicked => - sub { my $nbi = "/var/lib/tftpboot/" . $nbi; - my $result = unlink($nbi) || warn("Can't delete $nbi..."); - if ($result == 1) { - $list_model->remove($nbi_iter); - } - }), - gtksignal_connect(new Gtk2::Button(N("Delete All NBIs")), clicked => - sub { cursor_wait(); - foreach (grep { /\.nbi/ } all("/var/lib/tftpboot")) { - my $nbi = "/var/lib/tftpboot/" . $_; - unlink($nbi) || warn("Can't delete $nbi..."); - } + } else { + $in->ask_warn('', N("No kernel selected!")) if !($kernel); + } + }), + gtksignal_connect(new Gtk2::Button(N("Build Single NIC -->")), clicked => sub { + if ($nic) { + system("/usr/bin/mknbi-set -k /boot/$kernel -r $nic"); $list_model->clear; - cursor_norm(); - }), + @nbis = grep { /\.nbi/ } all("/var/lib/tftpboot"); + foreach (@nbis) { + $list_model->append_set($iter, $_); + } + } else { + $in->ask_warn('', N("No NIC selected!")); + } + }), + gtksignal_connect(new Gtk2::Button(N("Build All Kernels -->")), clicked => sub { + $in->ask_warn('', N("This will take a few minutes.")); + cursor_wait(); + system("/usr/bin/mknbi-set"); + $list_model->clear; + @nbis = grep { /\.nbi/ } all("/var/lib/tftpboot"); + foreach (@nbis) { + $list_model->append_set($iter, $_); + } + cursor_norm(); + }), + new Gtk2::HBox(1,1), + gtksignal_connect(new Gtk2::Button(N("<-- Delete")), clicked => sub { + my $nbi = "/var/lib/tftpboot/" . $nbi; + my $result = unlink($nbi) || warn("Can't delete $nbi..."); + if ($result == 1) { + $list_model->remove($nbi_iter); + } + }), + gtksignal_connect(new Gtk2::Button(N("Delete All NBIs")), clicked => sub { + cursor_wait(); + foreach (grep { /\.nbi/ } all("/var/lib/tftpboot")) { + my $nbi = "/var/lib/tftpboot/" . $_; + unlink($nbi) || warn("Can't delete $nbi..."); + } + $list_model->clear; + cursor_norm(); + }), new Gtk2::HBox(1,1), ), create_scrolled_window($list_nbis), @@ -919,26 +1079,7 @@ sub maintain_clients() { gtksignal_connect($check_allow_thin, clicked => sub { invbool \$thin_clients; $check_thin->set_sensitive($thin_clients); - # we need to change some system files to allow the thin clients - # to access the server - enabling xdmcp and modify hosts.deny/hosts.allow for some security - # we also need to set runlevel to 5 and restart the display manager - if ($thin_clients == 1) { - substInFile { s/id:3:initdefault:/id:5:initdefault:/ } "/etc/inittab"; - substInFile { s/! DisplayManager.requestPort:/DisplayManager.requestPort:/ } "/etc/X11/xdm/xdm-config"; - substInFile { s/Enable=false/Enable=true/ } "/usr/share/config/kdm/kdmrc"; - # This file had 2 "Enable=" entries, one for xdmcp and one for debug - change_gdm_xdmcp("true"); - log::explanations("Modified files /etc/inittab, /etc/X11/xdm/xdm-config, /usr/share/config/kdm/kdmrc, /etc/X11/gdm/gdm.conf"); - # just xdmcp in hosts.allow is enough for xdm & kdm, but gdm doesn't work - x11 doesn't help either - update_hosts_allow("enable"); - } else { - substInFile { s/id:5:initdefault:/id:3:initdefault:/ } '/etc/inittab'; - substInFile { s/DisplayManager.requestPort:/! DisplayManager.requestPort:/ } "/etc/X11/xdm/xdm-config"; - substInFile { s/Enable=true/Enable=false/ } "/usr/share/config/kdm/kdmrc"; - change_gdm_xdmcp("false"); - log::explanations("Modified files /etc/inittab, /etc/X11/xdm/xdm-config, /usr/share/config/kdm/kdmrc, /etc/X11/gdm/gdm.conf"); - update_hosts_allow("disable"); - } + client_set(); $in->ask_warn('', N("Need to restart the Display Manager for full changes to take effect. \n(service dm restart - at the console)")); } ); @@ -949,6 +1090,30 @@ sub maintain_clients() { $client_box->show_all; } +sub client_set() { + # we need to change some system files to allow the thin clients + # to access the server - enabling xdmcp and modify hosts.deny/hosts.allow for some security + # we also need to set runlevel to 5 and restart the display manager + if ($thin_clients == 1) { + substInFile { s/id:3:initdefault:/id:5:initdefault:/ } "/etc/inittab"; + substInFile { s/! DisplayManager.requestPort:/DisplayManager.requestPort:/ } "/etc/X11/xdm/xdm-config"; + substInFile { s/Enable=false/Enable=true/ } "/usr/share/config/kdm/kdmrc"; + # This file had 2 "Enable=" entries, one for xdmcp and one for debug + change_gdm_xdmcp("true"); + log::explanations("Modified files /etc/inittab, /etc/X11/xdm/xdm-config, /usr/share/config/kdm/kdmrc, /etc/X11/gdm/gdm.conf"); + # just xdmcp in hosts.allow is enough for xdm & kdm, but gdm doesn't work - x11 doesn't help either + update_hosts_allow("enable"); + } else { + substInFile { s/id:5:initdefault:/id:3:initdefault:/ } '/etc/inittab'; + substInFile { s/DisplayManager.requestPort:/! DisplayManager.requestPort:/ } "/etc/X11/xdm/xdm-config"; + substInFile { s/Enable=true/Enable=false/ } "/usr/share/config/kdm/kdmrc"; + change_gdm_xdmcp("false"); + log::explanations("Modified files /etc/inittab, /etc/X11/xdm/xdm-config, /usr/share/config/kdm/kdmrc, /etc/X11/gdm/gdm.conf"); + update_hosts_allow("disable"); + } + $clients_set = 1; +} + sub dhcpd_config() { #- do main dhcp server config my $dhcpd_box; @@ -1069,7 +1234,7 @@ sub dhcpd_config() { new Gtk2::Label(N("dhcpd Server Configuration") . "\n\n" . N("Most of these values were extracted\nfrom your running system.\nYou can modify as needed.")), new Gtk2::HSeparator, - gtkadd((new Gtk2::HBox), + gtkadd(new Gtk2::HBox, new Gtk2::Label(N("Dynamic IP Address Pool:")), ), gtkadd(new Gtk2::HBox(0,0), @@ -1177,7 +1342,8 @@ sub write_dhcpd_config { print FHANDLE "}\n\n"; print FHANDLE qq(# Include client machine configurations\ninclude "$client_cfg";\n); - close FHANDLE + close FHANDLE; + $config_written = 1; } sub write_eb_image { @@ -1309,7 +1475,7 @@ sub service_change { $buff_index++; } close STATUS; - unlink "/tmp/drakTSservice.status" or warn("Can't delete /tmp/drakTSservice.status\n"); + unlink "/tmp/drakTSservice.status"; $buff_index; } @@ -1345,7 +1511,9 @@ sub stop_ts { my $buff_index = service_change("dhcpd", "stop", 2); $buff_index = service_change("clusternfs", "stop", $buff_index); $buff[$buff_index] = "\n\tDone!"; - + + return if $in_wizard; + if ($cmd_line == 1) { print "@buff\n"; return; @@ -1355,8 +1523,14 @@ sub stop_ts { } +#- for the wizard, stop the server first +sub restart_ts() { + stop_ts(); + start_ts(); +} + sub show_status() { - text_view("@buff"); + text_view("@buff", "close"); } sub adduser { -- cgit v1.2.1