{"id":214,"date":"2014-07-25T20:05:56","date_gmt":"2014-07-25T19:05:56","guid":{"rendered":"http:\/\/ipsview.brownson.at\/?p=214"},"modified":"2016-09-10T18:10:54","modified_gmt":"2016-09-10T17:10:54","slug":"automatisches-backup-von-views","status":"publish","type":"post","link":"https:\/\/ipsview.brownson.at\/?p=214","title":{"rendered":"Automatisches Backup von Views"},"content":{"rendered":"<p><span style=\"color: #ff0000;\">ACHTUNG: Mittlerweile ist dieses Skript auch als Modul verf\u00fcgbar<\/span> &#8211; siehe\u00a0<a href=\"http:\/\/ipsview.brownson.at\/?p=731\">Modul &#8211; Backup von Views<\/a><\/p>\n<p>Bei der Entwicklung von Views kann es leicht passieren, dass man mal versehentlich einen Teil einer View oder eine komplette View l\u00f6scht. Einmal gel\u00f6scht, gibt es derzeit nur die M\u00f6glichkeit auf ein komplettes IP-Symcon Backup zur\u00fcckzugreifen.<\/p>\n<p>Anbei ein Script, das automatisch Backups von ge\u00e4nderten Views erzeugt. Das Script wird \u00fcber 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 &#8230;\/IP-Symcon\/backup\/IPSView\/ unter dem Namen ID_Datum_Zeit.ipsView.<\/p>\n<p>Es werden automatisch die letzten 30 Versionen jeder View im Backup Verzeichnis gespeichert, alles was \u00e4lter ist, wird gel\u00f6scht.<\/p>\n<p>Ein R\u00fccksichern von alten Version ist durch simples Kopieren auf die original Version im media Verzeichnis m\u00f6glich, bzw steht auch <a title=\"Zur\u00fccksichern von View Backups\" href=\"http:\/\/ipsview.brownson.at\/?p=221\">ein Skript zum R\u00fccksichern<\/a> zur Verf\u00fcgung.<\/p>\n<p>Ein R\u00fccksichern von komplett gel\u00f6schten Views ist mit einem <a title=\"Wiederherstellen von gel\u00f6schten Views\" href=\"http:\/\/ipsview.brownson.at\/?p=224\">separaten Script <\/a>m\u00f6glich.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-highlight=\"23-25\" data-enlighter-title=\"Backup Skript\">&lt;?\r\n\t\/**\r\n\t * @file          IPSView_Backup.php\r\n\t * @author        brownson\r\n\t * @version\r\n\t *   Version 1.0, 2014-07-23 brownson: Initiale Version&lt;br\/&gt;\r\n\t *\r\n\t * IPSView Skript um Sicherungs Backups von Views zu erzeugen\r\n\t *\r\n\t * Nach dem erstmaligen Ausf\u00fchren des Skriptes wird ein Timer angelegt, der\r\n\t * das Skript in den vorgegeben Zeitabst\u00e4nden startet\r\n\t *\r\n\t * Konfiguration Einstellungen:\r\n\t *   * $directory - spezifiziert das Verzeichnis wo die Backups abgelegt werden\r\n\t *                  (relativ zum IP-Symcon Verzeichnis)\r\n\t *   * $interval  - spezifiziert das Interval zum Erzeugen der Sicherungen\r\n\t *                  in Minuten\r\n\t *   * $days      - Anzahl der Tage bevor das Backup gel\u00f6scht wird\r\n\t *\r\n\t *\/\r\n\r\n\t\/\/ Konfiguration\r\n\t$directory = &#039;backup\/ipsview\/&#039;;\r\n\t$interval  = 15;\r\n\t$days      = 30;\r\n\r\n\t\/\/ -------------------------------------------------------------------------\r\n\r\n\t$mediaList = IPS_GetMediaList();\r\n\t$directory = IPS_GetKernelDir().$directory;\r\n\tif (!file_exists($directory)) {\r\n\t\tmkdir($directory);\r\n\t}\r\n\t\r\n\techo &quot;  Execute IPSView Backup Script&quot;.PHP_EOL;\r\n\tforeach ($mediaList as $mediaID) {\r\n\t\t\/\/echo &quot;Process Media with ID=&quot;.$mediaID.PHP_EOL;\r\n\t\t$mediaName    = IPS_GetName($mediaID);\r\n\t\t$media        = IPS_GetMedia($mediaID);\r\n\t\t$mediaFile    = IPS_GetKernelDir().$media[&#039;MediaFile&#039;];\r\n\t\tif (strpos($media[&#039;MediaFile&#039;] , $mediaID.&#039;.ipsView&#039;) !== false) {\r\n\t\t\techo &quot;    Found View with ID=&quot;.$mediaID.&#039;, Name=&#039;.$mediaName.PHP_EOL;\r\n\t\t\t$backupFile   = $directory.$mediaID.&#039;__&#039;.date(&#039;Ymd_Hi&#039;).&#039;.ipsView&#039;;\r\n\r\n\t\t\t$mediaContent  = file_get_contents($mediaFile);\r\n\t\t\t$backupContent = GetLastBackupContent($directory, $mediaID);\r\n\t\t\t\r\n\t\t\t\/\/echo substr($mediaContent,0,500).PHP_EOL;\r\n\t\t\t\/\/echo substr($backupContent,0,500).PHP_EOL;\r\n\r\n\t\t\tif ($mediaContent != $backupContent) {\r\n\t\t\t\techo &quot;Create Backup for View with ID=&quot;.$mediaID.&#039;, Backup=&#039;.$backupFile.PHP_EOL;\r\n\t\t\t\tcopy ($mediaFile, $backupFile);\r\n\t\t\t\tPurgeLogFiles($directory, $mediaID, $days);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tCreateTimer($_IPS[&#039;SELF&#039;], $interval);\r\n\r\n\t\/\/ -------------------------------------------------------------------------\r\n\tfunction GetLastBackupContent ($directory, $id) {\r\n\t\t$result   = &#039;&#039;;\r\n\t\t$lastFile = &#039;&#039;;\r\n\t\tif (($handle=opendir($directory))===false) {\r\n\t\t\tdie (&#039;Error Opening Directory &#039;.$directory);\r\n\t\t}\r\n\r\n\t\twhile (($file = readdir($handle))!==false) {\r\n\t\t\t$fileID        = substr($file, 0, 5);\r\n\t\t\tif ($file &gt; $lastFile and $fileID==$id) {\r\n\t\t\t\t$lastFile = $file;\r\n\t\t\t}\r\n\t\t}\r\n\t\tclosedir($handle);\r\n\t\tif ($lastFile &gt; &#039;&#039;) {\r\n\t\t\t$result   = file_get_contents($directory.$lastFile);\r\n\t\t}\r\n\t\t\r\n\t\treturn $result;\r\n\t}\r\n\r\n\t\/\/ -------------------------------------------------------------------------\r\n\tfunction PurgeLogFiles($directory, $id, $days) {\r\n\t\t$referenceDate=Date(&#039;Ymd&#039;, strtotime(&quot;-&quot;.$days.&quot; days&quot;));\r\n\t\techo &#039;  Purge IPSView Backupfile older &#039;.$referenceDate;\r\n\r\n\t\tif (($handle=opendir($directory))===false) {\r\n\t\t\tdie (&#039;Error Opening Directory &#039;.$directory);\r\n\t\t}\r\n\r\n\t\twhile (($file = readdir($handle))!==false) {\r\n\t\t\t$fileDate      = substr($file, 7, 8);\r\n\t\t\t$fileID        = substr($file, 0, 5);\r\n\t\t\tif ($fileDate &lt; $referenceDate and $fileID==$id) {\r\n\t\t\t\techo &#039;Purge IPSView Backupfile &#039;.$file;\r\n\t\t\t\tunlink($directory.$file);\r\n\t\t\t}\r\n\t\t}\r\n\t\tclosedir($handle);\r\n\t}\r\n\r\n\t\/\/ -------------------------------------------------------------------------\r\n\tfunction CreateTimer ($parentId, $minutes) {\r\n\t\t$timerId = @IPS_GetObjectIDByIdent(&#039;BackupTimer&#039;, $parentId);\r\n\t\tif ($timerId === false) {\r\n \t\t\t$timerId = IPS_CreateEvent(1 \/*Cyclic Event*\/);\r\n\t\t\tIPS_SetParent($timerId, $parentId);\r\n\t\t\tIPS_SetName($timerId, &#039;BackupTimer&#039;);\r\n\t\t\tIPS_SetIdent($timerId, &#039;BackupTimer&#039;);\r\n\t\t\tif (!IPS_SetEventCyclic($timerId, 2 \/*Daily*\/, 1 \/*Unused*\/, 0 \/*Unused*\/,0\/*Unused*\/,2\/*TimeType Minutes*\/,$minutes\/*Minutes*\/)) {\r\n\t\t\t\tError (&quot;IPS_SetEventCyclic failed !!!&quot;);\r\n\t\t\t}\r\n\t\t\tIPS_SetEventActive($timerId, true);\r\n\t\t\techo &#039;Created Timer BackupTimer with ID=&#039;.$timerId;\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/ -------------------------------------------------------------------------\r\n?&gt;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>ACHTUNG: Mittlerweile ist dieses Skript auch als Modul verf\u00fcgbar &#8211;  [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[51,7,4],"class_list":["post-214","post","type-post","status-publish","format-standard","hentry","category-backup","tag-backup","tag-skript","tag-view"],"_links":{"self":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=214"}],"version-history":[{"count":5,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/214\/revisions"}],"predecessor-version":[{"id":754,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/214\/revisions\/754"}],"wp:attachment":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}