diff options
Diffstat (limited to 'samba_wizard/Samba.pm')
-rwxr-xr-x | samba_wizard/Samba.pm | 292 |
1 files changed, 204 insertions, 88 deletions
diff --git a/samba_wizard/Samba.pm b/samba_wizard/Samba.pm index 1130879e..59726944 100755 --- a/samba_wizard/Samba.pm +++ b/samba_wizard/Samba.pm @@ -27,16 +27,14 @@ use strict; use common; use services; use MDK::Wizard::Wizcommon; -use Data::Dumper; -use Libconf qw(:functions); use Libconf::Templates; use Libconf::Glueconf::Samba::Smb_conf; my $wiz = new MDK::Wizard::Wizcommon; my $DOMAINNAME = chomp_(`dnsdomainname`); -my $HOSTNAME = chomp_(`hostname`); +my $SHORTHOSTNAME = chomp_(`hostname -s`); my $o = { name => 'Samba wizard', @@ -49,6 +47,10 @@ my $o = { wiz_level => '', wiz_printers => '', wiz_do_printer_sharing => '', + wiz_printers_comment => '', + wiz_printers_browseable => '', + wiz_printers_guestok => '', + wiz_printers_createmode => '', wiz_do_homes => '', wiz_workgroup => '', wiz_dir => '', @@ -63,16 +65,27 @@ my $o = { wiz_log_level => '', wiz_max_log_size => '', list_printers => '', + wiz_home_writable => '', + wiz_home_browseable => '', + wiz_home_createmode => '', + wiz_home_comment => '', + test => '', }, +# init => sub { +# test_host_domain($SHORTHOSTNAME, $DOMAINNAME); +# }, needed_rpm => [ 'samba-server' ], defaultimage => "/usr/share/wizards/samba_wizard/images/samba.png" }; +#pdc #bdc #standalone #membre #share_files #share_printers + # we ask glueconf to give us the structure representing /etc/samba/smb.conf my $samba = new Libconf::Glueconf::Samba::Smb_conf({ filename => '/etc/samba/smb.conf', }); #debug +use Data::Dumper; print Dumper($samba); my %level = ( @@ -80,14 +93,73 @@ my %level = ( 2 => N('My rules - Ask me allowed and denied hosts') ); -my @yesorno = qw(yes no); push @yesorno, ""; +my %type = ( + 1 => N('BDC - backup domain controller'), + 2 => N('PDC - primary domain controller'), + 3 => N('Standalone - standalone server'), + 4 => N('Member - member of a domain'), + ); + +my @yesorno = qw(yes no); #push @yesorno, ""; +my @loglevel = qw(0 1 2 3 4 5 6 7 8 9 10); $o->{pages} = { welcome => { - name => N('Samba Configuration Wizard') . "\n\n" . N('Samba allows your server to behave as a file and print server for workstations running non-Linux systems.') . "\n\n" . N('This wizard will help you configuring the Samba services of your server.'), + name => N('Samba Configuration Wizard') . "\n\n" . N('Samba allows your server to behave as a file and print server for workstations running non-Linux systems.') . "\n\n" . N('This wizard will help you configuring the Samba services of your server.') . "\n\n" . N('PDC: primary domain controller') . "\n" . N('BDC: backup domain controller') . "\n" . N('standalone: standalone server') . "\n" . N('Member: member of a domain'), no_back => 1, - next => 'ask_workgroup' - }, + pre => sub { + $o->{var}{wiz_type} ||= 1; + }, + next => 'ask_type', + post => sub { + if ($o->{var}{wiz_type} == 2) { + return 'pdc' } + elsif ($o->{var}{wiz_type} == 1) { + return 'bdc' } + elsif ($o->{var}{wiz_type} == 3) { + return 'standalone' } + elsif ($o->{var}{wiz_type} == 4) { + return 'member' } + }, + data => [ + { label => N("Wich type of Samba server do you you want:"), val => \$o->{var}{wiz_type}, list => [ keys %type ], format => sub { $type{$_[0]} } }, + ], + }, + pdc => { + name => N('PDC server: primary domain controller'), + data => [ + { label => N('val:'), val => \$o->{var}{test} }, + ], +# complete => {}, + next => 'ask_workgroup', + }, + bdc => { + name => N('BDC server: backup domain controller'), + data => [ + { label => N('val:'), val => \$o->{var}{test} }, +# { label => N(':'), val => \$o->{var}{} }, + ], +# complete => {}, + next => 'ask_workgroup', + }, + member => { + name => N('Member of a domain'), + data => [ + { label => N('val:'), val => \$o->{var}{test} }, +# { label => N(':'), val => \$o->{var}{} }, + ], +# complete => {}, + next => 'ask_workgroup', + }, + standalone => { + name => N('Standalone server') . "\n\n" . ('Share data, users home or printers.'), + data => [ + { label => N('val:'), val => \$o->{var}{test} }, +# { label => N(':'), val => \$o->{var}{} }, + ], +# complete => {}, + next => 'ask_workgroup', + }, ask_workgroup => { name => N('Workgroup') . "\n\n" . N('Samba needs to know the Windows Workgroup it will serve.'), pre => sub { @@ -103,7 +175,7 @@ $o->{pages} = { return 1 } else { return 0 }; }, - next => 'ask_banner' + next => 'ask_banner', }, ask_banner => { name => N('Server Banner.') . "\n\n" . N('The banner is the way this server will be described in the Windows workstations.'), @@ -111,7 +183,7 @@ $o->{pages} = { $o->{var}{wiz_banner} ||= $samba->{global}{'server string'} }, data => [ - { label => N('Banner:'), val => \$o->{var}{wiz_banner} }, + { label => N('Banner:'), val => \$o->{var}{wiz_banner} }, ], complete => sub { if (!$o->{var}{wiz_banner}) { @@ -119,21 +191,21 @@ $o->{pages} = { return 1 } else { return 0 }; }, - next => 'ask_log' + next => 'ask_log', }, ask_log => { - name => N('Samba Log') . "\n\n" . N(''), + name => N('Samba Log') . "\n\n" . N('Log file: use file.%m to use a separate log file for each machine that connects') . "\n" . N('Log level: set the log (verbosity) level (0 <= log level <= 10)') . "\n" . N('Max Log size: put a capping on the size of the log files (in Kb).'), pre => sub { $o->{var}{wiz_log_file} ||= $samba->{global}{'log file'}; $o->{var}{wiz_log_level} ||= $samba->{global}{'log level'}; $o->{var}{wiz_max_log_size} ||= $samba->{global}{'max log size'}; }, data => [ - { label => N('Log file:'), val => \$o->{var}{wiz_log_file} }, - { label => N('Max log size:'), val => \$o->{var}{wiz_max_log_size} }, - { label => N('Log level:'), val => \$o->{var}{wiz_log_level} }, + { label => N('Log file:'), val => \$o->{var}{wiz_log_file} }, + { label => N('Max log size:'), val => \$o->{var}{wiz_max_log_size} }, + { label => N('Log level:'), val => \$o->{var}{wiz_log_level}, fixed_list => \@loglevel }, ], - next => 'ask_net', + next => 'ask_services', }, ask_net => { name => N('Access control') . "\n\n" . N('') . "\n\n" . N(''), @@ -155,9 +227,9 @@ $o->{pages} = { post => \&check, data => [ { label => N('Allow hosts:'), val => \$o->{var}{wiz_allow_host} }, - { label => N('Deny hosts:'), val => \$o->{var}{wiz_deny_host} }, + { label => N('Deny hosts:'), val => \$o->{var}{wiz_deny_host} }, ], - next => 'ask_services' + next => 'ask_services', }, ask_services => { name => N('Enabled Samba Services') . "\n\n" . N('Samba can provide a common file sharing area to your Windows workstation, and can also provide printer sharing for the printers connected to your server.'), @@ -171,21 +243,17 @@ $o->{pages} = { { text => N('Enable Server Printer Sharing'), type => 'bool', val => \$o->{var}{wiz_do_printer_sharing} }, { text => N('Make home directories available for their owners'), type => 'bool', val => \$o->{var}{wiz_do_homes} }, ], - complete => sub { + post => sub { if ($o->{var}{wiz_do_file_sharing} == 1) { return 'ask_dir'; - } else { - if ($o->{var}{wiz_do_printer_sharing}) { return 'ask_printers' } - } + } elsif ($o->{var}{wiz_do_printer_sharing} == 1) { + return 'ask_printers'; + } elsif ($o->{var}{wiz_do_homes} == 1) { + return 'ask_homes'; + } else { return 'summary' } }, - next => 'ask_dir' + next => 'ask_dir', }, - warn_smbpasswd => { - name => N('Warning.') . "\n\n" . N('You have selected to allow user access their home directories via samba but you/they must use smbpasswd to set a password.'), - post => \&ask_dir, - ignore => 1, - next => 'summary' - }, ask_dir => { name => N('Shared directory:') . "\n\n" . N('Type the path of the directory you want being shared.'), pre => sub { @@ -195,10 +263,10 @@ $o->{pages} = { $o->{var}{wiz_share_writable} ||= $samba->{public}{writable}; }, data => [ - { label => N('Comment:'), val => \$o->{var}{wiz_share_comment} }, - { label => N('Shared directory:'), val => \$o->{var}{wiz_dir} }, - { label => N('Browseable:'), val => \$o->{var}{wiz_share_browseable}, fixed_list => \@yesorno }, - { label => N('Writable:'), val => \$o->{var}{wiz_share_writable}, fixed_list => \@yesorno }, + { label => N('Comment:'), val => \$o->{var}{wiz_share_comment} }, + { label => N('Shared directory:'), val => \$o->{var}{wiz_dir} }, + { label => N('Browseable:'), val => \$o->{var}{wiz_share_browseable}, fixed_list => \@yesorno }, + { label => N('Writable:'), val => \$o->{var}{wiz_share_writable}, fixed_list => \@yesorno }, { text => N("Create shared directory if it doesn't exist"), type => 'bool', val => \$o->{var}{create_missing_directory} }, ], post => sub { @@ -210,15 +278,17 @@ $o->{pages} = { next => 'ask_access' }, ask_access => { - name => N('File permissions') . "\n\n" . N('Type users or group separated by a comma (groups must be preceded by a \'@\') like this :\nroot, fred, @users, @wheel for each kind of permission.') . "\n\n" . N(''), + name => N('File permissions') . "\n\n" . N('Type users or group separated by a comma (groups must be preceded by a \'@\') like this :') . "\n". N('root, fred, @users, @wheel for each kind of permission.') . "\n", pre => sub { $o->{var}{wiz_read_list} ||= $samba->{public}{'read list'}; $o->{var}{wiz_write_list} ||= $samba->{public}{'write list'}; }, - complete => sub { - if ($o->{var}{wiz_do_printer_sharing}) { + post => sub { + if ($o->{var}{wiz_do_printer_sharing} == 1) { return 'ask_printers'; - } else { return 'summary' } + } elsif ($o->{var}{wiz_do_homes} == 1) { + return 'ask_homes'; + } }, data => [ { label => N('read list:'), help => N('root, fred, @users, @wheel'), val => \$o->{var}{wiz_read_list} }, @@ -229,18 +299,54 @@ $o->{pages} = { ask_printers => { name => N('Select which printers you want to be accessible from known users'), pre => sub { - $o->{var}{list_printers} ||= [ list_printers() ]; + $o->{var}{list_printers} ||= [ list_printers() ]; $o->{var}{wiz_box_list} ||= []; }, data => [ { text => N('Enable all printers'), type => 'bool', val => \$o->{var}{wiz_all_printers} }, { val => \$o->{var}{wiz_box_list}, boolean_list => \$o->{var}{list_printers}, disabled => sub { $o->{var}{wiz_all_printers} and return 1; 0 } }, ], - next => 'summary' + next => 'ask_printers_options', }, + ask_printers_options => { + name => N('Now you can configure your printers service. Change value only if you know what your are doing.'), + pre => sub { + $o->{var}{wiz_printers_comment} ||= $samba->{printers}{comment}; + $o->{var}{wiz_printers_browseable} ||= $samba->{printers}{browseable}; + $o->{var}{wiz_printers_guestok} ||= $samba->{printers}{'guest ok'}; + $o->{var}{wiz_printers_createmode} ||= $samba->{printers}{'create mode'}; + }, + post => sub { + if ($o->{var}{wiz_do_homes} == 1) { + return 'ask_homes'; + } + }, + data => [ + { label => N('Comment:'), val => \$o->{var}{wiz_printers_comment} }, + { label => N('Create mode:'), val => \$o->{var}{wiz_printers_createmode} }, + { label => N('Browseable:'), val => \$o->{var}{wiz_printers_browseable}, fixed_list => \@yesorno }, + { label => N('Guest ok:'), val => \$o->{var}{wiz_printers_guestok}, fixed_list => \@yesorno }, + ], + next => 'summary', + }, + ask_homes => { + name => N('Users home options') . "\n" . N('You have selected to allow user access their home directories via samba but you/they must use smbpasswd to set a password.') . "\n" . N('Comment: description of users home directory') . "\n" . N('Browseable: view share') . "\n" . N('Writable: user can write in their home') . "\n" . N('Create mode: man chmod for more info'), + pre => sub { + $o->{var}{wiz_home_comment} ||= $samba->{homes}{comment}; + $o->{var}{wiz_home_browseable} ||= $samba->{homes}{browseable}; + $o->{var}{wiz_home_writable} ||= $samba->{homes}{writable}; + $o->{var}{wiz_home_createmode} ||= $samba->{homes}{'create mode'}; + }, + data => [ + { label => N('Comment:'), val => \$o->{var}{wiz_home_comment} }, + { label => N('Browseable:'), val => \$o->{var}{wiz_home_browseable}, fixed_list => \@yesorno }, + { label => N('Writable:'), val => \$o->{var}{wiz_home_writable}, fixed_list => \@yesorno }, + { label => N('Create mode:'), val => \$o->{var}{wiz_home_createmode} }, + ], + next => 'summary', + }, summary => { - name => N('Configuring Samba') . "\n\n" . N('The wizard collected the following parameters -configure Samba.') . "\n\n" . N('To accept these values, and configure your server, click the Next button or use the Back button to correct them.'), + name => N('Configuring Samba') . "\n\n" . N('The wizard collected the following parameters to configure Samba.') . "\n\n" . N('To accept these values, and configure your server, click the Next button or use the Back button to correct them.'), pre => sub { $o->{var}{printers} = get_printers(); $o->{var}{file_sharing} = $o->{var}{wiz_do_file_sharing} ? N("enabled") : N("disabled"); @@ -250,20 +356,25 @@ configure Samba.') . "\n\n" . N('To accept these values, and configure your serv data => [ { label => N('Workgroup:'), fixed_val => \$o->{var}{wiz_workgroup} }, { label => N('Server Banner:'), fixed_val => \$o->{var}{wiz_banner} }, - { label => N('File Sharing:'), fixed_val => \$o->{var}{file_sharing} }, - { label => N('Shared directory:'), fixed_val => \$o->{var}{wiz_dir} }, - { label => N('Print Server:'), fixed_val => \$o->{var}{printer_sharing} }, + { label => N('File Sharing:'), fixed_val => \$o->{var}{file_sharing} }, + { label => N('Print Server:'), fixed_val => \$o->{var}{printer_sharing} }, { label => N('Home:'), fixed_val => \$o->{var}{shared_homes} }, - { label => N('Printers:'), fixed_val => \$o->{var}{printers} }, ], post => \&do_it, next => 'end' }, end => { - name => N('Congratulations') . "\n\n" . N('The wizard successfully configured your Samba server.'), + name => N('Congratulations') . "\n\n" . N('The wizard successfully configured your Samba server.'), end => 1, next => 0 }, + error_end => { + name => N("Failed"), + data => [ { label => N("Please relaunch drakwizard, and try to change some parameters.") } ], + no_back => 1, + end => 1, + next => 0, + }, }; sub new { @@ -296,21 +407,15 @@ sub check { 0; } -sub check_services { - $o->{var}{wiz_do_homes} and return 'warn_smbpasswd'; - $o->{var}{wiz_do_file_sharing} and return 'ask_dir'; - $o->{var}{wiz_do_printer_sharing} and return 'ask_printers'; -} - #section has the name of the printer sub add_printer { - my ($printer) = @_; + my ($printer) = @_; $samba->{$printer}{printer} = $printer; $samba->{$printer}{printable} = 'yes'; } sub remove_printer { - my ($printer) = @_; + my ($printer) = @_; delete $samba->{$printer}; } @@ -323,21 +428,42 @@ sub list_printers { } cat_("/etc/printcap"); if (@list) { @list - } else { - () - } + } else { () } } +sub list_share { + my @listshare; + my $share; + if ($samba->{$_}{printable} =~ /yes/) { + print "$share is a printer\n"; + () + } else { + print "$share is a share\n"; + push @listshare, $share; + } +} sub printer_sharing { - for (my $i; $i < @{$o->{var}{wiz_box_list}}; $i++) { - my $printer = $o->{var}{list_printers}[$i]; - if ($o->{var}{wiz_box_list}[$i]) { - add_printer($printer); - } else { - remove_printer($printer); - } + # create default sedction for printers with default value + $samba->{printers}; + $samba->{printers}{comment} = $o->{var}{wiz_printers_comment}; + $samba->{printers}{browseable} = $o->{var}{wiz_printers_browseable}; + $samba->{printers}{'guest ok'} = $o->{var}{wiz_printers_guestok}; + $samba->{printers}{'create mode'} = $o->{var}{wiz_printers_createmode}; + # dont want user to change those value... + $samba->{printers}{path} = "/var/spool/samba"; + $samba->{printers}{writable} = "no"; + $samba->{printers}{printable} = "yes"; + $samba->{printers}{'print command'} = "lpr-cups -P %p -o raw %s -r"; + $samba->{printers}{'use client driver'} = "yes"; + for (my $i; $i < @{$o->{var}{wiz_box_list}}; $i++) { + my $printer = $o->{var}{list_printers}[$i]; + if ($o->{var}{wiz_box_list}[$i]) { + add_printer($printer); + } else { + remove_printer($printer); } + } } sub get_printers { @@ -354,15 +480,6 @@ sub get_printers { } } -sub ask_acces { - 10; -} - -sub ask_dir { - return 'ask_dir' if $o->{var}{wiz_do_file_sharing}; - return 'ask_printers' if $o->{var}{wiz_do_printer_sharing}; -} - # remember one variable cannot be commented and not in the same file. sub do_it { $::testing and return; @@ -410,11 +527,10 @@ sub do_it { if ($o->{var}{wiz_do_homes}) { standalone->explanations("Enabling samba homes sharing"); $samba->{homes}; - $samba->{homes}{comment} = "Home Directories"; - $samba->{homes}{browseable} = "no"; - $samba->{homes}{writable} = "yes"; - $samba->{homes}{'create mode'} = "0700"; - $samba->{homes}{''} = "0600"; + $samba->{homes}{comment} = $o->{var}{wiz_home_comment}; + $samba->{homes}{browseable} = $o->{var}{wiz_home_browseable}; + $samba->{homes}{writable} = $o->{var}{wiz_home_writable}; + $samba->{homes}{'create mode'} = $o->{var}{wiz_home_createmode}; } else { standalone->explanations("Disabling samba homes sharing"); delete $samba->{homes}; @@ -424,21 +540,21 @@ sub do_it { # share printers if ($o->{var}{wiz_do_printer_sharing}) { - standalone->explanations("Enabling printer sharing"); - printer_sharing(); + standalone->explanations("Enabling printer sharing"); + printer_sharing(); } else { - standalone->explanations("Disabling printer sharing"); - for(my $i; $i < @{$o->{var}{wiz_box_list}}; $i++) { - remove_printer($o->{var}{list_printers}[$i]); - } - delete $samba->{printers}; + standalone->explanations("Disabling printer sharing"); + if ($o->{var}{wiz_box_list}) { + for(my $i; $i < @{$o->{var}{wiz_box_list}}; $i++) { + remove_printer($o->{var}{list_printers}[$i]); + } + } + delete $samba->{printers}; } $samba->write_conf("/etc/samba/smb.conf"); if (services::is_service_running('smb')) { - services::restart('smb') - } else { - services::start('smb') - } + services::restart('smb') + } else { services::start('smb') } undef $w; check_started('smbd'); } |