Problem: Disable einer Instanz geht nicht, wenn "fehlerhaft"

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?

Fehlt noch.

WI_SetActive( $key, $setval );
IPS_ApplyChanges($key);

http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/instanzenverwaltung/konfiguration/ips-applychanges/

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.

Das war deine Frage.

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.

Ich bin dann raus hier, hat eh keinen Wert.

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