0251 / 590 837 15
info@a-coding-project.de

PHP Anwendung mit APS Standard verpacken

Viele Webhoster bieten 1-Klick-Installationen an. Dabei werden PHP-Anwendungen über die Oberfläche des Webhosters installiert. Theoretisch müsste sich der Hoster in jedes CMS, Blog, Forum,… einarbeiten, um es automatisiert installieren zu können. Um dies zu vereinfachen gibt es den APS Standard (Application Packaging Standard). Dies ist ein einheitliches Format zum Verteilen von Cloud-Anwendungen.

Der APS Standard ist mittlerweile relativ umfangreich, weshalb es für Einsteiger ein wenig Einarbeitung braucht. Aber man kann ja mal einen Blick in die bestehenden Apps werfen, zum Beispiel im WordPress-Paket. In dem ZIP-Archiv sind unter anderem die Ordner htdocs und scripts enthalten. Im htdocs-Ordner sind die Dateien von WordPress selbst enthalten, wie man sie auch beim regulären Download bekommt. Im Ordner scripts sind Dateien dir zur Installation benötigt werden.

APP-LIST.xml generieren

Im Hauptordner gibt es auch noch die Datei APP-LIST.xml, die die Dateien inkl. Hashes auflistet.

Das sieht dann so aus:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<files xmlns="http://apstandard.com/ns/1" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#">
    <file sha256="9621073b3c3b2a05d175b99b30639af4dd581f5b5ac93c032da756e0923f636c" size="560" name="test/wpThemeIDEtest.xml"/>
    <file sha256="b554af454fce2c8e81b6762d1ed4dfcd1455253fb2b69f08db0713e782b0f9a0" size="560" name="test/wpSiteIDEtest.xml"/>
    <file sha256="de169a5914655fe7791cfdb56f8ea25aa0ab9773b8609a6fb698e96d838e51c2" size="561" name="test/wpPluginIDEtest.xml"/>
    <file sha256="5229dc016753f553fc783c9d5ebb2a606bd01570fd6ce6dcaa68cce83e5052b0" size="1672" name="test/wpIDEtest.xml"/>
    <!-- gekürzt -->
</files>

Pro Datei werden auch ein sha256 Hash und die Dateigröße zur Überprüfung angegeben. Um euch die Generierung etwas leichter zu machen, habe ich mal ein kleines PHP-Script vorbereitet:

<?php
	echo hash_file("sha256","wpThemeIDEtest.xml");
	echo "<br />";
	echo filesize("wpThemeIDEtest.xml");
?>

Diese gibt den Hash und die Dateigröße für die Datei wpThemeIDEtest.xml aus, die genauso sein müssen wie oben in der Liste. Das müsst ihr dann je nach euren Vorhaben so umschreiben, dass über eine Schleife alle Dateien aufgelistet werden.

APP-META.xml

Die APP-META.xml beschreibt die Anwendung selbst und Installation. Sie ist etwas umfangreicher, weshalb ich nach und nach einzelne Teile vorstelle.

<application xmlns="http://apstandard.com/ns/1" version="1.2" packaged="2012-12-15T00:14:08">
	<id>http://wordpress.org/</id>
	<name>WordPress</name>
	<version>3.5.1</version>
	<release>4</release>
	<homepage>http://wordpress.org/</homepage>

	<vendor>
		<name>WordPress.org</name>
		<homepage>http://wordpress.org/</homepage>
	</vendor>

	<packager>
		<name>Glowtouch Technologies</name>
		<homepage>http://www.glowtouch.com/</homepage>
		<icon path="images/parrallels-GT6.png" />
		<uri>uuid:714f0a7b-85d6-4eb8-b68e-40f9acbb3103</uri>
	</packager>
	<!-- gekürzt -->
</application>

Im ersten Part geht es um die Basisdaten der App. Dazu gehört natürlich der Name und auch die Version. release ist hierbei nicht die Version der App selbst, sondern die Version des APS-Pakets zu der Anwendung. Wenn man die Beschreibung ändert, gibt es einen neuen Release aber keine neue Version. Vendor ist der Hersteller dar PHP-Anwendung und Packager Ersteller des APS-Pakets. Die uri sollte eine eindeutige ID sein, um die Anwendung identifizieren zu können.

