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

Bei der Entwicklung von Views kann es leicht passieren, dass man mal versehentlich einen Teil einer View oder eine komplette View löscht. Einmal gelöscht, gibt es derzeit nur die Möglichkeit auf ein komplettes IP-Symcon Backup zurückzugreifen.

Anbei ein Script, das automatisch Backups von geänderten Views erzeugt. Das Script wird über einen Timer alle 15 Minuten gestartet und sucht nach modifizierten Views. Wird eine modifizierte View gefunden, erzeugt das Script automatisch ein Backup der View und speichert es im Verzeichnis …/IP-Symcon/backup/IPSView/ unter dem Namen ID_Datum_Zeit.ipsView.

Es werden automatisch die letzten 30 Versionen jeder View im Backup Verzeichnis gespeichert, alles was älter ist, wird gelöscht.

Ein Rücksichern von alten Version ist durch simples Kopieren auf die original Version im media Verzeichnis möglich, bzw steht auch ein Skript zum Rücksichern zur Verfügung.

Ein Rücksichern von komplett gelöschten Views ist mit einem separaten Script möglich.

<?
	/**
	 * @file          IPSView_Backup.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2014-07-23 brownson: Initiale Version<br/>
	 *
	 * IPSView Skript um Sicherungs Backups von Views zu erzeugen
	 *
	 * Nach dem erstmaligen Ausführen des Skriptes wird ein Timer angelegt, der
	 * das Skript in den vorgegeben Zeitabständen startet
	 *
	 * Konfiguration Einstellungen:
	 *   * $directory - spezifiziert das Verzeichnis wo die Backups abgelegt werden
	 *                  (relativ zum IP-Symcon Verzeichnis)
	 *   * $interval  - spezifiziert das Interval zum Erzeugen der Sicherungen
	 *                  in Minuten
	 *   * $days      - Anzahl der Tage bevor das Backup gelöscht wird
	 *
	 */

	// Konfiguration
	$directory = 'backup/ipsview/';
	$interval  = 15;
	$days      = 30;

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

	$mediaList = IPS_GetMediaList();
	$directory = IPS_GetKernelDir().$directory;
	if (!file_exists($directory)) {
		mkdir($directory);
	}
	
	echo "  Execute IPSView Backup Script".PHP_EOL;
	foreach ($mediaList as $mediaID) {
		//echo "Process Media with ID=".$mediaID.PHP_EOL;
		$mediaName    = IPS_GetName($mediaID);
		$media        = IPS_GetMedia($mediaID);
		$mediaFile    = IPS_GetKernelDir().$media['MediaFile'];
		if (strpos($media['MediaFile'] , $mediaID.'.ipsView') !== false) {
			echo "    Found View with ID=".$mediaID.', Name='.$mediaName.PHP_EOL;
			$backupFile   = $directory.$mediaID.'__'.date('Ymd_Hi').'.ipsView';

			$mediaContent  = file_get_contents($mediaFile);
			$backupContent = GetLastBackupContent($directory, $mediaID);
			
			//echo substr($mediaContent,0,500).PHP_EOL;
			//echo substr($backupContent,0,500).PHP_EOL;

			if ($mediaContent != $backupContent) {
				echo "Create Backup for View with ID=".$mediaID.', Backup='.$backupFile.PHP_EOL;
				copy ($mediaFile, $backupFile);
				PurgeLogFiles($directory, $mediaID, $days);
			}
		}
	}
	
	CreateTimer($_IPS['SELF'], $interval);

	// -------------------------------------------------------------------------
	function GetLastBackupContent ($directory, $id) {
		$result   = '';
		$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;
	}

	// -------------------------------------------------------------------------
	function PurgeLogFiles($directory, $id, $days) {
		$referenceDate=Date('Ymd', strtotime("-".$days." days"));
		echo '  Purge IPSView Backupfile older '.$referenceDate;

		if (($handle=opendir($directory))===false) {
			die ('Error Opening Directory '.$directory);
		}

		while (($file = readdir($handle))!==false) {
			$fileDate      = substr($file, 7, 8);
			$fileID        = substr($file, 0, 5);
			if ($fileDate < $referenceDate and $fileID==$id) {
				echo 'Purge IPSView Backupfile '.$file;
				unlink($directory.$file);
			}
		}
		closedir($handle);
	}

	// -------------------------------------------------------------------------
	function CreateTimer ($parentId, $minutes) {
		$timerId = @IPS_GetObjectIDByIdent('BackupTimer', $parentId);
		if ($timerId === false) {
 			$timerId = IPS_CreateEvent(1 /*Cyclic Event*/);
			IPS_SetParent($timerId, $parentId);
			IPS_SetName($timerId, 'BackupTimer');
			IPS_SetIdent($timerId, 'BackupTimer');
			if (!IPS_SetEventCyclic($timerId, 2 /*Daily*/, 1 /*Unused*/, 0 /*Unused*/,0/*Unused*/,2/*TimeType Minutes*/,$minutes/*Minutes*/)) {
				Error ("IPS_SetEventCyclic failed !!!");
			}
			IPS_SetEventActive($timerId, true);
			echo 'Created Timer BackupTimer with ID='.$timerId;
		}
	}

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