IP und Code generieren. Kleine Hilfe
Hallo Leute,
kleine kurze Frage, ich habe ein Script was mir aus einer Datei einen Poolrange einliest , für einen DHCP Server
Syntax POOLRANGE="128.1.16.1 128.1.31.254"
Jetzt möchte ich für jede Ip einen Code erstellen, eigentlich nicht für jede IP sondern für jedes, sagen wir mal Segment nur bis 40 .
also
128.1.16.1
128.1.16.2
.
.
.
128.1.16.40
128.1.17.1
128.1.17.2
.
.
.
128.1.17.40
usw.
bis 31, aber dies ist ja Variabel.
Ich habe hier schon mal ein Script, aber das hört nicht bei 40 auf . Und es sagt mir , dass es schon bei den generierten Codes zu doppeleinträgen kommt. Wie kann man das verhindern?
Fehlermeldung:
(115) SQL-Failure. Database respondet: Duplicate entry '172.28.5.68' for key 3
Your query was: INSERT INTO codeip SET code='35820410', ipadr='172.28.5.68'
(115) SQL-Failure. Database respondet: Duplicate entry '172.28.5.131' for key 3
Your query was: INSERT INTO codeip SET code='91043246', ipadr='172.28.5.131'
(115) SQL-Failure. Database respondet: Duplicate entry '172.28.9.14' for key 3
Your query was: INSERT INTO codeip SET code='83284465', ipadr='172.28.9.14'
Hier das Script:
Vielen Dank schon einmal im Vorraus.
Mit freundlichem Gruß Olli
Hallo Leute,
kleine kurze Frage, ich habe ein Script was mir aus einer Datei einen Poolrange einliest , für einen DHCP Server
Syntax POOLRANGE="128.1.16.1 128.1.31.254"
Jetzt möchte ich für jede Ip einen Code erstellen, eigentlich nicht für jede IP sondern für jedes, sagen wir mal Segment nur bis 40 .
also
128.1.16.1
128.1.16.2
.
.
.
128.1.16.40
128.1.17.1
128.1.17.2
.
.
.
128.1.17.40
usw.
bis 31, aber dies ist ja Variabel.
Ich habe hier schon mal ein Script, aber das hört nicht bei 40 auf . Und es sagt mir , dass es schon bei den generierten Codes zu doppeleinträgen kommt. Wie kann man das verhindern?
Fehlermeldung:
(115) SQL-Failure. Database respondet: Duplicate entry '172.28.5.68' for key 3
Your query was: INSERT INTO codeip SET code='35820410', ipadr='172.28.5.68'
(115) SQL-Failure. Database respondet: Duplicate entry '172.28.5.131' for key 3
Your query was: INSERT INTO codeip SET code='91043246', ipadr='172.28.5.131'
(115) SQL-Failure. Database respondet: Duplicate entry '172.28.9.14' for key 3
Your query was: INSERT INTO codeip SET code='83284465', ipadr='172.28.9.14'
Hier das Script:
PHP:
<?php
$PLUGIN_NAME = "gencode";
$PLUGIN_AUTHOR = "grufo";
include("/opt/andrea/http/classes/CConfig.php");
include("/opt/andrea/http/classes/db_mysql.php"); // Datenbankklasse einbinden
$db = New db(); // Initalisiere Datenbank Klasse
$db->connect(); // Kontaktiere DB, inkl. Fehlerprüfung
$basedir = getenv("DOCUMENT_ROOT") . "/def/".language; // Basedir f374r def2html einstellen
include("/opt/andrea/http/classes/std_func.php"); // Standard-Functionen einbinden
$std_func = New std_func();
include("/opt/andrea/http/classes/dataio.php"); // I/O Klasse einbinden
$data_io = New data_io(); // Initalisiere I/O Klasse
if (file_exists( getenv("DOCUMENT_ROOT")."lang/".language."/".$PLUGIN_NAME.".lang.php")) {
include( getenv("DOCUMENT_ROOT")."lang/".language."/".$PLUGIN_NAME.".lang.php");
} else {
print "<!-- /langfile missing -->\n";
}
// start und end-ip adressen festlegen
list($startip, $endip) = split(" ", RN_POOLRANGE);
list($eip1, $eip2, $eip3, $eip4) = split("\.", $endip);
list($aip1, $aip2, $aip3, $aip4) = split("\.", $startip);
$checkstart = "$aip1.$aip2.$aip3.1";
$checkende = "$eip1.$eip2.$eip3.254";
$rn_netmask = RN_NETMASKL;
$net = get_ips("$startip/$rn_netmask", $endip);
$hmax = host_maxnum("$startip/$rn_netmask");
$pass = array();
$error=0;
foreach ($net as $temp) {
$i++;
do{
srand((double)microtime()*1000);
$pwd = rand(100,9999999999);
if(!in_array($pwd, $pass)) {
array_push($pass, $pwd);
break;
}
} while (0);
$sql = "SELECT code, idnum FROM codeip WHERE ipadr='$temp'";
$data = $db->query_first($sql);
if($data) {
$fehler .= "$temp ok\n";
} else {
$sql = "INSERT INTO codeip SET code='$pwd', ipadr='$temp'";
$ok = $db->query($sql);
if(!$ok){
$error++;
}else{
$neue .= "$temp -> $pwd new\n";
}
}
}
$net = get_ips("$checkstart/$rn_netmask", $checkende);
print_r($net);
function get_ips($ip, $endip) {
# gibt alle ip-adressen aus dem entsprechenden bereich aus
# übergabeparameter: ipadresse/subnet, letzte-ip
#
$num="([0-9]|1?\d\d|2[0-4]\d|25[0-5])";
$range= "40";#"([1-9]|1\d|2\d|3[0-2])";
if(preg_match("/^$num\.$num\.$num\.$num\/$range$/",$ip_addr)) {
return 0;
}
$ip_arr = explode("/",$ip);
$ip_end = explode("/",$endip);
# Anzahl der hosts im netzwerk
$mask_bits = strpos(decbin(ip2long($ip_arr[1])),"0");
if($mask_bits > 31 || $mask_bits < 0) die("Nonsense mask\n");
$host_bits = 32-$mask_bits;
$num_hosts = "pow(2,$host_bits)-1;
$netmask = ip2long("255.255.255.255")-$num_hosts;
$ip_start = ip2long($ip_arr[0]);
$ip_ende = ip2long($ip_end[0]);
for($i=0;$i<=$num_hosts;$i++) {
if($ip_start+$i > $ip_ende) {
break;
}
$ip_range[]=long2ip($ip_start+$i);
}
return $ip_range;
}
function host_maxnum($ip) {
# gibt die anzahl der maximalen hosts zurück
# übergabeparameter: ipadresse/subnet
#
$num="([0-9]|1?dd|2[0-4]d|25[0-5])";
$range="([1-9]|1d|2d|3[0-2])";
if(preg_match("/^$num.$num.$num.$num/$range$/",$ip_addr)) {
return 0;
}
$ip_arr = explode("/",$ip);
# Anzahl der hosts im netzwerk
$mask_bits = strpos(decbin(ip2long($ip_arr[1])),"0");
$num_hosts = ip2long($ip_arr[1])*(-1)-2;
#if($mask_bits > 31 || $mask_bits < 0) die("Nonsense maskn");
#$host_bits = 32-$mask_bits;
#$num_hosts = pow(2,$host_bits)-1;
return $num_hosts;
}
print $html;
?>
Vielen Dank schon einmal im Vorraus.
Mit freundlichem Gruß Olli
Zuletzt bearbeitet: