#!/usr/bin/perl ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2005-2013 IPFire Team # # # # 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 3 of the License, 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, see . # # # ############################################################################### use strict; # enable only the following on debugging purpose #use warnings; #use CGI::Carp 'fatalsToBrowser'; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; my %sambasettings = (); my %cgisettings = (); my %checked = (); my %netsettings = (); my %color = (); my %mainsettings = (); my $message = ""; my $errormessage = ""; my $userentry = ""; my @user = (); my @userline = (); my $userfile = "${General::swroot}/samba/private/smbpasswd"; my %selected= () ; my $defaultoption= "[My Share]\npath = \ncomment = Share - Public Access\nbrowseable = yes\nwriteable = yes\ncreate mask = 0644\ndirectory mask = 0755\npublic = yes\nforce user = samba"; my %shares = &config("${General::swroot}/samba/shares"); &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", \%color); ############################################################################################################################ #################################### Initialisierung von Samba Variablen fr global Settings ############################### $sambasettings{'WORKGRP'} = uc($mainsettings{'DOMAINNAME'}); $sambasettings{'ROLE'} = 'standalone'; $sambasettings{'REMOTEANNOUNCE'} = ''; $sambasettings{'REMOTESYNC'} = ''; $sambasettings{'GUESTACCOUNT'} = 'samba'; $sambasettings{'MAPTOGUEST'} = 'Bad User'; $sambasettings{'ENCRYPTION'} = 'optional'; ### Values that have to be initialized $sambasettings{'ACTION'} = ''; my $LOGLINES = '50'; ############################################################################################################################ &General::readhash("${General::swroot}/samba/settings", \%sambasettings); # Hook to regenerate the configuration files. if ($ENV{"REMOTE_ADDR"} eq "") { &writeconfiguration(); exit(0); } &Header::showhttpheaders(); &Header::getcgihash(\%sambasettings); delete $sambasettings{'__CGI__'};delete $sambasettings{'x'};delete $sambasettings{'y'}; &Header::openpage('Samba', 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); ############################################################################################################################ ############################################# Samba Rootskript aufrufe fr SU-Actions ####################################### if ($sambasettings{'ACTION'} eq 'smbuserdisable'){&General::system("/usr/local/bin/sambactrl", "smbuserdisable", "$sambasettings{'NAME'}");} if ($sambasettings{'ACTION'} eq 'smbuserenable'){&General::system("/usr/local/bin/sambactrl", "smbuserenable", "$sambasettings{'NAME'}");} if ($sambasettings{'ACTION'} eq 'smbuseradd'){&General::system("/usr/local/bin/sambactrl", "smbuseradd", "$sambasettings{'USERNAME'}", "$sambasettings{'PASSWORD'}");} if ($sambasettings{'ACTION'} eq 'smbchangepw'){&General::system("/usr/local/bin/sambactrl", "smbchangepw", "$sambasettings{'USERNAME'}", "$sambasettings{'PASSWORD'}");} if ($sambasettings{'ACTION'} eq 'smbrestart'){&General::system("/usr/local/bin/sambactrl", "smbrestart");} if ($sambasettings{'ACTION'} eq 'smbstart'){&General::system("/usr/local/bin/sambactrl", "smbstart");} if ($sambasettings{'ACTION'} eq 'smbstop'){&General::system("/usr/local/bin/sambactrl", "smbstop");} if ($sambasettings{'ACTION'} eq 'smbreload'){&General::system("/usr/local/bin/sambactrl", "smbreload");} if ($sambasettings{'ACTION'} eq 'join') { $message .= &joindomain($sambasettings{'USERNAME'}, $sambasettings{'PASSWORD'}); } if ($sambasettings{'ACTION'} eq 'smbshareadd') { $shares{'xvx'} = $sambasettings{'SHAREOPTION'}; &save("shares"); # Reload configuration %shares = config("${General::swroot}/samba/shares"); } if ($sambasettings{'ACTION'} eq 'smbsharedel') { delete $shares{$sambasettings{'NAME'}}; &save("shares"); # Reload configuration %shares = config("${General::swroot}/samba/shares"); } if ($sambasettings{'ACTION'} eq 'smbsharechange') { $shares{$sambasettings{'NAME'}} = $sambasettings{'SHAREOPTION'}; &save("shares"); # Reload configuration %shares = config("${General::swroot}/samba/shares"); } ############################################################################################################################ ########################################### Samba Benutzer oder PC l�chen ################################################# if ($sambasettings{'ACTION'} eq 'userdelete'){&General::system("/usr/local/bin/sambactrl", "smbuserdelete", "$sambasettings{'NAME'}");} ############################################################################################################################ ##################################### Umsetzen der Werte von Checkboxen und Dropdowns ###################################### ############################################################################################################################ ##################################### Schreiben settings und bersetzen fr smb.conf ####################################### if ($sambasettings{'ACTION'} eq $Lang::tr{'save'}) { &General::writehash("${General::swroot}/samba/settings", \%sambasettings); # Write configuration to file &writeconfiguration(); &General::system("/usr/local/bin/sambactrl", "smbreload"); } &General::readhash("${General::swroot}/samba/settings", \%sambasettings); if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage\n"; print " \n"; &Header::closebox(); } if ($message) { $message = &Header::cleanhtml($message); $message =~ s/\n/
/g; &Header::openbox('100%', 'left', $Lang::tr{'messages'}); print "$message\n"; &Header::closebox(); } ############################################################################################################################ ########################################## Aktivieren von Checkboxen und Dropdowns ######################################### $selected{'ENCRYPTION'}{'optional'} = ''; $selected{'ENCRYPTION'}{'desired'} = ''; $selected{'ENCRYPTION'}{'required'} = ''; $selected{'ENCRYPTION'}{$sambasettings{'ENCRYPTION'}} = "selected='selected'"; $selected{'ROLE'}{'standalone'} = ''; $selected{'ROLE'}{'member'} = ''; $selected{'ROLE'}{$sambasettings{'ROLE'}} = "selected='selected'"; if ( $sambasettings{'MAPTOGUEST'} eq "Never" ) { $sambasettings{'MAPTOGUEST'}="Bad User"; } $selected{'MAPTOGUEST'}{$sambasettings{'MAPTOGUEST'}} = "selected='selected'"; ############################################################################################################################ ################################### Aufbau der HTML Seite fr globale Sambaeinstellungen ################################### &Header::openbox('100%', 'center', $Lang::tr{'samba'}); my %servicenames = ( "nmbd" => $Lang::tr{'netbios nameserver daemon'}, "smbd" => $Lang::tr{'smb daemon'}, "winbindd" => $Lang::tr{'winbind daemon'}, ); print < $Lang::tr{'all services'} END foreach my $service (sort keys %servicenames) { my $status = &isrunning($service); print < $servicenames{$service} $status END } print <