<application xmlns="http://apstandard.com/ns/1" version="1.2" packaged="2012-12-15T00:14:08">
	<!-- gekürzt -->
	<presentation>
		<summary>
			WordPress is a state-of-the-art semantic personal publishing platform with a focus on aesthetics, 
			web standards, and usability.
		</summary>
		<summary xml:lang="de-DE">
			WordPress - eine zeitgemäße semantische Publishing-Plattform mit Augenmerk auf Ästhetik, 
			Web-Standards und  Benutzerfreundlichkeit.
		</summary>
		<!-- gekürzt -->

		<description>
			WordPress is a state-of-the-art semantic personal publishing platform with a focus 
			on aesthetics, web standards, and usability. What a mouthful. WordPress is both free 
			and priceless at the same time. More simply, WordPress is what you use when you want 
			to work with your blogging software, not fight it.
		</description>
		<description xml:lang="de-DE">
			WordPress - eine zeitgemä~_e semantische Publishing-Plattform mit Augenmerk auf Ästhetik, 
			Web-Standards und Benutzerfreundlichkeitt. Was für ein Brocken! 
			WordPress ist sowohl kostenlos als auch von unschätzbarem Wert. Einfacher ausgedrückt: 
			WordPress ist die ideale Anweendung, wenn Sie mit Ihrer Bloggingsoftware nicht kämpfen, 
			sondern arbeiten möchten.
		</description>
		<!-- gekürzt -->

		<changelog>
			<version release="4" version="3.5.1">
				<entry>Add the docs links.</entry>
			</version>
			<version release="2" version="3.5.1">
				<entry>http://wordpress.org/news/2013/01/wordpress-3-5-1/</entry>
			</version>
			<version release="10" version="3.5">
				<entry>Fixed upgrade issue when table prefix is not empty</entry>
			</version>
			<version release="8" version="3.5">
				<entry>Changes in the structured output</entry>
			</version>
			<!-- gekürzt -->
		</changelog>

		<categories>
			<category>Web/Blog</category>
		</categories>

		<languages>
			<language>en</language>
			<language>de</language>
			<language>fr</language>
			<language>es</language>
			<language>pl</language>
		</languages>
	</presentation>
	<!-- gekürzt -->
</application>

Beschreibung

Dieser Abschnitt ist wichtig für die Präsentation eurer App innerhalb der 1-Klick-Installationen des Webhosters. An Hand von denen entscheided der User, ob er die Anwendung installieren möchte. Also solltet ihr euch darüber einige Gedanken machen.

Beschreibung und Zusammenfassung werden pro Sprache angegeben. Ist keine übersetzte Beschreibung vorhanden, wie ein Fallback auf die globale Beschreibung gemacht.

Im Changelog sieht man auch die Versionen noch einmal. So gibt es zwei Mal die Version 3.5.1 wobei bei Release 4 nur ein Link im Paket hinzugefügt wurde.

Für die Kategorien wird eine Liste angeboten, in die ihr eure App einordnen könnt.

Upgrade

<upgrade match="/application/version &gt; '2.0' or /application/version = '2.0' and /application/release &gt;= '1'"/>

Diese Zeile definiert, ab wann ein Upgrade auf dieses Paket erlaubt ist. Dabei kann man über XPATH auf die einzelnen Details des alten Pakets zurückgreifen.lt;summaryquot;eine Liste

Entry points

Mit den Entry-Points können die Webhoster ganz einfach auf bestimmte Seiten innerhalb der App verlinken und den User so zum Beispiel automatisch einloggen. So bietet WordPress unter anderem Links zum Blog oder auch zum Backend:

