From aa2870e623d6989bf405db7fa14069e7250707c9 Mon Sep 17 00:00:00 2001 From: ms Date: Thu, 15 Feb 2007 18:17:05 +0000 Subject: [PATCH] ExtraHD! Die Erweiterung um Festplatten schnell einzubinden! git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@420 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- config/extrahd/extrahd.pl | 80 +++++++++++ config/menu/40-services.menu | 5 + html/cgi-bin/extrahd.cgi | 226 +++++++++++++++++++++++++++++++ lfs/configroot | 4 +- make.sh | 2 +- src/install+setup/install/main.c | 2 +- src/misc-progs/Makefile | 5 +- src/misc-progs/extrahdctrl.c | 25 ++++ src/scripts/scanhd | 13 ++ 9 files changed, 358 insertions(+), 4 deletions(-) create mode 100644 config/extrahd/extrahd.pl create mode 100644 html/cgi-bin/extrahd.cgi create mode 100644 src/misc-progs/extrahdctrl.c create mode 100644 src/scripts/scanhd diff --git a/config/extrahd/extrahd.pl b/config/extrahd/extrahd.pl new file mode 100644 index 0000000000..d4782f867e --- /dev/null +++ b/config/extrahd/extrahd.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl +# +# IPFire Scripts +# +# 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; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %extrahdsettings = (); +my $ok = "true"; +my @devices = (); +my @deviceline = (); +my $deviceentry = ""; +my $devicefile = "/var/ipfire/extrahd/devices"; +my $fstab = "/var/ipfire/extrahd/fstab"; + +### Values that have to be initialized +$extrahdsettings{'PATH'} = ''; +$extrahdsettings{'FS'} = ''; +$extrahdsettings{'DEVICE'} = ''; +$extrahdsettings{'ACTION'} = ''; + +open( FILE, "< $devicefile" ) or die "Unable to read $devicefile"; +@devices = ; +close FILE; + +############################################################################################################################ +############################################################################################################################ + +print "$ARGV[0] $ARGV[1]"; + +if ( "$ARGV[0]" eq "mount" ) { + system("/bin/cp -f /etc/fstab $fstab"); + + foreach $deviceentry (sort @devices) + { + @deviceline = split( /\;/, $deviceentry ); + if ( "$ARGV[1]" eq "$deviceline[2]" ) { + print "Insert /dev/$deviceline[0] ($deviceline[1]) --> $deviceline[2] into /etc/fstab!\n"; + unless ( -d $deviceline[2] ) { system("/bin/mkdir -p $deviceline[2] && chmod 0777 $deviceline[2]"); } + open(FILE, ">>$fstab"); + print FILE "/dev/$deviceline[0]\t$deviceline[2]\t$deviceline[1]\tdefaults\t0\t0\n"; + close(FILE); + } + } + + system("/bin/cp -f $fstab /etc/fstab"); + if ( `/bin/mount -a` ) { + exit(0); + } else { + exit(1); + } + +} elsif ( "$ARGV[0]" eq "umount" ) { + system("/bin/umount $ARGV[1]"); + if ( ! `/bin/mount | /bin/fgrep $ARGV[1]` ) { + system("/bin/cp -f /etc/fstab $fstab"); + system("/bin/fgrep -v $ARGV[1] <$fstab >/etc/fstab"); + print "Succesfully umounted $ARGV[1].\n"; + exit(0); + } else { + print "Can't umount $ARGV[1].\n"; + exit(1); + } + +} else { + print "Usage: $0 (mount|umount) mountpoint\n"; +} + +############################################################################################################################ +############################################################################################################################ diff --git a/config/menu/40-services.menu b/config/menu/40-services.menu index fa1657ef19..4dae63ba11 100644 --- a/config/menu/40-services.menu +++ b/config/menu/40-services.menu @@ -30,3 +30,8 @@ 'uri' => '/cgi-bin/ids.cgi', 'title' => "$tr{'intrusion detection system'}", }; + $subservices->{'70.extrahd'} = {'caption' => "ExtraHD"}, + 'enabled' => 1, + 'uri' => '/cgi-bin/extrahd.cgi', + 'title' => "ExtraHD", + }; \ No newline at end of file diff --git a/html/cgi-bin/extrahd.cgi b/html/cgi-bin/extrahd.cgi new file mode 100644 index 0000000000..0afe9ef6e6 --- /dev/null +++ b/html/cgi-bin/extrahd.cgi @@ -0,0 +1,226 @@ +#!/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 %extrahdsettings = (); +my $message = ""; +my $errormessage = ""; +my $size = ""; +my $ok = "true"; +my @tmp = (); +my @tmpline = (); +my $tmpentry = ""; +my @devices = (); +my @deviceline = (); +my $deviceentry = ""; +my @scans = (); +my @scanline = (); +my $scanentry = ""; +my @partitions = (); +my @partitionline = (); +my $partitionentry = ""; +my $devicefile = "/var/ipfire/extrahd/devices"; +my $scanfile = "/var/ipfire/extrahd/scan"; +my $partitionsfile = "/var/ipfire/extrahd/partitions"; +system("/usr/local/bin/scanhd ide"); +system("/usr/local/bin/scanhd partitions"); + +&Header::showhttpheaders(); + +### Values that have to be initialized +$extrahdsettings{'PATH'} = ''; +$extrahdsettings{'FS'} = ''; +$extrahdsettings{'DEVICE'} = ''; +$extrahdsettings{'ACTION'} = ''; + +&General::readhash("${General::swroot}/extrahd/settings", \%extrahdsettings); +&Header::getcgihash(\%extrahdsettings); + +&Header::openpage('ExtraHD', 1, ''); +&Header::openbigbox('100%', 'left', '', $errormessage); + +############################################################################################################################ +############################################################################################################################ + +if ($extrahdsettings{'ACTION'} eq $Lang::tr{'add'}) +{ + open( FILE, "< $devicefile" ) or die "Unable to read $devicefile"; + @devices = ; + close FILE; + foreach $deviceentry (sort @devices) + { + @deviceline = split( /\;/, $deviceentry ); + if ( "$extrahdsettings{'PATH'}" eq "$deviceline[2]" ) { + $ok = "false"; + $errormessage = "You can't mount $extrahdsettings{'DEVICE'} to $extrahdsettings{'PATH'}, because there is already a device mounted."; + } + if ( "$extrahdsettings{'PATH'}" eq "/" ) { + $ok = "false"; + $errormessage = "You can't mount $extrahdsettings{'DEVICE'} to root /."; + } + } + + if ( "$ok" eq "true" ) { + open(FILE, ">> $devicefile" ) or die "Unable to write $devicefile"; + print FILE <; + close FILE; + open( FILE, "> $devicefile" ) or die "Unable to write $devicefile"; + foreach $deviceentry (sort @tmp) + { + @tmpline = split( /\;/, $deviceentry ); + if ( $tmpline[2] ne $extrahdsettings{'PATH'} ) + { + print FILE $deviceentry; + } + } + close FILE; + } else { + $errormessage = "Can't umount $extrahdsettings{'PATH'}. Maybe the device is in use?"; + } +} + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage\n"; + print " \n"; + &Header::closebox(); +} + +############################################################################################################################ +############################################################################################################################ + +&Header::openbox('100%', 'center', 'ExtraHD'); + open( FILE, "< $devicefile" ) or die "Unable to read $devicefile"; + @devices = ; + close FILE; + print < +END +; + foreach $deviceentry (sort @devices) + { + @deviceline = split( /\;/, $deviceentry ); + my $color="$Header::colourred"; + if ( `/bin/mount | /bin/fgrep $deviceline[2] | /bin/fgrep /dev/$deviceline[0]` ) { + $color=$Header::colourgreen; + } + print <  + /dev/$deviceline[0] + $deviceline[1] + $deviceline[2] + +
+ + + + + +
+END +; + } + print < +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'center', 'Gefundene Laufwerke'); + print < +END +; + open( FILE, "< $scanfile" ) or die "Unable to read $scanfile"; + @scans = ; + close FILE; + open( FILE, "< $partitionsfile" ) or die "Unable to read $partitionsfile"; + @partitions = ; + close FILE; + foreach $scanentry (sort @scans) + { + @scanline = split( /\;/, $scanentry ); + print <  + /dev/$scanline[0] + $scanline[1] +END +; + foreach $partitionentry (sort @partitions) + { + @partitionline = split( /\;/, $partitionentry ); + if ( "$partitionline[0]" eq "$scanline[0]" ) { + $size = int($partitionline[1] / 1024); + print <$Lang::tr{'size'} $size MB +   +   +END +; + } + } + + foreach $partitionentry (sort @partitions) + { + @partitionline = split( /\;/, $partitionentry ); + if (( "$partitionline[0]" =~ /^$scanline[0]/ ) && ! ( "$partitionline[0]" eq "$scanline[0]" )) { + $size = int($partitionline[1] / 1024); + print < + /dev/$partitionline[0] + $Lang::tr{'size'} $size MB + + + + + + + + +END +; + } + } + } + + print <If your device isn't listed here, you need to install or load the driver.
If you can see your device but no partitions you have to create them first. + +END +; +&Header::closebox(); + +&Header::closebigbox(); +&Header::closepage(); diff --git a/lfs/configroot b/lfs/configroot index a70dd4f710..9e0da0b002 100644 --- a/lfs/configroot +++ b/lfs/configroot @@ -53,7 +53,7 @@ $(TARGET) : # Create all directories for i in addon-lang alcatelusb auth backup ca certs cnx_pci connscheduler crls ddns dhcp dhcpc dmzholes \ - eagle-usb eciadsl ethernet isdn key langs logging main mbmon menu.d modem net-traffic nfs optionsfw outgoing/bin patches pakfire portfw \ + eagle-usb eciadsl ethernet extrahd/bin isdn key langs logging main mbmon menu.d modem net-traffic nfs optionsfw outgoing/bin patches pakfire portfw \ ppp private proxy/advanced qos/bin red remote snort time urlfilter/autoupdate urlfilter/bin upnp vpn wakeonlan wireless xtaccess ; do \ mkdir -p $(CONFIG_ROOT)/$$i; \ done @@ -62,6 +62,7 @@ $(TARGET) : for i in auth/users backup/include.user backup/exclude.user \ certs/index.txt ddns/config ddns/noipsettings ddns/settings ddns/ipcache dhcp/settings \ dhcp/fixleases dhcp/advoptions dmzholes/config ethernet/aliases ethernet/settings \ + extrahd/scan extrahd/devices extrahd/partitions extrahd/settings isdn/settings main/hosts main/settings optionsfw/settings outgoing/settings outgoing/rules pakfire/settings \ portfw/config ppp/settings-1 ppp/settings-2 ppp/settings-3 ppp/settings-4 \ ppp/settings-5 ppp/settings proxy/settings proxy/advanced/settings remote/settings qos/settings qos/classes qos/subclasses qos/level7config qos/portconfig \ @@ -81,6 +82,7 @@ $(TARGET) : cp $(DIR_SRC)/config/cfgroot/backup-exclude.hardware $(CONFIG_ROOT)/backup/exclude.hardware cp $(DIR_SRC)/config/cfgroot/connscheduler-lib.pl $(CONFIG_ROOT)/connscheduler/lib.pl cp $(DIR_SRC)/config/cfgroot/connscheduler.conf $(CONFIG_ROOT)/connscheduler + cp $(DIR_SRC)/config/extrahd/* $(CONFIG_ROOT)/extrahd/bin/ cp $(DIR_SRC)/config/cfgroot/mbmon-settings $(CONFIG_ROOT)/mbmon/settings cp $(DIR_SRC)/config/menu/* $(CONFIG_ROOT)/menu.d/ cp $(DIR_SRC)/config/cfgroot/modem-defaults $(CONFIG_ROOT)/modem/defaults diff --git a/make.sh b/make.sh index 63ffa6edb9..e7493fda87 100644 --- a/make.sh +++ b/make.sh @@ -582,7 +582,7 @@ buildpackages() { for i in $IPFVER do if [ $i == "devel" ]; then - if [ ! -f ipfire-$VER.i586-devel.iso ]; then + if [ ! -e ipfire-$VERSION.i586-devel.iso ]; then ipfiremake cdrom ED=$i fi else diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c index ef3344bca9..926976585c 100644 --- a/src/install+setup/install/main.c +++ b/src/install+setup/install/main.c @@ -191,7 +191,7 @@ int main(int argc, char *argv[]) int cdmounted = 0; /* Loop flag for inserting a cd. */ int rc = 0; char commandstring[STRING_SIZE]; - char *installtypes[] = { "CDROM", "HTTP/FTP", NULL }; + char *installtypes[] = { "CDROM/USB", "HTTP/FTP", NULL }; int installtype = CDROM_INSTALL; char insertmessage[STRING_SIZE]; char insertdevnode[STRING_SIZE]; diff --git a/src/misc-progs/Makefile b/src/misc-progs/Makefile index ef1f360938..309df9ab0b 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 + redctrl extrahdctrl install : all install -m 755 $(PROGS) /usr/local/bin @@ -46,6 +46,9 @@ qosctrl: qosctrl.c setuid.o ../install+setup/libsmooth/varval.o redctrl: redctrl.c setuid.o ../install+setup/libsmooth/varval.o $(COMPILE) -I../install+setup/libsmooth/ redctrl.c setuid.o ../install+setup/libsmooth/varval.o -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 $@ + 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/extrahdctrl.c b/src/misc-progs/extrahdctrl.c new file mode 100644 index 0000000000..1d5b960190 --- /dev/null +++ b/src/misc-progs/extrahdctrl.c @@ -0,0 +1,25 @@ +/* This file is part of the IPFire Firewall. + * + * This program is distributed under the terms of the GNU General Public + * Licence. See the file COPYING for details. + * + */ + +#include +#include +#include +#include +#include +#include +#include "setuid.h" + +int main(int argc, char *argv[]) { + + char command[512]; + if (!(initsetuid())) + exit(1); + + snprintf(command, 512, "/var/ipfire/extrahd/bin/extrahd.pl %s %s", argv[1], argv[2]); + safe_system("chmod 755 /var/ipfire/extrahd/bin/extrahd.pl 2>&1 >/dev/null"); + safe_system(command); +} diff --git a/src/scripts/scanhd b/src/scripts/scanhd new file mode 100644 index 0000000000..fbee30a55a --- /dev/null +++ b/src/scripts/scanhd @@ -0,0 +1,13 @@ +#!/bin/bash + +case "$1" in + ide) + /sbin/kudzu -qps -c HD | egrep "desc|device" | awk -F': ' '{print $2}' | sed -e '/"$/a\\' -e "s/$/\;/g" | tr "\n" "XX" | sed -e "s/XX/\n/g" -e "s/\;X/\;/g" > /var/ipfire/extrahd/scan + ;; + partitions) + cat /proc/partitions | awk '{print $4 ";" $3 ";"}' | grep -v name | grep -v "^;;$" > /var/ipfire/extrahd/partitions + ;; + *) + echo "Usage: $0 (ide|partitions)" + ;; +esac -- 2.39.2