diff options
Diffstat (limited to 'samba_wizard/scripts/smbconfig.pl')
-rwxr-xr-x | samba_wizard/scripts/smbconfig.pl | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/samba_wizard/scripts/smbconfig.pl b/samba_wizard/scripts/smbconfig.pl new file mode 100755 index 00000000..bee6d7a8 --- /dev/null +++ b/samba_wizard/scripts/smbconfig.pl @@ -0,0 +1,232 @@ +#!/usr/bin/perl -w +# +# smbconfig by Guillaume Cottenceau <gc@mandrakesoft.com> +# +# Copyright (c) 2000 by Mandrakesoft +# +# Permission to use, copy, modify, and distribute this software and its +# documentation under the terms of the GNU General Public License is hereby +# granted. No representations are made about the suitability of this software +# for any purpose. It is provided "as is" without express or implied warranty. +# See the GNU General Public License for more details. + +$program_name = "smbconfig"; +$version = "0.1.3"; + +$debug_printings = 0; + + +sub debug_print +{ + $debug_printings && print "[DEBUG] ".$_[0]; +} + +sub debug_print2 +{ + $debug_printings && print $_[0]; +} + + +sub fail +{ + die "Exiting on failure.\n"; +} + + +sub fail_with_message +{ + print $_[0]; + fail(); +} + + +@options = ( [ "--debug", "\t\tadditional debug printings", \$debug_printings ] ); + +@modes = ( [ "--help", "\t\tthis help screen", \&show_options ], + [ "--set-security-share", "setup security = share, very useful because we would need otherwise smbpasswd", \&set_security_share ], + [ "--set-hosts-allow=<..>", "setup which hosts are allowed to access; for example \"192.168.1. 127.\"", \&set_hosts_allow ], + [ "--set-workgroup=<name>", "setup workgroup name", \&set_workgroup ], + [ "--set-banner=<name>", "setup the \"server string\" banner of this smb server", \&set_banner ], + [ "--remove-homes", "\tremove the default [homes] share (which needs the security=user)", \&remove_homes ], + [ "--enable-public", "\tenable read-write share \"public\" at /home/local/samba-public", \&enable_corpo_public ], + [ "--enable-printer-access", "setup access to printers of this machine", \&set_printer_access ] ); + + + +sub read_conf +{ + open(FH, "+< /etc/samba/smb.conf") or fail_with_message("Could not open /etc/samba/smb.conf\n"); + @conf = <FH> or fail_with_message("Could not read /etc/samba/smb.conf\n"); + debug_print("/etc/samba/smb.conf read, #lines=".$#conf."\n"); +} + +sub write_conf +{ + debug_print("Will write /etc/samba/smb.conf, #lines=".$#conf."\n"); + seek(FH, 0, 0) or fail_with_message("Could not seek in /etc/samba/smb.conf\n"); + print FH @conf or fail_with_message("Could not write /etc/samba/smb.conf\n"); + truncate(FH, tell(FH)) or fail_with_message("Could not truncate /etc/samba/smb.conf\n"); + close(FH) or fail_with_message("Could not close /etc/samba/smb.conf\n"); +} + +# set_parameter: section param value +sub set_parameter +{ + my $section = $_[0]; my $param = $_[1]; my $value = $_[2]; + debug_print("Attempt to find section \"$section\", parameter \"$param\", and setup to \"$value\"\n"); + my $i = 0; + ($i++ && (lc($_) =~ /^\s*\[$section\]/) && last) foreach (@conf); + while (1) + { + ($i < $#conf) or ($conf[$i] = "$conf[$i]\n\n\t$param = $value") and last; + ($conf[$i] =~ /^\s*\[\S+\]/) && ($conf[$i] = "\t$param = $value\n\n$conf[$i]") && last; + ($conf[$i] =~ /^\s*$param\s*=/) && ($conf[$i] = "\t$param = $value\n") && last; + $i++; + } +} + +sub enable_corpo_public +{ + system("mkdir -p /home/local/samba-public") && fail_with_message("Could not create public dir. Probably run as non-root..\n"); + system("chown nobody /home/local/samba-public") && fail_with_message("Could not chown public dir to nobody. Requests admin help.\n"); + my $i = 0; + ($i++ && (lc($_) =~ /^\s*\[public\]/) && fail_with_message("An active [public] section has been found in /etc/samba/smb.conf at line $i\n")) foreach (@conf); + push(@conf, ( "$banner"."[public]\n\tcomment = Public space with read-write access\n\tpath = /home/local/samba-public\n\tguest ok = yes\n\twriteable = yes\n" )); + $did_something = 1; +} + + +sub set_workgroup +{ + set_parameter("global", "workgroup", $_[0]); + $did_something = 1; +} + +sub set_banner +{ + set_parameter("global", "server string", $_[0]); + $did_something = 1; +} + +sub set_security_share +{ + set_parameter("global", "security", "share"); + $did_something = 1; +} + +sub set_hosts_allow +{ + set_parameter("global", "hosts allow", $_[0]); + $did_something = 1; +} + + +sub set_printer_access +{ + my $i = 0; my $found = 0; + # look for default section "printers" + ($i++ && (lc($_) =~ /^\s*\[printers\]/) && ($found = 1) && last) foreach (@conf); + ($found) && debug_print("Printer section found at line $i\n"); + if ($found == 1) + { + $conf[$i-1] = ";".$conf[$i-1]; + while ($i <= $#conf) + { + (($conf[$i] =~ /^\s*\[\S+\]/) && last) || ($conf[$i] = ";".$conf[$i]); + $i++; + } + debug_print("End of printer section at line $i\n"); + } + push(@conf, ( "$banner"."[printers]\n\tcomment = All Printers\n\tpath = /var/spool/samba\n\tbrowseable = no\n\tguest ok = yes\n\twritable = no\n\tprintable = yes\n" )); + $did_something = 1; +} + +sub remove_homes +{ + my $i = 0; my $found = 0; + # look for default section "printers" + ($i++ && (lc($_) =~ /^\s*\[homes\]/) && ($found = 1) && last) foreach (@conf); + ($found) && debug_print("[homes] section found at line $i\n"); + if ($found == 1) + { + $conf[$i-1] = ";".$conf[$i-1]; + while ($i <= $#conf) + { + (($conf[$i] =~ /^\s*\[\S+\]/) && last) || ($conf[$i] = ";".$conf[$i]); + $i++; + } + debug_print("End of [homes] section at line $i\n"); + } + $did_something = 1; +} + + +sub show_options +{ + print "$program_name v$version helps auto-config of Samba.\n\n"; + + print "mode:\n"; + print "\t".$_->[0]."\t\t".$_->[1]."\n" foreach (@modes); + print "options:\n"; + print "\t".$_->[0]."\t\t".$_->[1]."\n" foreach (@options); + print "\n"; + $did_something = 1; +} + + +sub arg_without_value +{ + $_[0] =~ /([^=]*)/; + return $1; +} + +sub arg_value +{ + $_[0] =~ /([^=]*)=(.*)/; + return $2; +} + +# Disable file buffering [to display strings on the tty even when no trailing \n is added] +$| = 1; + +$date = `date`; chop $date; +$host = `hostname`; chop $host; +$banner = "\n### Autogenerated by $program_name at $date on host $host\n"; + +$did_something = 0; + + +foreach $arg (@ARGV) +{ + (($arg eq $_->[0]) && (${$_->[2]} = 1)) foreach (@options) +} + + +read_conf(); + +foreach $arg (@ARGV) +{ + ((arg_without_value($arg) eq arg_without_value($_->[0])) && &{$_->[2]}(arg_value($arg))) foreach (@modes) +} + + +($did_something && write_conf()) || show_options(); + + + +# Changelog +# +# 0.1.3 +# remove smb.conf end of file bug +# +# 0.1.2 +# added parameter support: hosts allow +# +# 0.1.1 +# added parameter support: server string +# support multiple parameter sets at same time +# added parameter support: security = share +# added remove homes +# +# 0.1.0 +# first version with configure for printers, public, workgroup |