<application xmlns="http://apstandard.com/ns/1" version="1.2" packaged="2012-12-15T00:14:08">
	<!-- gekürzt -->
	<service id="wordpress">
		<license must-accept="true">
			<text>
				<name>GPLv2</name>
				<file>htdocs/license.txt</file>
			</text>
		</license>

		<presentation>
			<name>WordPress</name>
			<summary>WordPress blog engine</summary>
			<infolinks>
				<link href="file:///docs/WordpressInstallationManual_V1.0.doc" class="deployment-guide">POA-Wordpress Installation Manual</link>
				<link href="file:///docs/Plesk-Installation-Wordpress.doc" class="user-guide">Plesk Installation - WordPress</link>
				<link href="http://wordpress.org/support/" class="support">WordPress Support</link>
			</infolinks>

			<entry-points>

				<entry dst="/wp-login.php" method="POST" class='control-panel'>
					<label>Administrative interface</label>
					<variable name="log" value-of-setting="admin_name"/>
					<variable name="pwd" value-of-setting="admin_password"/>
				</entry>


				<entry dst="/">
				      <label>Blog</label>
				</entry>

				<entry dst="/wp-login.php?redirect_to=wp-admin/theme-uploader.php" method="POST" class='control-panel'>
					<label>Upload theme</label>
					<variable name="log" value-of-setting="admin_name"/>
					<variable name="pwd" value-of-setting="admin_password"/>
				</entry>

				<entry dst="/wp-login.php?redirect_to=wp-admin/plugin-uploader.php" method="POST" class='control-panel'>
					<label>Upload plugin</label>
					<variable name="log" value-of-setting="admin_name"/>
					<variable name="pwd" value-of-setting="admin_password"/>
				</entry>
			</entry-points>
		</presentation>

		<settings>
			<group class="authn">
				<name>Administrator's preferences</name>
				<setting id="admin_name" type="string" default-value="admin" class="login" min-length="1" max-length="32" regex="^[a-zA-Z][0-9a-zA-Z_-]*">
					<name>Administrator's login</name>
					<error-message>Please make sure the text you entered starts with a letter and continues with either numbers, letters, underscores or hyphens.</error-message>
				</setting>
				<setting id="admin_password" type="password" class="password" min-length="1" >
					<name>Password</name>
				</setting>
			</group>
			<group class="vcard">
				<name>Main configuration</name>
				<group class="email">
					<setting id="admin_email" type="email" class="value">
						<name>Administrator's email</name>
					</setting>
				</group>
				<group class="fn n">
                    <setting id="title" type="string" default-value="My CMS" min-length="1" class="organization-name">
                        <name>Site name</name>
                    </setting>
                </group>
			</group>
			<!-- gekürzt -->
		</settings>
		<!-- gekürzt -->
	</service>
</application>

Jedem Enty-Point wird ein Ziel (dst) zugewiesen und quasi ein Formular aufgebaut. Dann gibt es eine Eingabemaske, in der bestimmte Einstellungen (settings) festgelegt werden können, die dann beim Link automatisch befüllt werden. So wird bei den Settings das „admin_name“ angefordert, der dann im entry-Tag unter variable wieder angegeben wird. Die Einstellungen können so beim Hoster einmal festgelegt und nicht jedes Mal neu eingegeben werden.

Systemanforderungen

Natürlich müssen wir auch noch Anfordern, welche Systemanfroderungen wir haben. Oftmals sind PHP und MySQL nötig. Um beste Kompatiblität zu gewährleisten kann man einzelne Versionen und erweiterungen anfrodern:

<application xmlns="http://apstandard.com/ns/1" version="1.2" packaged="2012-12-15T00:14:08">
	<!-- gekürzt -->

	<service id="wordpress">
		<!-- gekürzt -->

		<requirements xmlns:php="http://apstandard.com/ns/1/php" xmlns:db="http://apstandard.com/ns/1/db">
			<php:version min="5.2.4"/>
			<php:extension>mysql</php:extension>

			<php:safe-mode>false</php:safe-mode>

			<db:db>
				<db:id>main</db:id>
				<db:default-name>wordpress</db:default-name>
				<db:can-use-tables-prefix>true</db:can-use-tables-prefix>
				<db:server-type>mysql</db:server-type>
				<db:server-min-version>5.0</db:server-min-version>
			</db:db>
		</requirements>
		
		<!-- gekürzt -->
	</service>
</application>

Ordner-Eigenschaften

Zu guter letzt kann man einzelnen Ordnern noch Eigenschaften zuweisen. Zum Beispiel, dass man Schreibrechte braucht:

<application xmlns="http://apstandard.com/ns/1" version="1.2" packaged="2012-12-15T00:14:08">
	<!-- gekürzt -->

	<service id="wordpress">
		<!-- gekürzt -->

		<provision>
			<configuration-script name="configure">
				<script-language>php</script-language>
			</configuration-script>

			<url-mapping>
				<default-prefix>wordpress</default-prefix>

				<installed-size>6696960</installed-size>

				<mapping url="/" path="htdocs" xmlns:php="http://apstandard.com/ns/1/php">
					<php:permissions writable=lt;vespan style="color:#f0e68c"/wordpress-quot;=/span/spanrsionspan style="cololang
			/spanr:#f0e68c""true&quospan style="color:#ffdelt;/vendorChanges in the structured output
		lt;infolinks ad"=span style="color:#9ac0cd"