$Lang::tr{'basic options'}
$Lang::tr{'workgroup'}

$Lang::tr{'security options'}
$Lang::tr{'security'}
$Lang::tr{'encryption'}
$Lang::tr{'map to guest'}

$Lang::tr{'network options'}
$Lang::tr{'remote announce'}
$Lang::tr{'remote browse sync'}

END ; &Header::closebox(); ############################################################################################################################ ########################################## Benutzerverwaltung fr Usersecurity ############################################# if ($sambasettings{'ROLE'} eq 'standalone') { &Header::openbox('100%', 'center', $Lang::tr{'user management'}); print < $Lang::tr{'user'} END &General::system("/usr/local/bin/sambactrl", "readsmbpasswd"); open(FILE, "<${General::swroot}/samba/private/smbpasswd") or die "Can't read user file: $!"; my @users = ; close(FILE); &General::system("/usr/local/bin/sambactrl", "locksmbpasswd"); my $lines = 0; foreach $userentry (sort @users) { @userline = split( /\:/, $userentry); if ($lines % 2) { print ""; } else { print ""; } # Print username print "$userline[0]"; if ($userline[4] =~ /D/) { print <
END } else { print <
END } # Machine accounts can't be edited if ($userline[0] =~ /\$/) { print ""; } else { print <
END } print <
END $lines++; } print <
END if ($sambasettings{'ACTION'} eq 'userchangepw') { my $username = $sambasettings{'NAME'}; my $password = 'samba'; print <
$Lang::tr{'change passwords'}
$Lang::tr{'username'}
$Lang::tr{'password'}
END } if ($sambasettings{'ACTION'} eq 'useradd') { my $username = "user"; my $password = "samba"; chomp $username; $username=~s/\s//g; chomp $password; $password=~s/\s//g; print <
$Lang::tr{'add user'}
$Lang::tr{'username'}
$Lang::tr{'password'}
END } &Header::closebox(); } if ($sambasettings{'ROLE'} eq "member") { &Header::openbox('100%', 'center', $Lang::tr{'samba join a domain'}); my $AD_DOMAINNAME = uc($mainsettings{'DOMAINNAME'}); print <
$Lang::tr{'domain'} $AD_DOMAINNAME
$Lang::tr{'administrator username'}
$Lang::tr{'administrator password'}
END &Header::closebox(); } ############################################################################################################################ ############################################### Verwalten von Freigaben #################################################### &Header::openbox('100%', 'center', $Lang::tr{'shares'}); print < $Lang::tr{'sharename'} END my @shares = keys(%shares); my $lines = 0; my $col=""; foreach my $shareentry (sort @shares) { chomp $shareentry; if ($lines % 2) { $col = "bgcolor='$color{'color20'}'"; } else { $col = "bgcolor='$color{'color22'}'"; } print < $shareentry
END ; $lines++; } print <
END if ($sambasettings{'ACTION'} eq 'shareadd') { print <
$Lang::tr{'add share'}
END } if ($sambasettings{'ACTION'} eq 'sharechange') { my $shareoption = $shares{$sambasettings{'NAME'}}; print <
$Lang::tr{'edit share'}
END } &Header::closebox(); ############################################################################################################################ ############################################### Anzeige des Sambastatus #################################################### &Header::openbox('100%', 'left', $Lang::tr{'status'}); my $status = qx(/usr/local/bin/sambactrl smbstatus); $status = &Header::cleanhtml($status); print <
$status
END &Header::closebox(); &Header::closebigbox(); &Header::closepage(); ############################################################################################################################ ############################################ Subfunktion fr Sambadienste ################################################### sub config { my $file = shift; my @allarray = `grep -n '^\\[' $file`; my @linesarray = (); my @namearray = (); my %hash = (); my $options = (); my $EOF = qx(cat $file | wc -l); foreach my $allarrayentry (@allarray) { my @allarrayline = split( /\:/, $allarrayentry ); push(@linesarray,$allarrayline[0]);$allarrayline[1]=~s/\[//g;$allarrayline[1]=~s/\]//g;push(@namearray,$allarrayline[1]); } for(my $i = 0; $i <= $#namearray; $i++) { chomp $namearray[$i]; $namearray[$i]=~s/\[//g;$namearray[$i]=~s/\]//g; if ( $i eq $#namearray ) { my $lineend = $EOF-$linesarray[$i]+1; $options=qx(tail -$lineend $file); } else { my $linestart = $EOF-$linesarray[$i]+1; my $lineend = $linesarray[$i+1]-$linesarray[$i]; $options=qx(tail -$linestart $file | head -$lineend); } $hash{$namearray[$i]} = "$options"; #print"
$namearray[$i]\n$options\n
"; # enable only for debuging } return(%hash); } sub save { my $smb = shift; open (FILE, ">${General::swroot}/samba/$smb") or die "Can't $smb settings $!"; flock (FILE, 2); if ( $smb eq 'shares') {while (my ($name, $option) = each %shares){chomp $option;$option =~ s/\r\n/\n/gi;$option =~ s/^\n//gi;$option =~ s/^\r//gi;$option =~ s/^.\n//gi;$option =~ s/^.\r//gi;print FILE "$option\n";} } close FILE; &General::system("/usr/local/bin/sambactrl", "smbsafeconf"); &General::system("/usr/local/bin/sambactrl", "smbreload"); } sub isrunning { my $cmd = $_[0]; my $status = "$Lang::tr{'stopped'}"; my $pid = ''; my $testcmd = ''; my $exename; $cmd =~ /(^[a-z]+)/; $exename = $1; if (open(FILE, "/var/run/${cmd}.pid")) { $pid = ; chomp $pid; close FILE; if (open(FILE, "/proc/${pid}/status")) { while () { if (/^Name:\W+(.*)/) { $testcmd = $1; } } close FILE; if ($testcmd =~ /$exename/) { $status = "$Lang::tr{'running'}"; } } } return $status; } sub writeconfiguration() { open (FILE, ">${General::swroot}/samba/global") or die "Can't save the global settings: $!"; flock (FILE, 2); print FILE <) { print FILE $_; } close(LOCAL); } print FILE <