957 lines
36 KiB
Plaintext
957 lines
36 KiB
Plaintext
|
#!/usr/bin/perl -wU
|
|||
|
|
|||
|
#----------------------------------------------------------------------
|
|||
|
# heading : Configuration
|
|||
|
# description : DHCP manager
|
|||
|
# navigation : 2000 2500
|
|||
|
#
|
|||
|
# Copyright (c) 2003 Thierry Quaak thierry@quaak.net
|
|||
|
# 2014 Stephane de Labrusse stephdl@de-labrusse.fr
|
|||
|
#----------------------------------------------------------------------
|
|||
|
|
|||
|
my $fm = esmith::FormMagick->new();
|
|||
|
$fm->parse_xml();
|
|||
|
|
|||
|
###Call Modules
|
|||
|
use strict;
|
|||
|
use CGI ':all';
|
|||
|
use CGI::Carp qw(fatalsToBrowser);
|
|||
|
use esmith::cgi;
|
|||
|
use esmith::util;
|
|||
|
use esmith::templates;
|
|||
|
use esmith::ConfigDB;
|
|||
|
use esmith::AccountsDB;
|
|||
|
use esmith::FormMagick;
|
|||
|
use Net::Ping;
|
|||
|
use esmith::util::network qw(:all);
|
|||
|
use Socket qw( inet_aton );
|
|||
|
|
|||
|
###Declare function prototypes
|
|||
|
sub Main_Display ($$);
|
|||
|
sub Load_leases ($);
|
|||
|
sub Main_Save ($);
|
|||
|
sub Del_Lease ($);
|
|||
|
sub Perform_Del_Lease ($);
|
|||
|
sub Wake_Up ($);
|
|||
|
sub Perform_Wake_Up ($);
|
|||
|
sub Message ($$);
|
|||
|
sub Global_WinPopup ($);
|
|||
|
sub Perform_Message ($);
|
|||
|
sub Table_IP ($$);
|
|||
|
sub Scan_Local_Network ($);
|
|||
|
sub Del_all_Lease ($);
|
|||
|
sub Perform_del_all_Lease ($);
|
|||
|
sub Save_checkip ($);
|
|||
|
|
|||
|
|
|||
|
### Clear PATH and related environment variables so that calls to
|
|||
|
### external programs do not cause results to be tainted. See
|
|||
|
### "perlsec" manual page for details.
|
|||
|
BEGIN {
|
|||
|
$ENV {'PATH'} = '';
|
|||
|
$ENV {'SHELL'} = '/bin/bash';
|
|||
|
delete $ENV {'ENV'};
|
|||
|
}
|
|||
|
|
|||
|
###Define package global to SME configuration paramters using "old" method.
|
|||
|
###We are using this method, over esmith::ConfigDB, to satisfy syntax in
|
|||
|
###esmith::cgi
|
|||
|
our %conf = ();
|
|||
|
tie %conf, 'esmith::config';
|
|||
|
our @liste_computer ;
|
|||
|
our @liste_connected ;
|
|||
|
|
|||
|
###Change UID -- not sure what we are doing this, but all panels seem to
|
|||
|
###call this function.
|
|||
|
esmith::util::setRealToEffective ();
|
|||
|
|
|||
|
our %status = ('enabled' => $fm->localise('ENABLED'),
|
|||
|
'disabled' => $fm->localise('DISABLED')
|
|||
|
);
|
|||
|
|
|||
|
our %check = ('enabled' => $fm->localise('ENABLED'),
|
|||
|
'disabled' => $fm->localise('DISABLED')
|
|||
|
);
|
|||
|
|
|||
|
###Restrict uploads to form submittals only
|
|||
|
$CGI::POST_MAX=1024 * 100; # max 100K posts
|
|||
|
$CGI::DISABLE_UPLOADS = 1; # no uploads
|
|||
|
|
|||
|
###Examine state parameter and display the appropriate form
|
|||
|
my $q = new CGI;
|
|||
|
if (! grep (/^state$/, $q->param)){ Main_Display($q, '');}
|
|||
|
elsif ($q->param ('state') eq "main_display"){Main_Display ($q,'');}
|
|||
|
elsif ($q->param ('state') eq $fm->localise('REFRESH')){Table_IP ($q, '');}
|
|||
|
elsif ($q->param ('state') eq "main_save"){Main_Save ($q);}
|
|||
|
elsif ($q->param ('state') eq "del_lease"){Del_Lease ($q);}
|
|||
|
elsif ($q->param ('state') eq "perform_del_lease"){Perform_Del_Lease ($q);}
|
|||
|
elsif ($q->param ('state') eq "wake_up"){Wake_Up ($q);}
|
|||
|
elsif ($q->param ('state') eq "perform_wake_up"){Perform_Wake_Up ($q);}
|
|||
|
elsif ($q->param ('state') eq $fm->localise('GLOBAL_WINPOPUP')){Global_WinPopup ($q);}
|
|||
|
elsif ($q->param ('state') eq "message"){Message ($q,'');}
|
|||
|
elsif ($q->param ('state') eq "perform_message"){Perform_Message ($q);}
|
|||
|
elsif ($q->param ('state') eq $fm->localise('CONNECTED_IP')){Table_IP ($q,'');}
|
|||
|
elsif ($q->param ('state') eq $fm->localise('SCAN_YOUR_NETWORK')){Scan_Local_Network ($q);}
|
|||
|
elsif ($q->param ('state') eq $fm->localise('REMOVE_ALL_LEASES')){Del_all_Lease ($q);}
|
|||
|
elsif ($q->param ('state') eq $fm->localise('REMOVE_ALL_LEASES_ACTION')){Perform_del_all_Lease ($q);}
|
|||
|
elsif ($q->param ('state') eq 'Save_checkIP'){Save_checkip ($q);}
|
|||
|
else{esmith::cgi::genStateError ($q, \%conf);}
|
|||
|
exit (0);
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE TO SHOW MAIN PANEL
|
|||
|
#===============================================================================
|
|||
|
sub Main_Display ($$){
|
|||
|
|
|||
|
###Pull cgi object from parameters array
|
|||
|
my $q = shift;
|
|||
|
my @computer;
|
|||
|
my $status ;
|
|||
|
|
|||
|
###Pull action message, if any, from parameters array
|
|||
|
my $action_message = shift;
|
|||
|
|
|||
|
###Retrieve SME configuration entry for dhcpd
|
|||
|
my $dbh_sme = esmith::ConfigDB->open('/home/e-smith/db/configuration');
|
|||
|
my %sme_conf = $dbh_sme->get('dhcpd')->props;
|
|||
|
|
|||
|
###Display Main Panel Title
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('DHCPD_TITLE'));
|
|||
|
|
|||
|
###Check to see if we just processed a panel action. If so, display
|
|||
|
###action message and bail.
|
|||
|
if ($action_message) {
|
|||
|
print $q->h3 ($fm->localise('STATUS_REPORT') . " $action_message");
|
|||
|
}
|
|||
|
|
|||
|
#------------------------------------------------------------
|
|||
|
# Start DHCP client Panel
|
|||
|
#------------------------------------------------------------
|
|||
|
print $q->p ('');
|
|||
|
print $q->startform (-method => 'POST',
|
|||
|
-action => $q->url (-absolute => 1));
|
|||
|
print $q->Tr (esmith::cgi::genButtonRow ($q,$q->submit (-name => 'state',-value => $fm->localise('CONNECTED_IP'))));
|
|||
|
|
|||
|
print $q->Tr (esmith::cgi::genButtonRow ($q,$q->submit (-name => 'state',-value => $fm->localise('SCAN_YOUR_NETWORK'))));
|
|||
|
|
|||
|
print $q->Tr (esmith::cgi::genButtonRow ($q,$q->submit (-name => 'state',-value => $fm->localise('GLOBAL_WINPOPUP'))));
|
|||
|
|
|||
|
print $q->hidden (-name => 'liste_connected', -override => 1, -default => "@liste_connected");
|
|||
|
|
|||
|
|
|||
|
#------------------------------------------------------------
|
|||
|
# Start DHCP daemon Panel
|
|||
|
#------------------------------------------------------------
|
|||
|
print $q->hr;
|
|||
|
print $q->h3 ($fm->localise('DHCPD_SETTINGS_TITLE'));
|
|||
|
|
|||
|
if (! $sme_conf{'winscustom'} ) {
|
|||
|
$sme_conf{'winscustom'} = 'disabled' ;
|
|||
|
}
|
|||
|
if (! $sme_conf{'dnscustom'} ) {
|
|||
|
$sme_conf{'dnscustom'} = 'disabled' ;
|
|||
|
}
|
|||
|
if ( ! $sme_conf{'leasetime'} )
|
|||
|
{ $sme_conf{'leasetime'} = "86400" ;
|
|||
|
}
|
|||
|
if (! $sme_conf{'gatewaycustom'} ) {
|
|||
|
$sme_conf{'gatewaycustom'} = 'disabled' ;
|
|||
|
}
|
|||
|
#check the status (up or down) of dhcp client
|
|||
|
print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
|
|||
|
esmith::cgi::genWidgetRow ($q, $fm->localise('CHECK_CLIENT_STATUS'),
|
|||
|
$q->popup_menu (-name => 'dhcp_check',
|
|||
|
-values => ['disabled', 'enabled'],
|
|||
|
-default => $sme_conf{'check'},
|
|||
|
-labels => \%check)) );
|
|||
|
|
|||
|
# - modofication des plage DHCP
|
|||
|
print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
|
|||
|
esmith::cgi::genWidgetRow ($q, $fm->localise('STATUS_DHCP_SERVER'),
|
|||
|
$q->popup_menu (-name => 'dhcp_enable',
|
|||
|
-values => ['enabled', 'disabled'],
|
|||
|
-default => $sme_conf{'status'},
|
|||
|
-labels => \%status)) ,
|
|||
|
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('DHCP_START'),
|
|||
|
'dhcp_start',
|
|||
|
$sme_conf{'start'}) ,
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('DHCP_END') ,
|
|||
|
'dhcp_end',
|
|||
|
$sme_conf{'end'}),
|
|||
|
|
|||
|
esmith::cgi::genTextRow ($q,
|
|||
|
$q->p ($fm->localise('CUSTOM_WINSERVER_TITLE'))),
|
|||
|
esmith::cgi::genWidgetRow ($q, $fm->localise('CUSTOM_WINSERVER_STATUS'),
|
|||
|
$q->popup_menu (-name => 'dhcp_winscustom',
|
|||
|
-values => ['enabled', 'disabled'],
|
|||
|
-default => $sme_conf{'winscustom'},
|
|||
|
-labels => \%status)),
|
|||
|
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('CUSTOM_WINSERVER_ADDRESS'),
|
|||
|
'dhcp_winsserver',
|
|||
|
$dbh_sme->get_prop('smb','WINSServer')),
|
|||
|
|
|||
|
#### Custom DNS
|
|||
|
esmith::cgi::genTextRow ($q,
|
|||
|
$q->p ($fm->localise('CUSTOM_DNS_TITLE'))),
|
|||
|
esmith::cgi::genWidgetRow ($q, $fm->localise('CUSTOM_DNS_STATUS'),
|
|||
|
$q->popup_menu (-name => 'dhcp_dnscustom',
|
|||
|
-values => ['enabled', 'disabled'],
|
|||
|
-default => $sme_conf{'dnscustom'},
|
|||
|
-labels => \%status)),
|
|||
|
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('PRIMARY_DNS_ADDRESS'),
|
|||
|
'dhcp_dns1server',
|
|||
|
$sme_conf{'dns1server'}),
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('SECONDARY_DNS_ADDRESS'),
|
|||
|
'dhcp_dns2server',
|
|||
|
$sme_conf{'dns2server'}),
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('TERTIARY_DNS_ADDRESS'),
|
|||
|
'dhcp_dns3server',
|
|||
|
$sme_conf{'dns3server'}),
|
|||
|
|
|||
|
#### Custom default Gateway
|
|||
|
esmith::cgi::genTextRow ($q,
|
|||
|
$q->p ($fm->localise('CUSTOM_GATEWAY_TITLE'))),
|
|||
|
esmith::cgi::genWidgetRow ($q, $fm->localise('CUSTOM_GATEWAY_STATUS'),
|
|||
|
$q->popup_menu (-name => 'dhcp_gatewaycustom',
|
|||
|
-values => ['enabled', 'disabled'],
|
|||
|
-default => $sme_conf{'gatewaycustom'},
|
|||
|
-labels => \%status)),
|
|||
|
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('CUSTOM_GATEWAY_ADDRESS'),
|
|||
|
'dhcp_gateway',
|
|||
|
$sme_conf{'gateway'}),
|
|||
|
|
|||
|
#dhcp LEASE SET UP
|
|||
|
esmith::cgi::genTextRow ($q,
|
|||
|
$q->p ($fm->localise('CUSTOM_LEASETIME_TITLE'))),
|
|||
|
esmith::cgi::genNameValueRow ($q,
|
|||
|
$fm->localise('CUSTOM_LEASETIME'),
|
|||
|
'dhcp_leasetime',
|
|||
|
$sme_conf{'leasetime'})
|
|||
|
);
|
|||
|
print '</table>';
|
|||
|
|
|||
|
print $q->start_table ({width => "100%", -class => "sme-noborders"}),
|
|||
|
"\n";
|
|||
|
print esmith::cgi::genButtonRow ($q,
|
|||
|
$q->submit (-name => 'action', -value => $fm->localise('SAVE/RESTART')));
|
|||
|
|
|||
|
print $q->end_table,"\n";
|
|||
|
print $q->hidden (
|
|||
|
-name => 'state',
|
|||
|
-override => 1,
|
|||
|
-default => 'main_save'
|
|||
|
),"\n";
|
|||
|
print $q->endform;
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Process Save From Main Panel
|
|||
|
#===============================================================================
|
|||
|
sub Main_Save ($){
|
|||
|
|
|||
|
##Pull CGI object from parameters array
|
|||
|
my $q = shift;
|
|||
|
|
|||
|
###Build Hash of config parameters to update from cgi submit
|
|||
|
my $dhcpd_status = $q->param ('dhcp_enable');
|
|||
|
my $dhcpd_winscustom = $q->param ('dhcp_winscustom');
|
|||
|
my $dhcpd_check = $q->param ('dhcp_check');
|
|||
|
my $dhcpd_start = $q->param ('dhcp_start');
|
|||
|
my $dhcpd_end = $q->param ('dhcp_end');
|
|||
|
my $dhcpd_winsserver = $q->param ('dhcp_winsserver');
|
|||
|
my $dhcpd_leasetime = $q->param ('dhcp_leasetime');
|
|||
|
my $dhcpd_dnscustom = $q->param ('dhcp_dnscustom');
|
|||
|
my $dhcpd_dns1server = $q->param ('dhcp_dns1server');
|
|||
|
my $dhcpd_dns2server = $q->param ('dhcp_dns2server');
|
|||
|
my $dhcpd_dns3server = $q->param ('dhcp_dns3server');
|
|||
|
my $dhcpd_gatewaycustom = $q->param ('dhcp_gatewaycustom');
|
|||
|
my $dhcpd_gateway = $q->param ('dhcp_gateway');
|
|||
|
|
|||
|
###Update SME configuration dbase
|
|||
|
my $dbh_sme = esmith::ConfigDB->open('/home/e-smith/db/configuration');
|
|||
|
|
|||
|
##Initiate get method --> create record object
|
|||
|
my $sme_record = $dbh_sme->get('dhcpd');
|
|||
|
#get localip of server
|
|||
|
my $local_ip = $dbh_sme->get_value('LocalIP');
|
|||
|
|
|||
|
##Set status of service
|
|||
|
$sme_record->set_prop('status', $dhcpd_status);
|
|||
|
$sme_record->set_prop('check' , $dhcpd_check);
|
|||
|
$sme_record->set_prop('winscustom', $dhcpd_winscustom);
|
|||
|
$sme_record->set_prop('leasetime' , $dhcpd_leasetime);
|
|||
|
$sme_record->set_prop('dnscustom' , $dhcpd_dnscustom);
|
|||
|
$sme_record->set_prop('gatewaycustom' , $dhcpd_gatewaycustom);
|
|||
|
|
|||
|
#checkip to the dhcpserver, perform the save in DB configuration or display an error if value != of a valid ip or if dhcp_start is greater than dhcp_end
|
|||
|
if ($dhcpd_status eq "enabled")
|
|||
|
{
|
|||
|
if ( isValidIP ($dhcpd_start) && isValidIP ($dhcpd_end))
|
|||
|
{
|
|||
|
#check if $dhcpd_start is greater than $dhcpd_end and if yes, display an error message.
|
|||
|
if (inet_aton($dhcpd_start) ge inet_aton($dhcpd_end))
|
|||
|
{
|
|||
|
Main_Display($q, $fm->localise('DHCP_START_GREATER_DHCP_END_ERRORS') . ' (' . $dhcpd_start . '/' . $dhcpd_end .')');
|
|||
|
}
|
|||
|
elsif ( ( (inet_aton($dhcpd_start) le inet_aton($local_ip) ) && ( inet_aton($dhcpd_end)) ge inet_aton($local_ip) ) )
|
|||
|
{
|
|||
|
#display an error if the range of dhcp server include the ip of the server address
|
|||
|
Main_Display($q, $fm->localise('DHCP_RANGE_MUST_NOT_INCLUDE_SERVER_IP') . ' (' . $local_ip . ')');
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
#set value
|
|||
|
my $dhcpd_start = cleanIP($dhcpd_start);
|
|||
|
my $dhcpd_end = cleanIP($dhcpd_end);
|
|||
|
|
|||
|
$sme_record->set_prop('end', $dhcpd_end);
|
|||
|
$sme_record->set_prop('start', $dhcpd_start);
|
|||
|
}
|
|||
|
}
|
|||
|
#if $dhcpd_start or $dhcpd_end are not valid ip then display an error
|
|||
|
else
|
|||
|
{
|
|||
|
Main_Display($q, $fm->localise('DHCP_RANGE_WITH_BAD_IP') . ' (' . $dhcpd_start . '/' . $dhcpd_end .')');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#checkip to the winserver perform the save in DB configuration or display an error if value != of a valid ip
|
|||
|
if ($dhcpd_winscustom eq "enabled")
|
|||
|
{
|
|||
|
|
|||
|
if ( isValidIP ($dhcpd_winsserver) )
|
|||
|
{
|
|||
|
#set value
|
|||
|
my $dhcpd_winsserver = cleanIP($dhcpd_winsserver);
|
|||
|
$dbh_sme->set_prop('smb','WINSServer', $dhcpd_winsserver);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
#if $dhcpd_winsserver is not valid ip then display an error
|
|||
|
Main_Display($q, $fm->localise('WINSSERVER_BAD_IP') . ' (' . $dhcpd_winsserver .')');
|
|||
|
}
|
|||
|
}
|
|||
|
elsif ($dhcpd_winscustom eq "disabled")
|
|||
|
{
|
|||
|
my $delws = $dbh_sme->get('smb');
|
|||
|
$delws->delete_prop('WINSServer');
|
|||
|
}
|
|||
|
|
|||
|
#checkip to the dnsserver custom, perform the save in DB configuration or display an error if value != of a valid ip
|
|||
|
if ($dhcpd_dnscustom eq "enabled")
|
|||
|
{
|
|||
|
#check if $dhcpd_dns1server and ( $dhcpd_dns2server are valid ip or $dhcpd_dns2server = null )
|
|||
|
if ( isValidIP ($dhcpd_dns1server) && (isValidIP($dhcpd_dns2server) || ( $dhcpd_dns2server eq "") ) && (isValidIP($dhcpd_dns3server) || ( $dhcpd_dns3server eq "") ) )
|
|||
|
{
|
|||
|
#set value
|
|||
|
my $dhcpd_dns1server = cleanIP($dhcpd_dns1server);
|
|||
|
$sme_record->set_prop('dns1server' , $dhcpd_dns1server);
|
|||
|
my $dhcpd_dns2server = cleanIP($dhcpd_dns2server);
|
|||
|
$sme_record->set_prop('dns2server' , $dhcpd_dns2server);
|
|||
|
my $dhcpd_dns3server = cleanIP($dhcpd_dns3server);
|
|||
|
$sme_record->set_prop('dns3server' , $dhcpd_dns3server);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
##if $dhcpd_dns1server or $dhcpd_dns2server or $dhcpd_dns3server are not valid ip then display an error
|
|||
|
Main_Display($q, $fm->localise('DNS_SERVER_WITH_BAD_IP') . ' (' . $dhcpd_dns1server . '/' . $dhcpd_dns2server . '/' . $dhcpd_dns3server .')');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#checkip to the gateway_custom perform the save in DB configuration or display an error if value != of a valid ip
|
|||
|
if ($dhcpd_gatewaycustom eq "enabled")
|
|||
|
{
|
|||
|
if ( isValidIP ($dhcpd_gateway) )
|
|||
|
{
|
|||
|
#set value
|
|||
|
my $dhcpd_gateway = cleanIP($dhcpd_gateway);
|
|||
|
$sme_record->set_prop('gateway' , $dhcpd_gateway);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
#if $dhcpd_gateway is not valid ip then display an error
|
|||
|
Main_Display($q, $fm->localise('GATEWAY_BAD_IP') . ' (' . $dhcpd_gateway .')');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
# - 4 expand templates
|
|||
|
# changed to new sme standard signal-event
|
|||
|
system ("/sbin/e-smith/signal-event","workgroup-update") == 0
|
|||
|
or die "Error while saving settings: $!";
|
|||
|
Main_Display($q, $fm->localise('SUCCESSFULLY_SAVED_SETTINGS') );
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
#
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: procedure qui supprime un bail dans le dhcpd.leases
|
|||
|
#===============================================================================
|
|||
|
sub Del_Lease ($){
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Start Panel.
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('REMOVE_A_DHCP_LEASE_TITLE'));
|
|||
|
print $q->h3($fm->localise('REMOVE_A_DHCP_LEASE'));
|
|||
|
|
|||
|
print $q->startform (-method => 'POST', -action => $q->url (-absolute => 1));
|
|||
|
|
|||
|
my $ip = $q->param ('host');
|
|||
|
my $name = $q->param ('name');
|
|||
|
|
|||
|
print $q->p ($fm->localise('REMOVE_A_DHCP_LEASE_ACTION') . ' (' . $name .'/' . $ip .')');
|
|||
|
print $q->p ($q->b ($fm->localise('ARE_YOU_SURE')));
|
|||
|
print $q->submit (-name => 'action', -value => $fm->localise('REMOVE'));
|
|||
|
print $q->hidden (-name => 'host',
|
|||
|
-override => 1,
|
|||
|
-default => $ip
|
|||
|
);
|
|||
|
print $q->hidden (-name => 'name',
|
|||
|
-override => 1,
|
|||
|
-default => $name
|
|||
|
);
|
|||
|
|
|||
|
print $q->hidden (-name => 'state',
|
|||
|
-override => 1,
|
|||
|
-default => 'perform_del_lease');
|
|||
|
|
|||
|
print $q->endform;
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Perform delete lease
|
|||
|
#===============================================================================
|
|||
|
sub Perform_Del_Lease($){
|
|||
|
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Pull entry to delete
|
|||
|
my $ip = $q->param('host');
|
|||
|
my $name = $q->param('name');
|
|||
|
my $name_in_file = '/var/lib/dhcpd/dhcpd.leases' ;
|
|||
|
my $name_tmp_file = '/var/lib/dhcpd/dhcpd.leases.tmp' ;
|
|||
|
my $name_out_file = '/var/lib/dhcpd/dhcpd.leases~' ;
|
|||
|
my $del_current = "0" ;
|
|||
|
|
|||
|
open(INFILE,"<$name_in_file") || die "Read Error $name_in_file, Read: $!";
|
|||
|
open(OUTFILE,">$name_tmp_file") || die "Write error $name_in_file, Write: $!";
|
|||
|
while (<INFILE>) {
|
|||
|
if ( "$_" =~ /lease $ip/ ) {
|
|||
|
$del_current = "1" ;
|
|||
|
}
|
|||
|
if ( $del_current == "0" ) { print OUTFILE "$_" ; }
|
|||
|
if ( "$_" =~ /}/ ) {
|
|||
|
$del_current = "0" ;
|
|||
|
}
|
|||
|
}
|
|||
|
rename ($name_tmp_file,$name_in_file) ;
|
|||
|
system ("/bin/cp","-f","$name_in_file","$name_out_file") ;
|
|||
|
close(INFILE);
|
|||
|
close(OUTFILE);
|
|||
|
|
|||
|
# changed to new sme standard signal-event
|
|||
|
system ("/sbin/e-smith/signal-event","workgroup-update") == 0
|
|||
|
or die "Error while saving settings: $!";
|
|||
|
###Return action message
|
|||
|
Table_IP($q, $fm->localise('SUCCESSFULLY_DELETED_THE_CLIENT') . ' (' . $name . '/' . $ip .')');
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: procedure qui valide les parametres de l'host eteint
|
|||
|
#===============================================================================
|
|||
|
sub Wake_Up ($){
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Start Panel.
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('WAKING_A_REMOTE_COMPUTER_TITLE'));
|
|||
|
print $q->h3($fm->localise('WAKING_A_REMOTE_COMPUTER'));
|
|||
|
|
|||
|
print $q->startform (-method => 'POST', -action => $q->url (-absolute => 1));
|
|||
|
|
|||
|
my $mac = uc($q->param ('MAC'));
|
|||
|
my $name = uc($q->param ('name'));
|
|||
|
|
|||
|
print $q->p ($q->b ($fm->localise('WAKING_A_REMOTE_COMPUTER_ACTION') . ' (' . $name . '/' . $mac . ')'));
|
|||
|
|
|||
|
print $q->submit (-name => 'action', -value => $fm->localise('WAKE_UP') . " $name");
|
|||
|
print $q->hidden (-name => 'mac',
|
|||
|
-override => 1,
|
|||
|
-default => $mac
|
|||
|
);
|
|||
|
print $q->hidden (-name => 'name',
|
|||
|
-override => 1,
|
|||
|
-default => $name
|
|||
|
);
|
|||
|
|
|||
|
print $q->hidden (-name => 'state',
|
|||
|
-override => 1,
|
|||
|
-default => 'perform_wake_up');
|
|||
|
|
|||
|
print $q->endform;
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
return;
|
|||
|
}
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Perform wake UP
|
|||
|
#===============================================================================
|
|||
|
sub Perform_Wake_Up($){
|
|||
|
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Get Mac Adress
|
|||
|
my $mac = uc($q->param('mac'));
|
|||
|
my $name = uc($q->param('name'));
|
|||
|
|
|||
|
#Send Wake Up to the station
|
|||
|
#Old version obsolete since 1.5.0 - system ("/usr/bin/wol","$mac") ;
|
|||
|
system ("/sbin/ether-wake","$mac") ;
|
|||
|
###Return action message
|
|||
|
Table_IP($q, $fm->localise('SUCCESSFULLY_CLIENT_WOL_REQUEST') . ' (' . $name . '/' . $mac . ')');
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
#=========================================================================
|
|||
|
# Procedure qui charge le dhcpd.conf
|
|||
|
# retourne un tableau contenant les informations
|
|||
|
#=========================================================================
|
|||
|
sub Load_leases ($){
|
|||
|
|
|||
|
#Definition de variable
|
|||
|
use vars qw/
|
|||
|
@detail $work_line $header /;
|
|||
|
my $name_file = '/var/lib/dhcpd/dhcpd.leases' ;
|
|||
|
@liste_computer = '' ;
|
|||
|
#Ouverture du fichier en lecture seule
|
|||
|
open(FILE,"<$name_file") || die "Read error $name_file, Error: $!" ;
|
|||
|
|
|||
|
#Parcours du fichier dhcpd.leases
|
|||
|
while (<FILE>) {
|
|||
|
# suppression des commentaires
|
|||
|
if ($_ =~ /^#/) { next; }
|
|||
|
|
|||
|
#spurresion des lignes vides
|
|||
|
if ($_ =~ /^$/) { next; }
|
|||
|
#supression de la ligne uid de windows
|
|||
|
if ($_ =~ /uid/) { next; }
|
|||
|
#supression de la ligne tstp de XP
|
|||
|
if ($_ =~ /tstp/) { next; }
|
|||
|
#supression de la ligne "binding state active"
|
|||
|
if ($_ =~ /binding/) { next; }
|
|||
|
#supression de la ligne "next binding state"
|
|||
|
if ($_ =~ /next/) { next; }
|
|||
|
#suprresion des commentaire et des ;
|
|||
|
$_ =~ s/\s#.*$//;
|
|||
|
$_ =~ s/(;|{) *$//;
|
|||
|
|
|||
|
#supression des espace en debut de lignes
|
|||
|
$_ =~ s/^ *\s//;
|
|||
|
|
|||
|
#Suppression des retours chariot en fin de lignes.
|
|||
|
chomp $_ ;
|
|||
|
|
|||
|
#Chargement d'un tableau avec le contenu de la ligne.
|
|||
|
(@detail) = split(/ /, $_) ;
|
|||
|
|
|||
|
#initialisation d'un nouveau poste connect<63>
|
|||
|
if ($_ =~ /lease/) {
|
|||
|
$work_line = "" ;
|
|||
|
}
|
|||
|
|
|||
|
$header = shift(@detail);
|
|||
|
$work_line = $work_line . ";" . join(" ",@detail) ;
|
|||
|
|
|||
|
if ($header =~ /}/) {
|
|||
|
$work_line =~ s/ /;/g;
|
|||
|
$work_line =~ s/^;//;
|
|||
|
$work_line =~ s/"//g;
|
|||
|
$work_line =~ s/;$//;
|
|||
|
#we want the last entry is the first element of the array
|
|||
|
unshift(@liste_computer,$work_line) ;
|
|||
|
}
|
|||
|
}
|
|||
|
close(FILE);
|
|||
|
}
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Message
|
|||
|
#===============================================================================
|
|||
|
sub Message($$){
|
|||
|
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Pull entry to delete
|
|||
|
my $name = $q->param('name');
|
|||
|
my @liste_connected = $q->param('liste_connected');
|
|||
|
my $message2send ;
|
|||
|
|
|||
|
if ( $name ) {
|
|||
|
@liste_connected = () ;
|
|||
|
push(@liste_connected,$name) ; }
|
|||
|
else {$name = $fm->localise('ALL_OF_THEM')}
|
|||
|
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf,$fm->localise('SENDING_A_WINPOPUP'));
|
|||
|
print $q->h3($fm->localise('SENDING_A_WINPOPUP_TO') . " @liste_connected.");
|
|||
|
print $q->startform (-method => 'POST', -action => $q->url (-absolute => 1));
|
|||
|
print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
|
|||
|
esmith::cgi::genNameValueRow ($q,$fm->localise('YOUR_MESSAGE'), 'message2send',
|
|||
|
$fm->localise('WRITE_YOUR_MESSAGE')) );
|
|||
|
print '</table>';
|
|||
|
print $q->hr;
|
|||
|
print $q->p ($q->p ($fm->localise('DO_YOU_WANT_TO_SENT') . " $name"));
|
|||
|
print $q->submit (-name => 'action', -value => $fm->localise('SEND_WINPOPUP_TO') . " $name");
|
|||
|
print $q->hidden (-name => 'liste_connected', -override => 1,
|
|||
|
-default => @liste_connected);
|
|||
|
print $q->hidden (-name => 'message2send', -override => 1, -default => $message2send);
|
|||
|
print $q->hidden (-name => 'state', -override => 1, -default => 'perform_message');
|
|||
|
print $q->endform;
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
return;
|
|||
|
}
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Perform message
|
|||
|
#===============================================================================
|
|||
|
sub Perform_Message($){
|
|||
|
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Get Mac Adress
|
|||
|
my @liste_connected = split(' ',$q->param('liste_connected'));
|
|||
|
my $message2send = $q->param('message2send');
|
|||
|
|
|||
|
foreach (@liste_connected){
|
|||
|
system ("/etc/e-smith/events/actions/send-message","$_","$message2send") ;
|
|||
|
}
|
|||
|
Table_IP($q, $fm->localise('SUCCESSFULLY_SENT_MESSAGE') . " @liste_connected." . $fm->localise('WARNING_NO_WINPOPUP_GARANTY'));
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Win Popup for all connected hosts
|
|||
|
#===============================================================================
|
|||
|
sub Global_WinPopup($){
|
|||
|
|
|||
|
my $q = shift;
|
|||
|
my @liste_connected = $q->param('liste_connected');
|
|||
|
Message($q,@liste_connected);
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Create Table_IP of dhcp server
|
|||
|
#===============================================================================
|
|||
|
sub Table_IP ($$) {
|
|||
|
###Pull cgi object from parameters array
|
|||
|
my $q = shift;
|
|||
|
my @computer;
|
|||
|
my $status ;
|
|||
|
|
|||
|
###Pull action message, if any, from parameters array
|
|||
|
my $action_message = shift;
|
|||
|
|
|||
|
###Retrieve SME configuration entry for dhcpd
|
|||
|
my $dbh_sme = esmith::ConfigDB->open('/home/e-smith/db/configuration');
|
|||
|
my %sme_conf = $dbh_sme->get('dhcpd')->props;
|
|||
|
|
|||
|
###Display Main Panel Title
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('MANAGING_DHCP_CLIENT'));
|
|||
|
|
|||
|
###Check to see if we just processed a panel action. If so, display
|
|||
|
###action message and bail.
|
|||
|
if ($action_message) {
|
|||
|
print $q->h3 ($fm->localise('STATUS_REPORT') . " $action_message");
|
|||
|
}
|
|||
|
|
|||
|
#------------------------------------------------------------
|
|||
|
# Start DHCP client Panel
|
|||
|
#------------------------------------------------------------
|
|||
|
print $q->p ('');
|
|||
|
print $q->startform (-method => 'POST',
|
|||
|
-action => $q->url (-absolute => 1));
|
|||
|
#refresh the list
|
|||
|
print esmith::cgi::genButtonRow ($q,$q->submit (-name => 'state',-value => $fm->localise('REFRESH')));
|
|||
|
#Remove all dhcpd lease
|
|||
|
print esmith::cgi::genButtonRow ($q,$q->submit (-name => 'state',-value => $fm->localise('REMOVE_ALL_LEASES')));
|
|||
|
print $q->hr;
|
|||
|
|
|||
|
print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
|
|||
|
esmith::cgi::genWidgetRow ($q, $fm->localise('CHECK_CLIENT_STATUS'),
|
|||
|
$q->popup_menu (-name => 'dhcp_check',
|
|||
|
-values => ['disabled', 'enabled'],
|
|||
|
-default => $sme_conf{'check'},
|
|||
|
-labels => \%check)) );
|
|||
|
|
|||
|
##save checkip ('Saving modification and restart the daemon...') and go to sub Save_checkip :)
|
|||
|
print $q->table ({border => 0, cellspacing => 0, cellpadding => 4},
|
|||
|
esmith::cgi::genTextRow ($q,
|
|||
|
$q->p ($fm->localise('SAVE_TITLE'))));
|
|||
|
|
|||
|
print $q->start_table ({width => "100%", -class => "sme-noborders"}),
|
|||
|
"\n";
|
|||
|
print esmith::cgi::genButtonRow ($q,
|
|||
|
$q->submit (-name => 'action', -value => $fm->localise('SAVE/RESTART')));
|
|||
|
|
|||
|
print $q->end_table,"\n";
|
|||
|
print $q->hidden (
|
|||
|
-name => 'state',
|
|||
|
-override => 1,
|
|||
|
-default => 'Save_checkIP'
|
|||
|
),"\n";
|
|||
|
|
|||
|
print $q->endform;
|
|||
|
|
|||
|
# Refresh Liste
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
|
|||
|
|
|||
|
&Load_leases ($q) ;
|
|||
|
if ( 2 > 1 ) {
|
|||
|
print $q->p ($q->b (''));
|
|||
|
print $q->table ({border => 1, cellspacing => 1, cellpadding => 4,nowarp => 1});
|
|||
|
print $q->Tr (esmith::cgi::genSmallCell ($q, $q->p ( '<center>' . 'IP')),
|
|||
|
esmith::cgi::genSmallCell ($q, $q->p ( '<center>' . $fm->localise('NETWORK_NAME'))),
|
|||
|
esmith::cgi::genSmallCell ($q, $q->p ( '<center>' . $fm->localise('STATUS_CLICK_FOR_WOL'))),
|
|||
|
esmith::cgi::genSmallCell ($q, $q->p ( '<center>' . $fm->localise('START_DATE'))),
|
|||
|
esmith::cgi::genSmallCell ($q, $q->p ( '<center>' . $fm->localise('END_DATE'))),
|
|||
|
esmith::cgi::genSmallCell ($q, $q->p ( '<center>' . $fm->localise('MAC_ADDRESS') .
|
|||
|
'</CENTER>')),
|
|||
|
);
|
|||
|
##9(sme8)12(sme9)->netbios (ancien10)::8(sme8)11(sme9)->mac address (ancien8)::0->ip::
|
|||
|
##it is possible you may adapt array number if more options/lines are added to the dhcpd.leases
|
|||
|
##symptoms are a blank or wrong line in Table_IP
|
|||
|
my @mac = ();
|
|||
|
my @count = ();
|
|||
|
|
|||
|
foreach (@liste_computer){
|
|||
|
@computer = split(/;/, $_) ;
|
|||
|
|
|||
|
#we want to sort elements the array by mac address
|
|||
|
|
|||
|
$computer[11] = uc($computer[11]) ;
|
|||
|
push @mac, ($computer[11]);
|
|||
|
my @count;
|
|||
|
push @count , (grep /$computer[11]/ , @mac);
|
|||
|
next if (scalar @count > 1);
|
|||
|
|
|||
|
|
|||
|
#we start the table if it is a valid IP
|
|||
|
if ( $computer[0] ) {
|
|||
|
$computer[12] = uc($computer[12]) ;
|
|||
|
my $datedeb = $computer[2] . "-" . $computer[3] ;
|
|||
|
my $datefin = $computer[5] . "-" . $computer[6] ;
|
|||
|
$status = $q->a ({href => $q->url (-absolute => 1) .
|
|||
|
"?state=wake_up&MAC=" . $computer[11] . "&name=" .
|
|||
|
$computer[12]}, $fm->localise('NOT_CHECKED')) ;
|
|||
|
if ( $sme_conf{'check'} =~ /enabled/ ) {
|
|||
|
use Net::Ping;
|
|||
|
my($ping_obj) = Net::Ping->new("icmp");
|
|||
|
# formatage des dates
|
|||
|
$computer[3] = substr($computer[3],0,5);
|
|||
|
$computer[6] = substr($computer[6],0,5);
|
|||
|
if ($ping_obj->ping("$computer[0]")) {
|
|||
|
push(@liste_connected,$computer[12]) ;
|
|||
|
$status = $fm->localise('ACTIVE_DEVICE');
|
|||
|
#alimentation de la liste des connect<63>
|
|||
|
}
|
|||
|
else { $status = $q->a ({href => $q->url (-absolute => 1) .
|
|||
|
"?state=wake_up&MAC=" . $computer[11] . "&name=" .
|
|||
|
$computer[12]}, $fm->localise('WAKE_UP_ACTION'));
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
push(@liste_connected,$computer[12]) ;
|
|||
|
|
|||
|
}
|
|||
|
print $q->Tr (esmith::cgi::genSmallCell ($q, "$computer[0]"),
|
|||
|
esmith::cgi::genSmallCell ($q, "$computer[12]"),
|
|||
|
esmith::cgi::genSmallCell ($q, "<CENTER>" ."$status" ),
|
|||
|
esmith::cgi::genSmallCell ($q, "<CENTER>" . "$datedeb" . "</CENTER>"),
|
|||
|
esmith::cgi::genSmallCell ($q, "<CENTER>" . "$datefin" . "</CENTER>"),
|
|||
|
esmith::cgi::genSmallCell ($q, "$computer[11]"),
|
|||
|
esmith::cgi::genSmallCell ($q,
|
|||
|
$q->a ({href => $q->url (-absolute => 1)
|
|||
|
. "?state=del_lease&host=" . $computer[0] . "&name=" .
|
|||
|
$computer[12]}, $fm->localise('REMOVE_ACTION'))),
|
|||
|
esmith::cgi::genSmallCell ($q,
|
|||
|
$q->a ({href => $q->url (-absolute => 1)
|
|||
|
. "?state=message&name=" . $computer[12]}, $fm->localise('WINPOPUP_ACTION')))
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
print '</table>';
|
|||
|
}
|
|||
|
else{
|
|||
|
print $q->p ($q->b ($fm->localise('NO_CONNECTED_COMPUTERS')));
|
|||
|
}
|
|||
|
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
exit;
|
|||
|
}
|
|||
|
#
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: procedure qui sauve le checkip de la subroutine Table_ip
|
|||
|
#===============================================================================
|
|||
|
sub Save_checkip ($){
|
|||
|
|
|||
|
##Pull CGI object from parameters array
|
|||
|
my $q = shift;
|
|||
|
|
|||
|
###Build Hash of config parameters to update from cgi submit
|
|||
|
my $dhcpd_check = $q->param ('dhcp_check');
|
|||
|
|
|||
|
##Initiate get method --> create record object
|
|||
|
my $dbh_sme = esmith::ConfigDB->open('/home/e-smith/db/configuration');
|
|||
|
|
|||
|
my $sme_record = $dbh_sme->get('dhcpd');
|
|||
|
|
|||
|
$sme_record->set_prop('check' , $dhcpd_check);
|
|||
|
|
|||
|
system ("/sbin/e-smith/signal-event","workgroup-update") == 0
|
|||
|
or die "Error while saving settings: $!";
|
|||
|
Table_IP($q, $fm->localise('SUCCESSFULLY_SAVED_SETTINGS'));
|
|||
|
exit;
|
|||
|
}
|
|||
|
#
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: procedure qui supprime tous les bail dans le dhcpd.leases
|
|||
|
#===============================================================================
|
|||
|
sub Del_all_Lease ($){
|
|||
|
###Pull CGI object from parameters array
|
|||
|
$q = shift;
|
|||
|
|
|||
|
###Start Panel.
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('REMOVE_DHCP_LEASE_TITLE'));
|
|||
|
print $q->h3($fm->localise('REMOVE_DHCP_LEASE_WARNING'));
|
|||
|
|
|||
|
print $q->startform (-method => 'POST', -action => $q->url (-absolute => 1));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
print $q->p ( $fm->localise('REMOVE_DHCP_LEASE_WARNING2'));
|
|||
|
|
|||
|
print $q->p ($q->b ($fm->localise('ARE_YOU_SURE')));
|
|||
|
|
|||
|
print $q->submit (-name => 'state', -value => $fm->localise('REMOVE_ALL_LEASES_ACTION'));
|
|||
|
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
|
|||
|
|
|||
|
print $q->endform;
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
#
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: supprime tous les bail dans le dhcpd.leases
|
|||
|
#===============================================================================
|
|||
|
sub Perform_del_all_Lease ($){
|
|||
|
|
|||
|
system ('/bin/echo "" > /var/lib/dhcpd/dhcpd.leases') ==0
|
|||
|
or die "Error while removing all leases: $!";
|
|||
|
|
|||
|
system ("/sbin/e-smith/signal-event","workgroup-update") == 0
|
|||
|
or die "Error while saving settings: $!";
|
|||
|
|
|||
|
Table_IP($q, $fm->localise('SUCCESSFULLY_REMOVED_ALL_LEASES'));
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
#===============================================================================
|
|||
|
#SUBROUTINE: Scan The Local Network
|
|||
|
#===============================================================================
|
|||
|
sub Scan_Local_Network ($) {
|
|||
|
|
|||
|
esmith::cgi::genHeaderNonCacheable ($q, \%conf, $fm->localise('SCANNING_NETWORK_TITLE'));
|
|||
|
my $nmap_sme = esmith::ConfigDB->open('/home/e-smith/db/configuration');
|
|||
|
my $mask = $nmap_sme->get_value('LocalNetmask');
|
|||
|
my $network = $nmap_sme->get_prop('InternalInterface','Network');
|
|||
|
|
|||
|
#we start to calculate the method to find the cidr (we want to use network/cidr with nmap)
|
|||
|
|
|||
|
sub dec2bin {
|
|||
|
my $str = unpack("B32", pack("N", shift));
|
|||
|
return $str;
|
|||
|
}
|
|||
|
|
|||
|
sub netmask2cidr {
|
|||
|
my ($mask, $network) = @_;
|
|||
|
my @octet = split (/\./, $mask);
|
|||
|
my @bits;
|
|||
|
my $binmask;
|
|||
|
my $binoct;
|
|||
|
my $bitcount=0;
|
|||
|
|
|||
|
foreach (@octet) {
|
|||
|
$binoct = dec2bin($_);
|
|||
|
$binmask = $binmask . substr $binoct, -8;
|
|||
|
}
|
|||
|
|
|||
|
# let's count the 1s
|
|||
|
@bits = split (//,$binmask);
|
|||
|
foreach (@bits) {
|
|||
|
if ($_ eq "1") {
|
|||
|
$bitcount++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
my $cidr = $network . "/" . $bitcount;
|
|||
|
return $cidr;
|
|||
|
}
|
|||
|
|
|||
|
#Then lets go to calculate the cidr
|
|||
|
my $cidr = netmask2cidr($mask, $network);
|
|||
|
|
|||
|
#ok go to use nmap with nmap -T4 -sP network/cidr
|
|||
|
print $q->p ;
|
|||
|
print $q->h3($fm->localise('NETWORK_VALUES_FOUND') . " $cidr \($mask\)");
|
|||
|
print $q->p ;
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
|
|||
|
foreach (`/usr/bin/nmap --script smb-os-discovery.nse -p U:137,T:139 $cidr|
|
|||
|
/bin/grep -Ev "MAC|NetBIOS|OS CPE"| /bin/grep -E "scan|done|Computer|OS"|
|
|||
|
/bin/sed -e 's/Nmap scan/-- Scan/g'|/bin/sed -e 's/done/Done/g'|
|
|||
|
/bin/sed -e 's/Nmap//g'|/bin/sed -e 's/|/ /g'`) {
|
|||
|
print $q->br($_);}
|
|||
|
|
|||
|
print $q->p ;
|
|||
|
|
|||
|
print $q->p($fm->localise('CLICK_HERE_TO_MAIN_PANEL'));
|
|||
|
|
|||
|
esmith::cgi::genFooter ($q);
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
__DATA__
|
|||
|
<form>
|
|||
|
</form>
|