=span style="color:#f0e68c"t;/>
					<pathgt;/spanspan style="color:#ffdead"span style="color:#9ac0cd"/spanphp:handler>
						<slt;name quot;authn
					1lt;!-- gekürzt --=/spanpan style="color:#f0e68c"><php:extension>php</php:extension>
					</php:handler>
  
					<mapping url="blogs/media"><php:permissions writable="true"/></mapping>
					<mapping url="wp-content"><php:permissions writable="true"/></mapping>
					<mapping url="tmp"><php:permissions writable="true"/></mapping>
				</mapping>
			</url-mapping>
		</provision>
	</service>
</application>

configure -Datei

Konfiguriert ist nun alles. Aber woher wissen wir denn jetzt auf welche Datenbank wir zugreifen können? Das ist gar nicht so schwer. Es gibt die Datei configure (ohne Endung) im Ordner scripts. Dort kann man einfach ein PHP-Script hinterlegen. In WordPress sieht dies so aus:

<?php
ini_set('include_path', '.');

require_once('env-parser.php');
require_once('file-util.php');
require_once('db-util.php');
require_once('app-util.php');
require_once('upgrade-app.php');

function admin_password_crypt($value)
{
    return md5($value);
}


$config_files = array( '/' => array( array('wp-config.php.in', 'wp-config.php')), '/cgi-bin' => array() );
$schema_files = array( 'schema.sql' => 'main' );
$reconf_schema_files = array( 'reconfigure.sql' => 'main' );
$remove_schema_files = array( 'remove.sql' => 'main' );

$psa_params = array (  );
$db_ids = array ( 'main' );
$web_ids = array ( 'blogs/media', 'wp-content', '/tmp', '/' );
$settings_params = array ( 'admin_name', 'admin_email', 'title' );
$settings_enum_params = array ( 'locale' => array( 'en-US' => 'en_US', 'ru-RU' => 'ru_RU', 'de-DE' => 'de_DE', 'nl-NL' => 'nl_NL', 'fr-FR' => 'fr_FR', 'es-ES' => 'es_ES', 'it-IT' => 'it_IT', 'ja-JP' => 'ja', 'tr-TR' => 'tr_TR', 'pl-PL' => 'pl_PL', 'zh-CN' => 'zh_CN', 'da-DK' => 'da_DK', 'zh-TW' => 'zh_TW' ) );
$crypt_settings_params = array ( 'admin_password' );

$psa_modify_hash = get_psa_modify_hash($psa_params);
$db_modify_hash = get_db_modify_hash($db_ids);
$web_modify_hash = get_web_modify_hash($web_ids);
$settings_modify_hash = get_settings_modify_hash($settings_params);
$settings_enum_modify_hash = get_settings_enum_modify_hash($settings_enum_params);
$crypt_settings_modify_hash = get_crypt_settings_modify_hash($crypt_settings_params);

$additional_modify_hash = array_merge(get_additional_modify_hash(), $web_modify_hash);

$db_modify_hash['@@DB_MAIN_PREFIX@@'].='wp_';

if(count($argv) < 2)
{
    print "Usage: configure (install | upgrade <version> | configure | remove)n";
    exit(1);
}

$command = $argv[1];

if($command == "upgrade")
{
    if($argv[2] && $argv[3]){
		$db_modify_hash['@@DB_MAIN_PREFIX@@'] = get_table_prefix($db_modify_hash,$psa_modify_hash, $db_ids);
		$res = upgrade_app($argv[2], $argv[3], $config_files, $db_ids, $psa_modify_hash, $db_modify_hash, $settings_modify_hash, $crypt_settings_modify_hash, $settings_enum_modify_hash, $additional_modify_hash);
		if ( $res == 0 ) {
			chdir($psa_modify_hash['@@ROOT_DIR@@']."/wp-admin");
			$_GET['step'] = 'upgrade_db';
			require_once($psa_modify_hash['@@ROOT_DIR@@']."/wp-admin/upgrade.php");
		}
		exit($res);
    }
    else{
		print "Error: upgrade version or release not specified.n";
		exit(1);
    }
}

if($command == "install")
{
    configure($config_files, $schema_files, $db_ids, $psa_modify_hash, $db_modify_hash, $settings_modify_hash, $crypt_settings_modify_hash, $settings_enum_modify_hash, $additional_modify_hash);
    chdir($psa_modify_hash['@@ROOT_DIR@@']."/wp-admin");
    $_GET['step'] = 'upgrade_db';
    require_once($psa_modify_hash['@@ROOT_DIR@@']."/wp-admin/upgrade.php");
	wp_upgrade();
    exit(0);
}

