ACHTUNG: Mittlerweile ist dieses Skript auch als Modul verfügbar – siehe Modul – Backup von Views

Sollte man versehentlich mal eine View komplett löschen, so ist es mit diesem Skript möglich, die View aus einem Backup wiederherzustellen.

Voraussetzung ist, dass das Backup Skript aktiv ist und in regelmäßigen Abständen Backups von modifizierten Views anlegt.

Für das Wiederherstellen einer gelöschten View ist es notwendig, die ID der View oder den Namen der View im Skript anzugeben.

<?
	/**
	 * @file          IPSView_RestoreDeleted.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2014-07-23 brownson: Initiale Version<br/>
	 *
	 * IPSView um ein gelöschtes Script aus dem Backup wiederherzustellen (
	 * Voraussetzung: IPSView_Backup ist installiert)
	 *
	 * Konfiguration Einstellungen:
	 *   * $directory - spezifiziert das Verzeichnis wo die Backups abgelegt werden
	 *                  (relativ zum IP-Symcon Verzeichnis)
	 *   * $viewID    - ID der gelöschten View (Angabe von Name oder ID)
	 *   * $viewName  - Name der gelöschten View (Angabe von Name oder ID)
	 *
	 */

	// Konfiguration
	$directory = 'backup/ipsview/';
	$viewID    = '';
	$viewName  = '';

	// -------------------------------------------------------------------------

	// Konfiguration überprüfen
	if ($viewID == '' and $viewName == '') {
		echo 'Bitte geben Sie eine ViewID oder einen ViewNamen in der Konfiguration an.'.PHP_EOL;
		return;
 	}

   echo "Execute IPSView Backup Restore von View '".$viewName."'".PHP_EOL;

	// Backup Verzeichnis überprüfen
	$directory = IPS_GetKernelDir().$directory;
	if (!file_exists($directory)) {
		die ('Backup Verzeichnis konnte nicht gefunden werden');
	}


	// Name auf ID übersetzen
	if ($viewID == '') {
		echo 'Ermittlung von gelöschter ViewID für ViewName "'.$viewName.'"'.PHP_EOL;
		$viewID = GetDeletedViewIDFromViewName ($directory, $viewName);
		if ($viewID===false) {
			die ('View mit Namen "'.$viewName.'" konnte im Backup Verzeichnis NICHT gefunden werden');
		}
	} else if ($viewID < '10000' or $viewID >= '60000') {
		die ('Ungültige ViewID "'.$viewID.'" spezifiziert (10000 <= $viewID <= 60000 /*[Objekt #60000 existiert nicht]*/)');
	}

	// ID auf Name übersetzen
	if ($viewName == '') {
		echo 'Ermittlung von gelöschtem View Name für ViewID "'.$viewID.'"'.PHP_EOL;
		$viewName = GetDeletedViewNameFromViewID ($directory, $viewID);
		if ($viewName===false) {
			die ('View mit ID "'.$viewID.'" konnte im Backup Verzeichnis NICHT gefunden werden');
		}
	}

	// ViewID überprüfen
	echo 'Überprüfung von ViewID "'.$viewID.'"'.PHP_EOL;
	$mediaList = IPS_GetMediaList();
	foreach ($mediaList as $mediaID) {
		if ($mediaID==$viewID) {
			die ('Eine View mit der ID "'.$viewID.'" existiert bereits im Media Verzeichnis!');
		}
	}
	echo 'Starte Wiederherstellung von View mit ID "'.$viewID.'" und Name "'.$viewName.'"'.PHP_EOL;

	// View Restore
	echo 'Erstelle neues Media File für gelöschte View'.PHP_EOL;
	$mediaId      = IPS_CreateMedia(0);
	IPS_SetName($mediaId, $viewName.'.ipsView');
	IPS_SetMediaFile($mediaId, IPS_GetKernelDir().'media'.DIRECTORY_SEPARATOR.$mediaId.'.ipsView', false);

	echo 'Wiederherstellen des View Inhalts'.PHP_EOL;
	$mediaContent     = GetLastBackupContent ($directory, $viewID);
	echo 'Content='.substr($mediaContent,0,200).'...'.PHP_EOL;
	$jsonObj          = json_decode($mediaContent, true);
	$jsonObj['ID']    = $mediaId;
	$jsonObj['Name']  = $viewName.'.ipsView';
	$jsonData         = json_encode($jsonObj);
	echo 'Content='.substr($jsonData,0,200).'...'.PHP_EOL;
	$mediaContent     = base64_encode($jsonData);
	
	IPS_SetMediaContent($mediaId, $mediaContent);

	echo ' '.PHP_EOL;
	echo '============================================================='.PHP_EOL;
	echo 'View wurde erfolgreich aus dem Backup wiederhergestellt'.PHP_EOL;
	echo '============================================================='.PHP_EOL;

	// -------------------------------------------------------------------------
	function GetDeletedViewIDFromViewName ($directory, $viewName) {
	   $result    = false;
	   $viewCount = 0;
	   $viewIDs   = GetAllIDsFromBackupDirectory ($directory);
		foreach ($viewIDs as $viewID) {
		   $mediaContent = GetLastBackupContent ($directory, $viewID);
			$jsonObj      = json_decode($mediaContent, true);
			$jsonName     = $jsonObj['Name'];
			if ($jsonName == $viewName.'.ipsView') {
			   echo 'ViewID "'.$viewID.'" gefunden für ViewName "'.$viewName.'"'.PHP_EOL;
			   $result    = $viewID;
			   $viewCount = $viewCount + 1;
			}
		}
		if ($viewCount > 1) {
		   die ('Es wurden '.$viewCount.' View IDs gefunden, bitte spezifizieren Sie eine eindeutige ID');
		}
		return $result;
	}

	// -------------------------------------------------------------------------
	function GetDeletedViewNameFromViewID ($directory, $viewID) {
		$mediaContent = GetLastBackupContent ($directory, $viewID);
		$jsonData     = base64_decode($mediaContent);
		$jsonObj      = json_decode($jsonData, true);
		return $jsonObj['Name'];
	}

	// -------------------------------------------------------------------------
	function GetAllIDsFromBackupDirectory ($directory) {
	   $result = array();
		if (($handle=opendir($directory))===false) {
			die ('Error Opening Directory '.$directory);
		}
		while (($file = readdir($handle))!==false) {
			$fileID        = substr($file, 0, 5);
			if ($fileID >= '10000' and $fileID <= '60000') {
				$result[$fileID] = $fileID;
			}
		}
		closedir($handle);
		return $result;
	}

	// -------------------------------------------------------------------------
	function GetLastBackupContent ($directory, $id) {
		$result   = false;
		$lastFile = '';
		if (($handle=opendir($directory))===false) {
			die ('Error Opening Directory '.$directory);
		}

		while (($file = readdir($handle))!==false) {
			$fileID        = substr($file, 0, 5);
			if ($file > $lastFile and $fileID==$id) {
				$lastFile = $file;
			}
		}
		closedir($handle);
		if ($lastFile > '') {
			$result   = file_get_contents($directory.$lastFile);
		}

		return $result;
	}


	// -------------------------------------------------------------------------
?>