#!/usr/bin/perl # # IPFire CGIs # # This code is distributed under the terms of the GPL # # (c) The IPFire Team 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 %ovpnsettings = (); my $message = ""; my $errormessage = ""; my @Logs = qx(ls /var/log/samba/); my $Log ='kein Log ausgewählt'; my $defaultoption= "[Share]\npath = /var/samba/share1\ncomment = Share - Public Access\nbrowseable = yes\nwriteable = yes\ncreate mask = 0777\ndirectory mask = 0777\nguest ok = yes\npublic = yes\nforce user = samba"; my $userentry = ""; my @user = (); my @userline = (); my @proto = (); my %selected= () ; my $userfile = "/var/ipfire/samba/private/smbpasswd"; &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); &General::readhash("${General::swroot}/ovpn/settings", \%ovpnsettings); ############################################################################################################################ ############################################# Samba Dienste fr Statusberprfung ########################################## my %servicenames = ('SMB Daemon' => 'smbd','NetBIOS Nameserver' => 'nmbd','Winbind Daemon' => 'winbindd'); &Header::showhttpheaders(); ############################################################################################################################ #################################### Initialisierung von Samba Sharess fr die Verarbeitung ################################ my @Zeilen= (); my @Shares= (); my $shareentry = ""; my $shareconfigentry = ""; my @shareconfigline = (); my $shareoption = ''; my @shares = (); my @shareline = (); my $sharefile = "/var/ipfire/samba/shares"; my $EOF = qx(cat $sharefile | wc -l); my $Status = qx(/usr/local/bin/sambactrl smbstatus); $Status=~s/\n/
/g; @shares = `grep -n '^\\[' $sharefile`; foreach $shareentry (@shares) { @shareline = split( /\:/, $shareentry ); push(@Zeilen,$shareline[0]);push(@Shares,$shareline[1]); } ############################################################################################################################ #################################### Initialisierung von Samba Variablen fr global Settings ############################### $sambasettings{'WORKGRP'} = 'homeip.net'; $sambasettings{'NETBIOSNAME'} = 'IPFire'; $sambasettings{'SRVSTRING'} = 'Samba running on IPFire 2.0'; $sambasettings{'INTERFACES'} = ''; $sambasettings{'SECURITY'} = 'share'; $sambasettings{'OSLEVEL'} = '65'; $sambasettings{'GREEN'} = 'on'; $sambasettings{'BLUE'} = 'off'; $sambasettings{'ORANGE'} = 'off'; $sambasettings{'VPN'} = 'off'; $sambasettings{'WINSSRV'} = ''; $sambasettings{'WINSSUPPORT'} = 'on'; $sambasettings{'REMOTEANNOUNCE'} = ''; $sambasettings{'PASSWORDSYNC'} = 'off'; $sambasettings{'OTHERINTERFACES'} = ''; $sambasettings{'GUESTACCOUNT'} = 'samba'; $sambasettings{'MAPTOGUEST'} = 'Never'; $sambasettings{'LOGLEVEL'} = '3 passdb:5 auth:10 winbind:2'; ### Values that have to be initialized $sambasettings{'ACTION'} = ''; $sambasettings{'LOGLINES'} = '15'; ################################################## Samba PDC Variablen ##################################################### $sambasettings{'LOCALMASTER'} = 'off'; $sambasettings{'DOMAINMASTER'} = 'off'; $sambasettings{'PREFERREDMASTER'} = 'off'; my $PDCOPTIONS = `cat ${General::swroot}/samba/pdc`; ############################################################################################################################ &General::readhash("${General::swroot}/samba/settings", \%sambasettings); &Header::getcgihash(\%sambasettings); &Header::openpage('Samba', 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); ############################################################################################################################ ############################################# Samba Rootskript aufrufe fr SU-Actions ####################################### if ($sambasettings{'ACTION'} eq 'smbuserdisable'){system("/usr/local/bin/sambactrl smbuserdisable $sambasettings{'NAME'}");} if ($sambasettings{'ACTION'} eq 'smbuserenable'){system("/usr/local/bin/sambactrl smbuserenable $sambasettings{'NAME'}");} if ($sambasettings{'ACTION'} eq 'smbuseradd'){system("/usr/local/bin/sambactrl smbuseradd $sambasettings{'USERNAME'} $sambasettings{'PASSWORD'} $sambasettings{'GROUP'} $sambasettings{'SHELL'}");} if ($sambasettings{'ACTION'} eq 'smbpcadd'){system("/usr/local/bin/sambactrl smbpcadd $sambasettings{'PCNAME'} $sambasettings{'GROUP'} $sambasettings{'SHELL'}");} if ($sambasettings{'ACTION'} eq 'smbchangepw'){system("/usr/local/bin/sambactrl smbchangepw $sambasettings{'USERNAME'} $sambasettings{'PASSWORD'}");} if ($sambasettings{'ACTION'} eq 'smbrestart'){system("/usr/local/bin/sambactrl smbrestart");} if ($sambasettings{'ACTION'} eq 'smbstart'){system("/usr/local/bin/sambactrl smbstart");} if ($sambasettings{'ACTION'} eq 'smbstop'){system("/usr/local/bin/sambactrl smbstop");} if ($sambasettings{'ACTION'} eq 'smbstop'){system("/usr/local/bin/sambactrl smbstop");} if ($sambasettings{'ACTION'} eq 'globalresetyes') { system("/usr/local/bin/sambactrl smbglobalreset"); $sambasettings{'WORKGRP'} = 'homeip.net'; $sambasettings{'NETBIOSNAME'} = 'IPFire'; $sambasettings{'SRVSTRING'} = 'Samba running on IPFire 2.0'; $sambasettings{'INTERFACES'} = ''; $sambasettings{'SECURITY'} = 'share'; $sambasettings{'OSLEVEL'} = '65'; $sambasettings{'GREEN'} = 'on'; $sambasettings{'BLUE'} = 'off'; $sambasettings{'ORANGE'} = 'off'; $sambasettings{'VPN'} = 'off'; $sambasettings{'WINSSRV'} = ''; $sambasettings{'WINSSUPPORT'} = 'on'; $sambasettings{'REMOTEANNOUNCE'} = ''; $sambasettings{'PASSWORDSYNC'} = 'off'; $sambasettings{'OTHERINTERFACES'} = ''; $sambasettings{'GUESTACCOUNT'} = 'samba'; $sambasettings{'MAPTOGUEST'} = 'Never'; $sambasettings{'LOGLEVEL'} = '3 passdb:5 auth:10 winbind:2'; ### Values that have to be initialized $sambasettings{'ACTION'} = ''; $sambasettings{'LOCALMASTER'} = 'off'; $sambasettings{'DOMAINMASTER'} = 'off'; $sambasettings{'PREFERREDMASTER'} = 'off'; $PDCOPTIONS = `cat ${General::swroot}/samba/pdc`; } # smbsafeconf is directly called by the if clause if ($sambasettings{'ACTION'} eq 'sharesresetyes') { system('/usr/local/bin/sambactrl smbsharesreset'); @Zeilen = (); @Shares = (); $shareentry = ""; @shares = (); @shareline = (); $EOF = qx(cat $sharefile | wc -l); @shares = `grep -n '^\\[' $sharefile`; foreach $shareentry (@shares) { @shareline = split( /\:/, $shareentry ); push(@Zeilen,$shareline[0]);push(@Shares,$shareline[1]); } } ############################################################################################################################ ################################################ Sicherheitsabfrage für den Reset ########################################## if ($sambasettings{'ACTION'} eq 'globalreset') { print <
Globals zurück setzen?
Yes
No
END ; } if ($sambasettings{'ACTION'} eq 'sharesreset') { print <
Shares zurück setzen?
Yes
No
END ; } ############################################################################################################################ ########################################### Samba Benutzer oder PC l�chen ################################################# if ($sambasettings{'ACTION'} eq 'userdelete'){system("/usr/local/bin/sambactrl smbuserdelete $sambasettings{'NAME'}");} ############################################################################################################################ ############################################## Samba Share neu anlegen ##################################################### if ($sambasettings{'ACTION'} eq 'smbshareadd') { my $emptyline= ""; open (FILE, ">>${General::swroot}/samba/shares") or die "Can't save the shares settings: $!"; flock (FILE, 2); print FILE <${General::swroot}/samba/shares") or die "Can't delete the share settings: $!"; flock (FILE, 2); print FILE <${General::swroot}/samba/shares") or die "Can't delete the share settings: $!"; flock (FILE, 2); print FILE <${General::swroot}/samba/global") or die "Can't save the global settings: $!"; flock (FILE, 2); print FILE <${General::swroot}/samba/pdc") or die "Can't save the pdc settings: $!"; flock (FILE, 2); print FILE <$errormessage\n"; print " \n"; &Header::closebox(); } ############################################################################################################################ ########################################## Aktivieren von Checkboxen und Dropdowns ######################################### $checked{'WINSSUPPORT'}{'off'} = ''; $checked{'WINSSUPPORT'}{'on'} = ''; $checked{'WINSSUPPORT'}{$sambasettings{'WINSSUPPORT'}} = "checked='checked'"; $checked{'PASSWORDSYNC'}{'off'} = ''; $checked{'PASSWORDSYNC'}{'on'} = ''; $checked{'PASSWORDSYNC'}{$sambasettings{'PASSWORDSYNC'}} = "checked='checked'"; $checked{'LOCALMASTER'}{'off'} = ''; $checked{'LOCALMASTER'}{'on'} = ''; $checked{'LOCALMASTER'}{$sambasettings{'LOCALMASTER'}} = "checked='checked'"; $checked{'DOMAINMASTER'}{'off'} = ''; $checked{'DOMAINMASTER'}{'on'} = ''; $checked{'DOMAINMASTER'}{$sambasettings{'DOMAINMASTER'}} = "checked='checked'"; $checked{'PREFERREDMASTER'}{'off'} = ''; $checked{'PREFERREDMASTER'}{'on'} = ''; $checked{'PREFERREDMASTER'}{$sambasettings{'PREFERREDMASTER'}} = "checked='checked'"; $checked{'GREEN'}{'off'} = ''; $checked{'GREEN'}{'on'} = ''; $checked{'GREEN'}{$sambasettings{'GREEN'}} = "checked='checked'"; $checked{'BLUE'}{'off'} = ''; $checked{'BLUE'}{'on'} = ''; $checked{'BLUE'}{$sambasettings{'BLUE'}} = "checked='checked'"; $checked{'ORANGE'}{'off'} = ''; $checked{'ORANGE'}{'on'} = ''; $checked{'ORANGE'}{$sambasettings{'ORANGE'}} = "checked='checked'"; $checked{'VPN'}{'off'} = ''; $checked{'VPN'}{'on'} = ''; $checked{'VPN'}{$sambasettings{'VPN'}} = "checked='checked'"; $selected{'MAPTOGUEST'}{$sambasettings{'MAPTOGUEST'}} = "selected='selected'"; $selected{'SECURITY'}{$sambasettings{'SECURITY'}} = "selected='selected'"; ############################################################################################################################ ################################### Aufbau der HTML Seite fr globale Sambaeinstellungen ################################### &Header::openbox('100%', 'center', 'Samba'); print < END ; if ( $message ne "" ) { print "
$message"; } print <
Alle Dienste
END ; my $key = ''; foreach $key (sort keys %servicenames) { print " END ; } print <
$key"; my $shortname = $servicenames{$key}; my $status = &isrunning($shortname); print "$status"; print <

END ; if (&Header::blue_used()) { print < END ; } if (&Header::orange_used()) { print < END ; } print < END ; if ($sambasettings{'WINSSUPPORT'} eq 'off') {print"";} print < END ; if ($sambasettings{'SECURITY'} eq 'user') { print < END ; } if ($sambasettings{'SECURITY'} eq 'user' && $sambasettings{'DOMAINMASTER'} eq 'on') { print < END ; } print <

Basisoptionen
Workgroup:
NetBIOS-Name:
Server-String:
Log Level:
Interfaces:on / off | OpenVpn - $ovpnsettings{'DDEVICE'}
on / off | $Lang::tr{'green'} - $netsettings{'GREEN_DEV'}
on / off | $Lang::tr{'wireless'} - $netsettings{'BLUE_DEV'}
on / off | $Lang::tr{'dmz'} - $netsettings{'ORANGE_DEV'}
weitere

Sicherheitsoptionen
Security:
Map to guest:
Unix Passwort Sync:on / off

Netzwerkoptionen
OS Level:
Remote Announce:
WINS-Server:
WINS-Support:on / off
Local Master:on / off
Domain Master:on / off
Preferred Master:on / off

PDC Optionen


END ; if ($sambasettings{'ACTION'} eq 'globalcaption') { print <
Legende: Einstellungen speichern Auf default zurueck setzen END ; } &Header::closebox(); ############################################################################################################################ ########################################## Benutzerverwaltung fr Usersecurity ############################################# if ($sambasettings{'SECURITY'} eq 'user') { if ($sambasettings{'DOMAINMASTER'} eq 'off') { &Header::openbox('100%', 'center', 'accounting - user Security none PDC mode'); } else { &Header::openbox('100%', 'center', 'accounting - user Security PDC mode'); } print < END ; if ($sambasettings{'DOMAINMASTER'} eq 'off') { print ""; } else { print ""; } print ""; system('/usr/local/bin/sambactrl readsmbpasswd'); open(FILE, "; close(FILE); system('/usr/local/bin/sambactrl locksmbpasswd'); foreach $userentry (sort @user) { @userline = split( /\:/, $userentry ); print " END ; } else { print < END ; } if ($userline[0] =~ /\$/) { print ""; } else { print <
END ; } if ($sambasettings{'DOMAINMASTER'} eq 'on' && $userline[0] =~ /\$/) { print <
END ; } else { print <
END ; } } print <

