IP 2 Code

Bullseye

Grünschnabel
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:
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:
Zurück