From: ms Date: Sat, 24 Feb 2007 22:10:57 +0000 (+0000) Subject: Sambactrl und samba.cgi von Maniacikarus X-Git-Tag: v2.3-beta1~823 X-Git-Url: http://git.ipfire.org/?p=people%2Fpmueller%2Fipfire-2.x.git;a=commitdiff_plain;h=14cc7eac2ecc5ec2cb3c97fa734a3fe9a88f53f5 Sambactrl und samba.cgi von Maniacikarus git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@432 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- diff --git a/html/cgi-bin/samba.cgi b/html/cgi-bin/samba.cgi index 05be43f203..e71466a914 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); ############################################################################################################################ -############################################################################################################################ - -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 <${General::swroot}/samba/shares") or die "Can't delete the share settings: $!"; +flock (FILE, 2); +print FILE <BenutzernamePasswortStatusOptionen 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 SharesOptionen 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 309df9ab0b..7abaa3e603 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 0000000000..4f3f248bd7 --- /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; + } +}