Benutzerverwaltung
NamePasswortTypStatusOptionen
$userline[0]"; if ($userline[4] =~ /N/) { print "nicht gesetzt"; } else { print "gesetzt"; } if ($sambasettings{'DOMAINMASTER'} eq 'off') { print ""; } else { if ($userline[0] =~ /\$/) { print "PC"; } else { print "User"; } } if ($userline[4] =~ /D/) { print <
END ; if ($sambasettings{'DOMAINMASTER'} eq 'on') { print <
END ; } print <

END ; if ($sambasettings{'ACTION'} eq 'usercaption') { print <
Legende: Benutzer neu anlegen Client Account neu anlegen Benutzer loeschen Client Account loeschen Benutzer aktivieren Benutzer deaktivieren Passwort wechseln Einstellungen speichern END ; } if ($sambasettings{'ACTION'} eq 'userchangepw') { my $username = "$sambasettings{'NAME'}"; my $password = 'samba'; print <

Passwort wechseln
Benutzername
Passwort
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 <

Benutzer neu anlegen
Benutzername
Passwort
Unix Gruppe
Unix Shell
END ; } if ($sambasettings{'ACTION'} eq 'pcadd') { my $pcname = "client\$"; chomp $pcname; $pcname=~s/\s//g; print <

Client Account neu anlegen
Clientname
Unix Gruppe
Unix Shell
END ; } &Header::closebox(); } ############################################################################################################################ ############################################### Verwalten von Freigaben #################################################### &Header::openbox('100%', 'center', 'Shares'); print < END ; foreach $shareentry (sort @Shares) { print < END ; } print <

