diff --git a/html/cgi-bin/samba.cgi b/html/cgi-bin/samba.cgi
index 05be43f20..e71466a91 100644
--- a/html/cgi-bin/samba.cgi
+++ b/html/cgi-bin/samba.cgi
@@ -22,22 +22,23 @@ my %netsettings = ();
my %ovpnsettings = ();
my $message = "";
my $errormessage = "";
-my $shareentry = "";
-my @shares = ();
-my @shareline = ();
my $shareconfigentry = "";
my @sharesconfig = ();
my @shareconfigline = ();
+my $shareoption = '';
+my $defaultoption= "[Share]\npath = /shares/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 $sharefile = "/var/ipfire/samba/shares";
my $userfile = "/var/ipfire/samba/private/smbpasswd";
&General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
&General::readhash("${General::swroot}/ovpn/settings", \%ovpnsettings);
+############################################################################################################################
+############################################# Samba Dienste für Statusüberprüfung ##########################################
+
my %servicenames =
(
'SMB Daemon' => 'smbd',
@@ -47,6 +48,27 @@ my %servicenames =
&Header::showhttpheaders();
+############################################################################################################################
+#################################### Initialisierung von Samba Sharess für die Verarbeitung ################################
+
+my @Zeilen= ();
+my @Shares= ();
+my $shareentry = "";
+my @shares = ();
+my @shareline = ();
+my $sharefile = "/var/ipfire/samba/shares";
+my $EOF = qx(cat $sharefile | wc -l);
+
+@shares = `grep -n '^\\[' $sharefile`;
+foreach $shareentry (@shares)
+ {
+ @shareline = split( /\:/, $shareentry );
+ push(@Zeilen,$shareline[0]);push(@Shares,$shareline[1]);
+ }
+
+############################################################################################################################
+#################################### Initialisierung von Samba Variablen für global Settings ###############################
+
$sambasettings{'WORKGRP'} = 'homeip.net';
$sambasettings{'NETBIOSNAME'} = 'IPFIRE';
$sambasettings{'SRVSTRING'} = 'Samba Server running on IPFire 2.0';
@@ -73,16 +95,17 @@ $sambasettings{'ACTION'} = '';
&Header::openbigbox('100%', 'left', '', $errormessage);
############################################################################################################################
-############################################################################################################################
+############################################# Samba Rootskript aufrufe für SU-Actions ######################################
-if ($sambasettings{'ACTION'} eq 'smbuserdisable'){system('/usr/local/bin/sambactrl 1 $sambasettings{"NAME"}');}
-if ($sambasettings{'ACTION'} eq 'smbuserenable'){system('/usr/local/bin/sambactrl 2 $sambasettings{"NAME"}');}
-if ($sambasettings{'ACTION'} eq 'smbuserdelete'){system('/usr/local/bin/sambactrl 3 $sambasettings{"NAME"}');}
-if ($sambasettings{'ACTION'} eq 'smbuseradd'){system('/usr/local/bin/sambactrl 4 $username $password');}
-if ($sambasettings{'ACTION'} eq 'smbchangepw'){system('/usr/local/bin/sambactrl 5 $username $password');}
-if ($sambasettings{'ACTION'} eq 'smbsharechange'){system('/usr/local/bin/sambactrl 7 $sambasettings{"SHARENAME"} $sambasettings{"SHAREOPTION"}');}
-if ($sambasettings{'ACTION'} eq 'smbstart'){system('/usr/local/bin/sambactrl 8');}
-if ($sambasettings{'ACTION'} eq 'smbstop'){system('/usr/local/bin/sambactrl 9');}
+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 'smbuserdelete'){system('/usr/local/bin/sambactrl smbuserdelete $sambasettings{"NAME"}');}
+if ($sambasettings{'ACTION'} eq 'smbuseradd'){system('/usr/local/bin/sambactrl smbuseradd $username $password');}
+if ($sambasettings{'ACTION'} eq 'smbchangepw'){system('/usr/local/bin/sambactrl smbchangepw $username $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');}
+# smbsharechange is directly called by the if clause
############################################################################################################################
############################################## Samba Share neu anlegen #####################################################
@@ -90,7 +113,6 @@ if ($sambasettings{'ACTION'} eq 'smbstop'){system('/usr/local/bin/sambactrl 9');
if ($sambasettings{'ACTION'} eq 'smbshareadd')
{
my $emptyline= "";
- system('/usr/local/bin/sambactrl 6');
open (FILE, ">>${General::swroot}/samba/shares") or die "Can't save the shares settings: $!";
flock (FILE, 2);
@@ -100,10 +122,138 @@ $emptyline
END
;
close FILE;
+system('/usr/local/bin/sambactrl smbsharechange');
+
+ @Zeilen = ();
+ @Shares = ();
+ @shares = `grep -n '^\\[' $sharefile`;
+ foreach $shareentry (@shares)
+ {
+ @shareline = split( /\:/, $shareentry );
+ push(@Zeilen,$shareline[0]);push(@Shares,$shareline[1]);
+ }
}
############################################################################################################################
+################################################## Samba Share löschen #####################################################
+
+if ($sambasettings{'ACTION'} eq 'smbsharedel')
+{
+my $sharebody = '';
+my $sharehead = '';
+my $sharetext = '';
+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]-2;
+ my $Zeilenende = $EOF-$Zeilen[$i+1]+1;
+ my $Zeilenende2 = $Zeilenende-1;
+
+ if ( $Zeilen[$i] eq $Zeilen[$#Shares] )
+ {
+ $sharehead = qx(head -$Zeilenbegin $sharefile);
+ $sharetext = $sharehead;
+ }
+ elsif ($Zeilen[$i] eq 1 )
+ {
+ $sharehead = qx(tail -$Zeilenende $sharefile | head -$Zeilenende2);
+ $sharetext = $sharehead;
+ }
+ else
+ {
+ $sharehead = qx(head -$Zeilenbegin $sharefile);$sharebody = qx(tail -$Zeilenende $sharefile | head -$Zeilenende2);
+ $sharetext = "$sharehead\n$sharebody";
+ }
+ }
+ }
+
+open (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 <| Benutzername | Passwort | Status | Optionen |
END
;
- open( FILE, "< $userfile") or die "Can't read user file: $!";
+
+ system('/usr/local/bin/sambactrl readsmbpasswd');
+ open(FILE, ";
close(FILE);
+ system('/usr/local/bin/sambactrl locksmbpasswd');
foreach $userentry (sort @user)
{
@userline = split( /\:/, $userentry );
@@ -410,6 +570,9 @@ END
&Header::closebox();
}
+
+############################################################################################################################
+############################################### Verwalten von Freigaben ####################################################
&Header::openbox('100%', 'center', 'Shares');
@@ -420,14 +583,7 @@ print <Names des Shares | Optionen |
END
;
- my @Zeilen;
- my @Shares;
- @shares = `grep -n '^\\[' $sharefile`;
- foreach $shareentry (@shares)
- {
- @shareline = split( /\:/, $shareentry );
- push(@Zeilen,$shareline[0]);push(@Shares,$shareline[1]);
- }
+
foreach $shareentry (sort @Shares)
{
@@ -440,7 +596,7 @@ END
|
END
@@ -475,9 +631,6 @@ END
if ($sambasettings{'ACTION'} eq 'shareadd' || $sambasettings{'ACTION'} eq 'optioncaption' )
{
-
-my $defaultoption= "[Share]\npath = /shares/share1\ncomment = Share - Public Access\nbrowseable = yes\nwriteable = yes\ncreate mask = 0777\ndirectory mask = 0777\nguest ok = yes\npublic = yes\nforce user = samba";
-
print <
@@ -499,7 +652,6 @@ END
if ($sambasettings{'ACTION'} eq 'sharechange' || $sambasettings{'ACTION'} eq 'optioncaption2' )
{
my $sharename = "$sambasettings{'NAME'}";
- my $shareoption = '';
chomp $sharename;
$sharename=~s/\s//g;
@@ -511,7 +663,6 @@ if ($sambasettings{'ACTION'} eq 'sharechange' || $sambasettings{'ACTION'} eq 'op
{
my $Zeilenbegin = $Zeilen[$i+1]-2;
my $Zeilenende = $Zeilen[$i+1]-$Zeilen[$i];
- my $EOF = qx(cat $sharefile | wc -l);
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);}
@@ -530,7 +681,9 @@ if ($sambasettings{'ACTION'} eq 'sharechange' || $sambasettings{'ACTION'} eq 'op
|
END
;
@@ -593,7 +746,7 @@ END
&Header::closepage();
############################################################################################################################
-############################################################################################################################
+############################################ Subfunktion für Sambadienste ##################################################
sub isrunning
{
diff --git a/src/misc-progs/Makefile b/src/misc-progs/Makefile
index 309df9ab0..7abaa3e60 100644
--- a/src/misc-progs/Makefile
+++ b/src/misc-progs/Makefile
@@ -11,7 +11,7 @@ SUID_PROGS = setdmzholes setportfw setfilters setxtaccess restartdhcp restartsno
restartapplejuice setdate rebuildhosts \
restartsyslogd logwatch openvpnctrl timecheckctrl \
restartwireless getipstat qosctrl launch-ether-wake \
- redctrl extrahdctrl
+ redctrl extrahdctrl sambactrl
install : all
install -m 755 $(PROGS) /usr/local/bin
@@ -49,6 +49,9 @@ redctrl: redctrl.c setuid.o ../install+setup/libsmooth/varval.o
extrahdctrl: extrahdctrl.c setuid.o ../install+setup/libsmooth/varval.o
$(COMPILE) -I../install+setup/libsmooth/ extrahdctrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
+sambactrl: sambactrl.c setuid.o ../install+setup/libsmooth/varval.o
+ $(COMPILE) -I../install+setup/libsmooth/ sambactrl.c setuid.o ../install+setup/libsmooth/varval.o -o $@
+
launch-ether-wake: launch-ether-wake.c setuid.o ../install+setup/libsmooth/varval.o
$(COMPILE) -I../install+setup/libsmooth/ launch-ether-wake.c setuid.o ../install+setup/libsmooth/varval.o -o $@
diff --git a/src/misc-progs/sambactrl.c b/src/misc-progs/sambactrl.c
new file mode 100644
index 000000000..4f3f248bd
--- /dev/null
+++ b/src/misc-progs/sambactrl.c
@@ -0,0 +1,107 @@
+#include
+#include
+#include
+#include "setuid.h"
+
+int main(int argc, char**argv)
+{
+ char commandstring[256];
+
+ if (!(initsetuid()))
+ exit(1);
+
+ // Check what command is asked
+ if (argc==1)
+ {
+ fprintf (stderr, "Missing smbctrl command!\n");
+ return 1;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbuserdisable")==0)
+ {
+ snprintf(commandstring,STRING_SIZE-1,"/usr/bin/smbpasswd -d %s",argv[2]);
+ safe_system(commandstring);
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbuserenable")==0)
+ {
+ snprintf(commandstring,STRING_SIZE-1,"/usr/bin/smbpasswd -e %s",argv[2]);
+ safe_system(commandstring);
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbuserdelete")==0)
+ {
+ snprintf(commandstring,STRING_SIZE-1,"/usr/bin/smbpasswd -x %s",argv[2]);
+ safe_system(commandstring);
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbsafeconf")==0)
+ {
+ safe_system("/bin/cat /var/ipfire/samba/global /var/ipfire/samba/shares > /var/ipfire/samba/smb.conf");
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbglobalreset")==0)
+ {
+ safe_system("/bin/cat /var/ipfire/samba/global.default /var/ipfire/samba/shares > /var/ipfire/samba/smb.conf");
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbsharesreset")==0)
+ {
+ safe_system("/bin/cat /var/ipfire/samba/global /var/ipfire/samba/shares.default > /var/ipfire/samba/smb.conf");
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbrestart")==0)
+ {
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbstop")==0)
+ {
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbstart")==0)
+ {
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbuseradd")==0)
+ {
+ snprintf(commandstring,STRING_SIZE-1,"/usr/sbin/useradd -c 'Samba User' -d /opt/samba -g 2110 -p %s -s /bin/false %s",argv[3],argv[2]);
+ safe_system(commandstring);
+ snprintf(commandstring,STRING_SIZE-1,"/bin/printf '%s\n%s\n' | /usr/local/bin/smbpasswd -as %s",argv[3],argv[3],argv[2]);
+ safe_system(commandstring);
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "smbchangepw")==0)
+ {
+ snprintf(commandstring,STRING_SIZE-1,"/bin/printf '%s\n%s\n' | /usr/local/bin/smbpasswd -as %s",argv[3],argv[3],argv[2]);
+ safe_system(commandstring);
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "readsmbpasswd")==0)
+ {
+ safe_system("/bin/chown root:nobody /var/ipfire/samba/private");
+ safe_system("/bin/chown root:nobody /var/ipfire/samba/private/smbpasswd");
+ safe_system("/bin/chmod 640 /var/ipfire/samba/private/smbpasswd");
+ safe_system("/bin/chmod 650 /var/ipfire/samba/private");
+ return 0;
+ }
+
+ if (argc==2 && strcmp(argv[1], "locksmbpasswd")==0)
+ {
+ safe_system("/bin/chown root:root /var/ipfire/samba/private");
+ safe_system("/bin/chown root:root /var/ipfire/samba/private/smbpasswd");
+ safe_system("/bin/chmod 600 /var/ipfire/samba/private/smbpasswd");
+ safe_system("/bin/chmod 600 /var/ipfire/samba/private");
+ return 0;
+ }
+}