Ich habe IPS auf einen anderen Server umgezogen. Dabei ist mir folgender Fehler untergekommen, der sehr verwunderlich ist:
Beim Versuch, per Sript (Auto-Check-Scirpt, das zyklisch alle Instanzen checkt, und fehlerhafte „disablen“ soll) die Webserver-Instanz zu disablen kommt:
Warning: Could not bind socket. Address and port are already in use. in C:\IPS\scripts[…] on line 66
Benutzt wurde: $result = WI_SetActive( $key, $setval );
wobei $setval=false ist.
Abgesehen davon, dass die Meldung sehr verwirrt, weil:
der Port auf dem neuen Server noch frei ist
aber die Adresse noch die alte Adresse des vorherigen Servers ist
ist das Resultat ein weiterhin aktiver aber fehlerhafter Webserver.
Frage:
Wie kann man eine solche Fehlerhafte Instanz denn per Script deaktivieren?
Apply Changes habe ich natürlich (ist ausserhalb der switch anweiseung, da man ja immern noch für verschiedenen Instanzen unterschiedliche Aktiv-Setz-Methoden braucht), aber dort kommt der Fehler ja nicht her und daran liegt’s auch nicht.
Wie kann man eine solche Fehlerhafte Instanz denn per Script deaktivieren?
und meine Antwort, siehe oben. So wird es gemacht und nicht anderst. Wenn Du ein IPS_ApplyChanges hättest, wird die Instanz definitiv auf true oder false gesetzt ohne wird nur der Haken weg genommen.
Ok. Ich hatte fälschlich angegeben, der Fehler käme beim Umsetzen des Status, tatsächlich kommt er aber erst in der Zeile mit IPS_ApplyChanges. Sorry dafür.
ABER, leider:
Das ändert aber weder etwas an der ursprünglichen Aussage und Frage noch macht es Deinen Kommentar korrekter.
Es geht einfach nicht.
Hast Du es denn überhaupt mit einer inkorrekten WebServer Instanz ausprobiert?
Hier mein Code (der relevante Teilcode include):
<?
//#################################################################################################################
//
// THIS IS THE DEFAULT TREE MODIFICATION SCRIPT FOR THE STANDARD STARTUP ROUTINE
//
// IT RUNS AGAINTS THE FOLLOWING $ARGS ARRAY ELEMENTS:
// ['delete']
// ['disable']
// ['enable']
// ['create']
//
//#################################################################################################################
$log[] = " running " . __FILE__;
// CHECK IF THERE ARE SOME SETTINGS AT ALL THAT NEED TO BE WORKED ON
$do = isset( $ARGS['delete'] ) || isset( $ARGS['disable'] ) || isset( $ARGS['enable'] ) || isset( $ARGS['create'] );
if ( ! $do )
{
$log[] = " nothing to do no entries in modfification array \$ARGS";
return;
};
// IF ONE OF THE ARRAY ELEMENTS IS NOT SET, NULL IT TO AVOUD WARNINGS @forech BELOW
if ( !isset( $ARGS['delete'] ) ) $ARGS['delete'] = array();
if ( !isset( $ARGS['disable'] ) ) $ARGS['disable'] = array();
if ( !isset( $ARGS['enable'] ) ) $ARGS['enable'] = array();
if ( !isset( $ARGS['create'] ) ) $ARGS['create'] = array();
// PREPARE LOCAL
// ENABLEMENT & DISABLEMENT ROUTINE
$__fn_setstate = function( $key=-1, $state=-1 )
{
global $log, $log_step, $MY, $ARGS, $tree_pre_mod;
//$log[] = " run closure";
$result = false;
$tx_failed = str_repeat("!",80) . "FAILED";
$tx_ok = "ok";
$obj = IPS_GetObject( $key );
if( $obj == false )
{
$log[] = " **not found**";
return "not found";
};// if obj==false
$log[] = " " . $obj['ObjectName'];
switch( $obj['ObjectType'] )
{
case -1: // TEST / NOT DEFINED
$log[] = " Object Type not defined";
break;
case 1: // INSTANCES
$inst = IPS_GetInstance( $key );
switch ( $inst['ModuleInfo']['ModuleName'])
{
case "Client Socket":
$setval = ( $state==1 ? 1 : 0 );
$result = IPS_SetProperty( $key, 'Open', $setval );
break;
case "UDP Socket":
$setval = ( $state==1 ? true : false );
$result = USCK_SetOpen( $key, $setval );
break;
case "FTDI":
$setval = ( $state==1 ? true : false );
$result = FTDI_SetPort( $key, $setval );
break;
case "Serial Port":
$setval = ( $state==1 ? true : false );
$result = COMPort_SetOpen( $key, $setval );
break;
case "Webserver":
$setval = ( $state==1 ? true : false );
$result = WI_SetActive( $key, $setval );
break;
case "":
$setval = ( $state==1 ? true : false );
$setval = ($state==1 ? 1 : 0);
break;
};
//print_r( $i['inst'] );
IPS_ApplyChanges( $key );
break;
case 4:
$setval = ( $state==1 ? true : false );
$result = IPS_SetEventActive ( $key , $setval );
//IPS_ApplyChanges( $key );
break;
default:
break;
};//switch ObjType
$log[] = " .." . ( $result ? $tx_ok : $tx_failed );
if ( !$result )
{
$err = error_get_last();
$log[] = " .." . $err['message'] . " [line=" . $err['line'] . "]";
};// bad result
};// function $__fn_setstate
// INIT COUNTER FOR SIABLE & ENABLE
$count['disable'] = 0;
$count['enable'] = 0;
//############################################################################################################
// EXECUTE DELETIONS
//############################################################################################################
$log[] = " DO DELETIONS";
foreach ( $ARGS['delete'] as $key => $val )
{
$log[] = " " . $key;
if ( $key < 1 ) continue;
//###TBD: Deletion needs to be defined
};// foreach delete
//############################################################################################################
// EXECUTE DISABLEMENTS
//############################################################################################################
$log[] = " DO DISABLEMENTS";
foreach ( $ARGS['disable'] as $key => $val )
{
$log[] = " " . $key;
//echo $key . "
";
if ( $key < 1 ) continue;
$result = $__fn_setstate( $key, 0 );
$count['disable'] = $count['disable'] + $result;
};// foreach disable
//echo "end disable
";
//############################################################################################################
// EXECUTE ENABLEMENTS
//############################################################################################################
//echo "pre enable
";
$log[] = " DO ENABLEMENTS";
foreach ( $ARGS['enable'] as $key => $val )
{
$log[] = " " . $key;
if ( $key < 1 ) continue;
$__fn_setstate( $key, 1 );
$count['enable'] = $count['enable'] + $result;
};// foreach enable
//echo "past enable
";
//############################################################################################################
// EXECUTE CREATIONS
//############################################################################################################
$log[] = " DO CREATIONS";
foreach ( $ARGS['create'] as $key => $val )
{
$log[] = " " . $key;
if ( $key < 1 ) continue;
$i['obj'] = @IPS_GetObject( $key );
if( $i['obj'] == false )
{
$log[] = " **not found**";
continue;
};// if obj==false
//###TBD: CREATION needs to be defined
};// foreach create
und hier die entsprechende Fehlermeldung:
Warning: Could not bind socket. Address and port are already in use. in C:\IPS\scripts[…] on line 88