Zur Navigation

Updatesystem für PHP System programmieren

1 Tom12

Hallo,
Ich habe nun ein kleines PHP System fast fertig programmiert und würde dafür nun gerne ein Updatesystem programmieren.

Ich hab die Ordnerstruktur:

-website/
(//Inhalt irrelevant)

-include/
[code]images/
backend/
database/
website/
tmp
.htaccess
functions.inc.php
settings.inc.php

-backend/
(//Inhalt irrelevant)

jetzt möchte ich ein Updatesystem einrichten, dass wenn auf einem Externen Server (z.B. update.example.com) ein Neues Update bereitsteht, und ich in einem Formular auf Einen Button "Nach neuen Updates Suchen" er guckt ob ein neues Update bereitsteht.
Wenn ja, soll ein Formular erscheinen in dem man das Neue Update installiert wird, also alle oben Fett gedruckten Ordner/Dateien überschrieben werden.

Kennt sich da einer mit sowas aus? (Ich benutzte ungerne Ajax. Besser nur PHP und HTML)

12.04.2018 17:28

3 Jörg

Zunächst zum Punkt Überschreiben:

Je nachdem, wie PHP eingebunden ist, kann es sein, dass die Verzeichnisse und Dateien nicht ohne weiteres überschrieben werden können. Wenn PHP als Webserver-Modul läuft (mod_php), dann wird es mit den Userrechten des Webservers ausgeführt. Der FTP-Upload erfordert dagegen die Rechte des FTP-Users. In solchen Fällen muss eine Lösung gefunden werden, wie beide hochladen bzw. überschreiben können, z.B. durch (vorherige) Anpassung der Dateirechte, oder aber wie es WordPress macht, indem das Update-Script die Dateien auch über FTP hochlädt.

Dann braucht es noch ein Script auf dem Update-Server, welches püft, ob eine Version aktuell ist. Das Script könnte mit einem Versionsparameter aufgerufen werden, z.B. check-update.php?version=1.2.4. Mithilfe von version_compare() prüft das Script, ob $_GET['version'] aktuelle ist und gibt je nachdem eine Antwort zurück.

Wenn dir JavaScript weniger behagt, könntest du das Script per PHP curl aufrufen und die Antwort im lokalen PHP-Script verarbeiten. Der etwaige Download des Update-Pakets kann dann auch per curl erfolgen.

12.04.2018 20:26 | geändert: 12.04.2018 20:30

4 Tom12

Hallo,
ich habe nach langem Suchen ein Script im Internet gefunden, allerdings klappt es nicht richtig:

<?
ini_set('max_execution_time',60);
//Suche nach Updates
$getVersions = file_get_contents('https://test.musicintime.de/current-release-versions.php') or die ('ERROR');
$current_version = file_get_contents('../include/version.txt');
if ($getVersions != '')
{
	echo 'Aktuelle Version: '.$current_version;
	echo 'Reading Current Releases List';
	$versionList = explode("\n", $getVersions);	
	foreach ($versionList as $aV)
	{
		if ( $aV > $current_version) {
			echo '<p>New Update Found: v'.$aV.'</p>';
			$found = true;
			
			//Lade Datei herunter, Wenn sie noch nicht vorhanden sind
			if ( !is_file(  $_ENV['site']['files']['includes-dir'].'lupusgui-'.$aV.'.zip' )) {
				echo 'Läd Update herunter...';
				$newUpdate = file_get_contents('https://test.musicintime.de/update/lupusgui-'.$aV.'.zip');
				if ( !is_dir( $_ENV['site']['files']['includes-dir'].'/update/' ) ) {
					mkdir ( $_ENV['site']['files']['includes-dir'].'/update/' );
				}
				$dlHandler = fopen($_ENV['site']['files']['includes-dir'].'lupusgui-'.$aV.'.zip', 'w');
				if ( !fwrite($dlHandler, $newUpdate) ) {
					echo '<p>Could not save new update. Operation aborted.</p>'; exit(); 
				}
				fclose($dlHandler);
				echo '<p>Update Downloaded And Saved</p>';
			} else {
				echo '<p>Update already downloaded.</p>';
			}
			
			if ($_GET['doUpdate'] == true) {
				//Öffne die Datei und extrahiere sie
				$zipHandle = zip_open($_ENV['site']['files']['includes-dir'].'lupusgui-'.$aV.'.zip');
				echo '<ul>';
				while ($aF = zip_read($zipHandle) ) 
				{
					$thisFileName = zip_entry_name($aF);
					$thisFileDir = dirname($thisFileName);
					
					//Fahre fort, wenn es keine Datei ist
					if ( substr($thisFileName,-1,1) == '/') continue;
					
					//Erstelle die benötigten Ordner
					if ( !is_dir ( $_ENV['site']['files']['server-root'].'/'.$thisFileDir ) )
					{
						 mkdir ( $_ENV['site']['files']['server-root'].'/'.$thisFileDir );
						 echo '<li>Created Directory '.$thisFileDir.'</li>';
					}
					
					//Überschreibe die Dateien
					if ( !is_dir($_ENV['site']['files']['server-root'].'/'.$thisFileName) ) {
						echo '<li>'.$thisFileName.'...........';
						$contents = zip_entry_read($aF, zip_entry_filesize($aF));
						$contents = str_replace("\r\n", "\n", $contents);
						$updateThis = '';
						
						//Schreibe in upgrade.php Datei
						if ( $thisFileName == 'upgrade.php' )
						{
							$upgradeExec = fopen ('upgrade.php','w');
							fwrite($upgradeExec, $contents);
							fclose($upgradeExec);
							include ('upgrade.php');
							unlink('upgrade.php');
							echo' EXECUTED</li>';
						}
						else
						{
							$updateThis = fopen($_ENV['site']['files']['server-root'].'/'.$thisFileName, 'w');
							fwrite($updateThis, $contents);
							fclose($updateThis);
							unset($contents);
							echo' UPDATED</li>';
						}
					}
				}
				echo '</ul>';
				$updated = TRUE;
			}
			else echo '<p>Update ready. <a href="?doUpdate=true">&raquo; Install Now?</a></p>';
			break;
		}
	}
	if ($updated == true)
	{
		set_setting('site','CMS',$aV);
		echo '<p class="success">&raquo; CMS Updated to v'.$aV.'</p>';
	}
	else if ($found != true) echo '<p>&raquo; No update is available.</p>';
}
else echo '<p>Could not find latest realeases.</p>';


Allerdings wird mir dieser Error ausgegeben:

Warning: is_dir(): open_basedir restriction in effect. File(/.) is not within the allowed path(s): (/var/www/vhosts/musicintime.de/:/tmp/:/dev/urandom) in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 47

Warning: mkdir(): open_basedir restriction in effect. File(/.) is not within the allowed path(s): (/var/www/vhosts/musicintime.de/:/tmp/:/dev/urandom) in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 49
Created Directory .
test.php...........
Warning: fopen(/test.php): failed to open stream: Permission denied in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 72

Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 73

Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 74
UPDATED

Fatal error: Uncaught Error: Call to undefined function set_setting() in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php:89 Stack trace: #0 /var/www/vhosts/musicintime.de/LupusGUI/backend/update.php(14): require() #1 {main} thrown in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 89

14.04.2018 16:34

5 Jörg

Es handelt sich wohl um dieses Script:

https://maxmorgandesign.com/simple_php_auto_update_system/

Warning: is_dir(): open_basedir restriction in effect. File(/.) is not within the allowed path(s): (/var/www/vhosts/musicintime.de/:/tmp/:/dev/urandom) in /var/www/vhosts/musicintime.de/LupusGUI/include/backend/update.inc.php on line 47

/. ist das Root-Verzeichnis - klar, dass du da keinen Zugriff drauf bekommst. Zeile 47 ist wohl diese:

if ( !is_dir ( $_ENV['site']['files']['server-root'].'/'.$thisFileDir ) )

Was steht denn bei dir in $_ENV['site']['files']['server-root'] - anscheinend ein leerer String?

Der Programmierer schreibt hierzu:

On our CMS, we store our DOCUMENT_ROOT in an $_ENV variable for instances where we are installed in a subfolder.

Ggf. kannst du $_ENV['site']['files']['server-root'] auch durch $_SERVER['DOCUMENT_ROOT'] ersetzen

Fatal error: Uncaught Error: Call to undefined function set_setting()

Da fehlt noch die Funktionsdefintion von set_setting(). Die musst du wohl selbst erstellen:

Our CMS function, set_setting() will update the database of our new version.

14.04.2018 17:52

1 Forenmitglied fand diesen Beitrag gut

Beitrag schreiben (als Gast)





[BBCode-Hilfe]