Sambactrl und samba.cgi von Maniacikarus

git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@432 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8
This commit is contained in:
ms
2007-02-24 22:10:57 +00:00
parent bcbb829a35
commit 14cc7eac2e
3 changed files with 297 additions and 34 deletions

View 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<75>berpr<70>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 <<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 <20>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
{

View 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 $@

107
src/misc-progs/sambactrl.c Normal file
View File

@@ -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;
}
}