Sambactrl und samba.cgi von Maniacikarus
authorms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Sat, 24 Feb 2007 22:10:57 +0000 (22:10 +0000)
committerms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Sat, 24 Feb 2007 22:10:57 +0000 (22:10 +0000)
git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@432 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8

html/cgi-bin/samba.cgi
src/misc-progs/Makefile
src/misc-progs/sambactrl.c [new file with mode: 0644]

index 05be43f..e71466a 100644 (file)
@@ -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);
 
 ############################################################################################################################
-############################################################################################################################
-
-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');}
+############################################# Samba Rootskript aufrufe für 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 '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 <<END
+$sharetext
+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]);
+ }
+}
 ############################################################################################################################
+################################################## Sambashare ändern #######################################################
+
+if ($sambasettings{'ACTION'} eq 'smbsharechange')
+{
+my $sharebody = '';
+my $sharehead = '';
+my $sharename = "$sambasettings{'NAME'}";
+my $sharetext = '';
+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 <<END
+$sharetext
+$sambasettings{'SHAREOPTION'}
+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]);
+ }
+}
+
+############################################################################################################################
+##################################### Umsetzen der Werte von Checkboxen und Dropdowns ######################################
 
 if ($sambasettings{'ACTION'} eq $Lang::tr{'save'})
 {
@@ -115,7 +265,7 @@ if ($checked{'VPN'}){ $sambasettings{'INTERFACES'} = "$sambasettings{'INTERFACES
 if ($sambasettings{'OTHERINTERFACES'} ne ''){ $sambasettings{'INTERFACES'} = "$sambasettings{'INTERFACES'} $sambasettings{'OTHERINTERFACES'}";}
 
 ############################################################################################################################
-############################################################################################################################   
+############################################# Schreiben der Samba globals ##################################################
 
   &General::writehash("${General::swroot}/samba/settings", \%sambasettings);
 
@@ -174,6 +324,9 @@ if ($errormessage) {
         &Header::closebox();
                   }
 
+############################################################################################################################
+########################################## Aktivieren von Checkboxen und Dropdowns #########################################
+
 $checked{'WINSSUPPORT'}{$sambasettings{'WINSSUPPORT'}} = "checked='checked' ";
 $checked{'GREEN'}{$sambasettings{'GREEN'}} = "checked='checked' ";
 $checked{'BLUE'}{$sambasettings{'BLUE'}} = "checked='checked' ";
@@ -184,7 +337,7 @@ $selected{'MAPTOGUEST'}{$sambasettings{'MAPTOGUEST'}} = "selected='selected'";
 $selected{'SECURITY'}{$sambasettings{'SECURITY'}} = "selected='selected'";
 
 ############################################################################################################################
-############################################################################################################################
+################################### Aufbau der HTML Seite für globale Sambaeinstellungen ###################################
 
 &Header::openbox('100%', 'center', 'Samba');
 print <<END
@@ -278,6 +431,9 @@ END
 ;
 &Header::closebox();
 
+############################################################################################################################
+########################################## Benutzerverwaltung für Usersecurity #############################################
+
 if ($sambasettings{'SECURITY'} eq 'user')
 {
 &Header::openbox('100%', 'center', 'accounting - user Security');
@@ -290,9 +446,13 @@ print <<END
         <tr><td><u>Benutzername</u></td><td><u>Passwort</u></td><td><u>Status</u></td><td colspan='3' width="5"><u>Optionen</u></td></tr>
 END
 ;
-        open( FILE, "< $userfile") or die "Can't read user file: $!";
+
+        system('/usr/local/bin/sambactrl readsmbpasswd');
+        open(FILE, "</var/ipfire/samba/private/smbpasswd") or die "Can't read user file: $!";
+        flock (FILE, 2);
         @user = <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 <<END
         <tr><td><u>Names des Shares</u></td><td colspan='2' width="5"><u>Optionen</u></td></tr>
 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
             </td></form>
             <td><form method='post' action='$ENV{'SCRIPT_NAME'}'>
                  <input type='hidden' name='NAME' value='$shareentry'>
-                 <input type='hidden' name='ACTION' value='Loeschen'>
+                 <input type='hidden' name='ACTION' value='smbsharedel'>
                  <input type='image' alt='Loeschen' src='/images/delete.gif'>
             </td></form><tr>
 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 <<END
         <hr>
         <table width='500px' cellspacing='0'><br>
@@ -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
         <tr><td colspan='2' align='center'><textarea name="SHAREOPTION" cols="50" rows="15" Wrap="off">$shareoption</textarea></td></tr>
         </table>
         <table width='50px' cellspacing='0'><br>
-        <tr><td align='center'><input type='submit' name='ACTION' value='smbsharechange'></td></tr></form>
+        <tr><td align='center'>
+                                <input type='hidden' name='NAME' value='$sharename'>
+                                <input type='submit' name='ACTION' value='smbsharechange'></td></tr></form>
         </table>
 END
 ;
@@ -593,7 +746,7 @@ END
 &Header::closepage();
 
 ############################################################################################################################
-############################################################################################################################
+############################################ Subfunktion für Sambadienste ##################################################
 
 sub isrunning
 {
index 309df9a..7abaa3e 100644 (file)
@@ -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 (file)
index 0000000..4f3f248
--- /dev/null
@@ -0,0 +1,107 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#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;
+        }
+}