Shareverwaltung
Names des SharesOptionen
$shareentry

END ; if ($sambasettings{'ACTION'} eq 'sharecaption') { print <
Legende: Share neu anlegen Share bearbeiten Einstellungen speichern Shares zurueck setzen Share loeschen END ; } if ($sambasettings{'ACTION'} eq 'shareadd' || $sambasettings{'ACTION'} eq 'optioncaption' ) { print <

neuen Share anlegen
Anzeige der Optionen fuer Shares

END ; } if ($sambasettings{'ACTION'} eq 'sharechange' || $sambasettings{'ACTION'} eq 'optioncaption2' ) { my $sharename = "$sambasettings{'NAME'}"; chomp $sharename; $sharename=~s/\s//g; for(my $i = 0; $i <= $#Shares; $i++) { chomp $Shares[$i]; $Shares[$i]=~s/\s//g; if ( "$Shares[$i]" eq "$sharename" ) { my $Zeilenbegin = $Zeilen[$i+1]-2; my $Zeilenende = $Zeilen[$i+1]-$Zeilen[$i]; if ( $Zeilen[$i] eq $Zeilen[$#Shares] ) {$Zeilenende = $EOF-$Zeilen[$#Shares]+1;$Zeilenbegin = $EOF-$Zeilen[$#Shares]; $shareoption = qx(tail -$Zeilenende $sharefile | head -$Zeilenbegin);} else {$shareoption = qx(head -$Zeilenbegin $sharefile | tail -$Zeilenende);} } } print <

Share bearbeiten
Anzeige der Optionen fuer Shares

END ; } if ($sambasettings{'ACTION'} eq 'optioncaption' || $sambasettings{'ACTION'} eq 'optioncaption2') { print <
Legende: OptionBedeutung / Beispiel commentKommentar comment = Mein neues Share
pathPfad zum Verzeichnis path = /share/neu
writeableVerzeichnis schreibbar writeable = yes
browseablesichtbar in Verzeichnisliste browsable = yes
userBesitzer der Freigabe user = samba
valid usersListe der Zugriffsberechtigten valid users = samba, user1
write listListe der Schreibberechtigten write list = samba
hosts allownur die angegebenen Hosts drfen das Share benutzen hosts allow = localhost 192.168.1.1 192.168.2.0/24
hosts denyjede Maschine ausser diesen darf das Share benutzen hosts deny = 192.168.1.2 192.168.3.0/24
read listListe der nur Leseberechtigten read list = user1
admin usersListe der Benutzer mit SuperUser Rechten admin users = user1
invalid usersListe der Benutzer denen der Zugriff verweigert wird invalid users = user2
force userStandartbenutzer fuer alle Dateien force user = samba
directory maskUNIX Verzeichnisberchtigung beim Erzeugen directory mask = 0777
create maskUNIX Dateiberchtigung beim Erzeugen create mask = 0777
guest okAnnonymer Zugriff guest ok = yes END ; } &Header::closebox(); ############################################################################################################################ ############################################### Anzeige des Sambastatus #################################################### &Header::openbox('100%', 'center', 'Status'); print <

Samba Status
$Status
END ; &Header::closebox(); ############################################################################################################################ ############################################### Anzeige des Sambastatus #################################################### if ($sambasettings{'ACTION'} eq 'showlog') { $Log = qx(tail -n $sambasettings{'LOGLINES'} /var/log/samba/$sambasettings{'LOG'}); $Log=~s/\n/
/g; } &Header::openbox('100%', 'center', 'Logs'); print <

Loganzeige

anzeige der letzen x Zeilen

$Log

$sambasettings{'LOG'}
END ; &Header::closebox(); &Header::closebigbox(); &Header::closepage(); ############################################################################################################################ ############################################ Subfunktion fr Sambadienste ################################################### 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; }