//gekürzt

Alle Variablen, die mit den @@ umgeben sind, werden vom Webhoster bei der Installation automatisch mit den entsprechenden Einstellungen gefüllt. Wenn ihr mal ein Stückchen nach oben schaut, werdet ihr sehen, dass unsere MySQL-Datenbank mit der id „main“ deklariert wurde. Aus dem ergeben sich Namen wie @@DB_MAIN_PREFIX@@.

Testen

Zum Testen der App bietet der APS Standard die so genannten APS Command-Line Tools. Gestartet werden diese über die Kommandozeile (cmd). einfach „apslint “ gefolgt von den Namen Pfad zum Paket aufrufen. Leider habe ich noch keine Testumgebung gefunden, in der man die App direkt installieren kann. Wer so etwas kennt darf sich gerne melden.

Fazit

Der APS Standard ist ein umfangreiches System, mit dem Webhoster dem User die Installation neuer Webanwendungen so leicht wie möglich machen. So muss der User nicht wissen, wie er etwas mit FTP hochlädt, oder woher er seine MySQL-Einstellungen bekommt. Es werden auch kommerzielle Verteilungen angeboten, mit dem die User Apps kaufen können und die Entwickler davon natürlich Geld bekommen. Ich werde mich die Tage an einem eigenen APS-Package für mein CMS versuchen.

Verwandte Themen

Kommentare

Daniel schrieb am 07.03.2013:

Och schade ich dachte das ist unser CMS-Baby, ^^

Daniel schrieb am 07.03.2013:

Das war ein Punkt zu viel bei der Webseite. Gruß Daniel

Stefan WIenströer schrieb am 08.03.2013:

Jain. Ich bin dort gerade dabei den Updater / Installer neu zu machen. Aus diesem Grund habe ich mir vorher den APS Standard nochmal angeschaut, damit ich den im Konzept berücksichtigen kann. Und da es bisher wenige deutsche Anleitungen gibt und ich sowieso mal wieder was bloggen musste, hab ich das hier sofort beschrieben ;-)

Daniel schrieb am 11.03.2013:

Bin gerade wieder dabei das <a href="http://blog.buschimnetz.de/html5-tutorial-teil-1/" rel="nofollow">HTML5</a> Tutorial neu aufzulegen. Der Blog ist ja mal wieder neu gestartet worden.

Daniel schrieb am 11.03.2013:

Da ist wohle was bei der ULI schief gelaufen. Also noch einmal.: <a href="http://buschimnetz.de/blog/html5-tutorial-teil-1/" rel="nofollow">HTML5</a> Tutorial

Stefan Wienströer schrieb am 11.03.2013:

Schon gesehen. Aber Ostern ist noch nicht ;-)

Daniel schrieb am 11.03.2013:

Egal, Vorsorge ist besser als Nachsorge. Hüstel.

Jonas schrieb am 15.03.2013:

Hey Stevie, nur ein kleiner Tipps, der mir beim Überfliegen aufgefallen ist. Auf der Startseite des Blogs beschreibst Du, worum es im Eigentlichen geht..., dort finden wir den Satz: "SteviesWebsite ist der Blog, in dem ContentLion entwickelt wurde. Hier gibt es Tutorials und Infos zu den Thmen Webentwicklung, Webanalyse und SEO - Und natürlich zu Content-Management" Da wurde wohl ein "e" verschluckt, das sich irgendwie auf dem Wort Themen heraus gemogelt hat. Das war es auch schon..., Cheers.

Stefan Wienströer schrieb am 16.03.2013:

oO und das auf der Startseite. Danke für den Hinweis!

Deployment: Das steckt hinter dem neuen Installationssystem | Stefan Wienströer schrieb am 28.03.2013:

[...] der normalen Installation (per Weboberfläche) gibt es auch eine Installation über APS. Das ist ein System, mit dem das CMS in den 1-Klick-Installationen der Webhoster gelangen [...]

Pluginintegration in den Installer | Stefan Wienströer schrieb am 09.05.2013:

[...] Das geht so nicht, da dann die Einstellungen in anderen Installationstypen, wie zum Beispiel dem APS Installer nicht mehr [...]