Entwicklung: EPSPi - Easy Project Setup for Pi

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • "Easy Project Setup for Pi" - (kurz: EPSPi) - ist angelehnt (oder mittlerweile eher Abgekoppelt) und inspiriert vom Project SetupPi - Schneller zum eigenen Projekt!. Leider scheint perry kein Interesse an meinem Code zu haben, finde es aber zu schade dies im Sande verlaufen zu lassen da mir die Idee eigentlich gut gefällt.
    An dieser Stelle auch ein Danke an perry für diese Idee :thumbs1:

    Das bash Script ist vom Grundgerüst her schon sehr weit fortgeschritten, es fehlt aber weiterhin der eigentliche InstallationsAblauf, da ich ich mir hier noch nicht sicher bin welchen Weg man hier einschlagen sollte bzw welcher Sinnvoll wäre.

    EPSPi liegt zur Zeit hier: http://RaspberryPI.RoXXs.org/EPSPi/

    Da ist zum einen das bash Script zu finden, die Konfigurationsdateien der Packs sowie meine Anfänger des Web-Interfaces.


    Beim starten des Scripts geschieht folgendes:

    • Das Script muss als root (oder zumindest mit dessen Rechten) ausgeführt werden.
    • Das Script darf nur ein mal zur selben Zeit ausgeführt werden - zu diesem zweck wird ein PIDFILE überprüft.
    • Es wird überprüft ob die fürs Script benötigten Pakete installiert sind: curl , und entweder whiptail oder dialog (letzteres ist die Voreinstellung was ich besser finde, das Script funktioniert aber auch mit whiptail)
    • Damit das Script genutzt werden kann, muss der PI online sein - zu diesem Zweck wird mein Server angepingt, kommt keine Antwort kann das Script auch nicht weiter genutzt werden..
    • Es wird die Version des Scripts mit dem Inhalt der Datei http://RaspberryPI.RoXXs.org/EPSPi/.version überprüft. Ist eine neuere Scriptversion verfügbar wird das Script neu geladen und erneut ausgeführt.

      • Es läuft auch ein Script auf dem Server um die .version automatisch zu erneuern (via crontab jede Minute)
    • Es werden alle Konfigurationsdateien der verfügbaren Pakete/Projekte heruntergeladen und ausgelesen, was recht schnell geht: für jede *.cfg ein "punkt" um einen Prozess anzuzeigen :fies:
    • In den Configs sind Kategorien hinterlegt, nach dessen die Packs im Main_Menü sortiert angezeigt werden. (1. Screenshot)

      • Hinter der Kategorie steht wie viele Packs in dieser Kategorie verfügbar sind
    • Nach der Auswahl der Kategorie kriegt man eine Auswahl der Pakete angezeigt, mit einer kurzen Beschreibung. (2. Screenshot)
    • Ein bereits installiertes Pack wird mit (*) markiert.

      • Geplant ist auch dass das Script die installierte Pack-Version mit der verfügbaren vergleicht und ggf ein mögliches Update anzeigt
    • Wählt man ein Pack aus wird eine (hoffentlich) ausführlichere Beschreibung angezeigt. Drückt man dann Enter kommt man zum nächsten Screen, drückt man aber ESC gelangt man zurück zur Pack-Auswahl. (3. Screenshot)

      • Hat man Enter gedrückt wird gefragt ob man das Pack installieren möchte ( Yes / No ). (4. Screenshot)
        Hiernach würde dann normalerweise das setupfile , welches in der Konfiguration hinterlegt ist, ausgeführt werden..
    • Ist in der Konfigurationsdatei hinterlegt dass das Pack ein Reboot erfordert, wird nach der Installation gefragt ob dieser nun durchgeführt werden soll.


    Die Konfigurationsdatei sieht derzeit wie folgt aus:

    ...Soweit so gut....

    Ihr könnt das Script mit folgendem Befehl laden und testen:

    Code
    sudo wget -q -O/usr/local/bin/EPSPi.sh http://raspberrypi.roxxs.org/EPSPi/EPSPi.sh && sudo chmod +x /usr/local/bin/EPSPi.sh && sudo EPSPi.sh

    (wenn ihrs dann später noch mal ausführen wollt braucht ihr nur sudo EPSPi.sh eingeben)


    Leider tue ich mich schwer das Web-Interface zu erstellen - generell verballer ich mehr Zeit mit diesem blöden HTML Zeuchs als mit bash... Hab damit schon grob angefangen ( Unterordner html/ ) aber ich tu mich damit wie gesagt schwer eine Basis zu finden wo User ihre Projekte hinzufügen können oder wo man diese auch verwalten / freischalten kann....

    Ich weiß auch noch nicht ob es über Github oder sowas soviel mehr Sinn machen würde - es soll ja auch so einfach wie möglich bleiben...


    Daher bitte ich hier nun um Rat:
    Wie würdet ihr das machen?
    Hat hier vielleicht jemand Lust (und Skills) sich um das Web-Interface zu kümmern :huh:


    :danke_ATDE:

  • Hallo meigrafd!

    HTML kann ich machen.


    MfG perry

    P.S.: Werde mein Projekt dann einstellen, bin mit der Entwicklung ja scheinbar nicht schnell genug.

    MfG Perry

    Der Rauch ist dann wohl kein gutes Zeichen :lol::wallbash:

    Einmal editiert, zuletzt von perry (23. Januar 2015 um 19:59)

  • Hallo meigrafd,
    mir sind 2 kleine Bugs aufgefallen:

    Bei DoorPi wird die "shortdescription" nach dem T abgeschnitten.
    Bei der langen "description" ist nach dem 7. Wort schluss.
    <- Siehe Anhang

    Das mit den Installationsskripten ist in der Tat schwierig.
    Ein Problem sehe ich darin, dass die Installationsskripte je nach Skills des Verfassers von unterschiedlicher Qualität sind.

    Es müssten vom Verfasser einige (zu definierende) Vorgaben eingehalten werden. z.B:

    1: Vor der Installation prüfen, ob zu installierende Pakete in Konflikt mit bereits installierten stehen.
    <- Oder willst du das direkt in EPSPi machen? Würde einwandfreie .cfg Dateien eines jeden Verfassers voraussetzen. Wer kennt jedes Projekt so gut, dass er das beurteilen kann?

    2: Exception Handling -> Rückmeldung an EPSPi

    3: Man nehme an, jemand installiert über EPSPi ein Projekt, das z.B u.a auf wiringPi (etwas, das nicht aus den offiziellen Repos stammt) setzt. Der Nutzer hat wiringPi jedoch bereits installiert. Das Installationsskript muss auch das erkennen und die Installationsroutine für wiringPi in der projectinstall.sh entsprechend überspringen.

    Zusammengefasst eben all das, was eine Paketverwaltung so macht.

    Eventuell könnte man ein Grundgerüst für ein Installationsskript zur Verfügung stellen, das all diese Routinen schon enthält und vom Verfasser nur noch angepasst werden muss. Eher eine schwierige Aufgabe.

    Außerdem würden sich eventuell in den .cfg Dateien die Zeilen "needhardware=0/1" und "hardwaredescription=" anbieten.
    Wenn (installation erfolgreich abgeschlossen) || (needhardware == wahr) -> --msgbox mit Infos zur Hardwareinstallation. Wenn die Hardwareinstallation aufwändiger ausfällt, ein Link zur Projektseite.

    perry:
    meigrafd hatte ja in deinem Thread erwähnt, dass er bereits zu einem früheren Zeitpunkt Gedanken zu einem solchen Projekt hegte. Als dann dein Thread aufkam bot es sich ihm wohl an, seine Ideen dazu zu äußern. Wie man deinem Thread zu SetupPi entnehmen kann, entsprachen seine Ideen nicht deinen Vorstellungen.

    Wenn Entwickler unterschiedliche Vorstellungen haben passiert es nicht selten, dass 2 verschiedene Programme entstehen. Daraus resultiert Vielfalt, was keinesfalls schlecht ist.

    Auch wenn man hier nicht wirklich von einem Fork sprechen kann, so ist es doch im Kern das gleiche:
    http://de.wikipedia.org/wiki/Abspaltun…eentwicklung%29

    edit: Dein Edit reißt das jetzt leider aus dem Zusammenhang. Schön, dass du das dann scheinbar auch so siehst. Zusammenarbeiten ist produktiver als gegeneinander zu arbeiten :thumbs1:

  • Hi perry,


    ... P.S.: Werde mein Projekt dann einstellen, bin mit der Entwicklung ja scheinbar nicht schnell genug.

    warum so so vorschnell ...
    Es gibt immer mehrere Wege zum Ziel. Möglicherweise ist der Königsweg ja ein Konglumerat aus Deinem und meigrafds Ansatz, das dann irgendwann von einem jetzt noch unbeteiligten Dritten erstellt wird ;) ...

    Würden alle nur immer einem Ansatz folgen, dann wäre die Welt voller Windows-Rechner :baeh2: ...

    cu,
    -ds-


  • Bei DoorPi wird die "shortdescription" nach dem T abgeschnitten.
    Bei der langen "description" ist nach dem 7. Wort schluss.
    <- Siehe Anhang

    Hm, komisch. Das muss an den Umlauten liegen. Wobei das bei mir funktioniert - aber sollte man dann wohl echt vermeiden ;) Please retry

    Das mit den Installationsskripten ist in der Tat schwierig.
    Ein Problem sehe ich darin, dass die Installationsskripte je nach Skills des Verfassers von unterschiedlicher Qualität sind.

    Dazu dachte ich mirs so, dass Jeder sein Projekt einfügen kann, aber diese erst freigeschaltet werden müssen - also jemand prüft das Script, überarbeitet es und erst danach kann es freigeschaltet werden (nach /packs/ verschieben).

    Je nach dem wieviele ihr Projekt einfügen wollen gäbs halt etwas zu tun, aber natürlich wärs gut wenn man gewisse Prüfmechanismen einbaut um die richtige Funktionsweise zu verifizieren. Denkbar wäre hierfür entweder chroot zu nutzen, oder eine extra VM um das Projekt dort probehalber installieren zu lassen...(VM kann ich aufsetzen)

    Problem was ich halt sehe ist dass das einfügen eines Projekts für denjenigen nicht zu kompliziert sein sollte - weil die meisten sind froh wenn sie es wiederholt noch mal funktionsfähig installiert kriegen :D

    Es müssten vom Verfasser einige (zu definierende) Vorgaben eingehalten werden. z.B:

    1: Vor der Installation prüfen, ob zu installierende Pakete in Konflikt mit bereits installierten stehen.
    <- Oder willst du das direkt in EPSPi machen? Würde einwandfreie .cfg Dateien eines jeden Verfassers voraussetzen. Wer kennt jedes Projekt so gut, dass er das beurteilen kann?

    Hm ne, EPSPi kann nicht alle möglichen Pakete auf Konflikt prüfen bzw wär das bisschen heavy, das sollte schon in der Config entsprechend drin stehen ;)

    2: Exception Handling -> Rückmeldung an EPSPi

    Wie meinst du das?

    3: Man nehme an, jemand installiert über EPSPi ein Projekt, das z.B u.a auf wiringPi setzt. Der Nutzer hat wiringPi jedoch bereits installiert. Das Installationsskript muss auch das erkennen und die Installationsroutine für wiringPi in der projectinstall.sh entsprechend überspringen.

    Das wären ja nur 3-4 Zeilen, die kann ja jemand erfahrenes einfügen :fies:

    Eventuell könnte man ein Grundgerüst für ein Installationsskript zur Verfügung stellen, das all diese Routinen schon enthält und vom Verfasser nur noch angepasst werden muss. Eher eine schwierige Aufgabe.

    Das ist eine gute Idee :thumbs1: da wäre ja zB das DoorPI.sh vielleicht für schon nicht schlecht ;)
    Aber es kommt schon noch auf das jeweilige Projekt an, von daher sollte es dann trotzdem noch verifiziert werden - insbesondere um eine gewisse Qualitätsgarantie gewährleisten zu können und sicherzustellen das kein Honk sowas wie "rm -rf /" ins Script versteckt...

    Außerdem würden sich eventuell in den .cfg Dateien die Zeilen "needhardware=0/1" und "hardwaredescription=" anbieten.
    Wenn (installation erfolgreich abgeschlossen) || (needhardware == wahr) -> --msgbox mit Infos zur Hardwareinstallation. Wenn die Hardwareinstallation aufwändiger ausfällt, ein Link zur Projektseite.

    Hm ja... Ich würd in Jedem Fall schon eine URL hinzufügen, damit die Anwender auch wissen an wen sie sich wenden können falls es Probleme gibt.
    Hardwareanforderungen kann man auch nicht immer prüfen, aber ein Hinweis darauf kann ich noch einbauen, ja ;)
    Ich hatte auch noch vor in dem Dialog der Beschreibung die möglichen Konflikte mit anzuzeigen etc...

  • Möglich wäre auch eine Website, die die Setup-Dateien nach Vorgabe generiert und ins System bringt!

    MfG perry

    Aja: rip-update ist für z.B. Ambilight nicht wirklich förderlich!

    Kann eine Bash-Datei einen JSON-String parsen?

    MfG Perry

    Der Rauch ist dann wohl kein gutes Zeichen :lol::wallbash:

    Einmal editiert, zuletzt von perry (23. Januar 2015 um 22:17)

  • Bezüglich Hardware liegt es auch ein ganzes Stück am Entwickler.
    Ich _muss_ als Entwickler noch daran arbeiten für das DoorPi Projekt solche Abfragen einzufügen (keyboard laden, testen und Benutzer nach Rückmeldung fragen).

    Ich würde mich als Testpilot anbieten. Wenn ich es schaffe, dann schafft es jeder...

    Ich denke, man sollte sich beizeiten Abgrenzungen bei diesem Projekt setzen. Die Konfiguration der Anwendung sollte dann z.B. bei der Anwendung liegen und nicht noch im SetupPi, sorry, dem EPSPi liegen...

    PS: Kann es bei den Umlauten an Problemen mit der Kodierung und Ländereinstellung liegen?

    PPS: Schön wäre die Möglichkeit mehrere Sprachen einzupflegen :)

  • rpi-update sollte zZt niemand leichtsinnig ausführen, da gestern auf den "next" Kernel gewechselt wurde aber sich einiges geändert hat, was zB auch das einbinden von I2C usw betrifft.
    rpi-update ist aber auch immer ein Beta-Kernel/Firmware was selbstverständlich auch Fehler/Bugs enthalten kann. Stable Versionen sind übers Repository (also apt-get) erhältlich.

    Gerade deshalb würde ich es schon bevorzugen das jemand Menschliches die Konfiguration- und Setup- Files vorher noch mal anguckt bevor sie freigegeben werden, schließlich wäre es nicht wirklich förderlich wenn durch solch ein Install-Script-Bundle das System zerschossen und letztlich mehr Arbeit veraursacht wird :-/


    perry: Hättest du denn Lust sowas in HTML/PHP/whatever zu programmieren?

    Hab eine PHP-Funktion um die configs auszulesen - die könntest du ja verwenden um Dynamisch Eingabefelder zu erzeugen (damit man nicht jedes mal die HTML/PHP Dateien bearbeiten muss ums zu erweitern - ich mag kein Hardcoded).

    Also mein bisheriger HTML Part:

    &quot;include/config.php&quot;

    [code=php]<?php
    error_reporting(E_ALL);
    ini_set("upload_max_filesize", "100M");
    ini_set('track_errors', 1);
    ini_set('display_errors', 1);
    ini_set('log_errors', 1);

    $Source = "/var/www/EPSPi";
    $SourceURL = "http://RaspberryPI.RoXXs.org/EPSPi/";
    $Script = $SourceURL."EPSPi.sh";

    ?>[/php]

    &quot;include/global.php&quot;

    [code=php]<?php
    require_once("config.php");

    /* Functions */

    // Auslesen der *.cfg's
    // nur variablen in " " werden ausgelesen
    function getPacks($directory) {
    global $PACKarray, $PACKcounter;
    $configFiles = glob($directory."*.cfg");
    if (!empty($configFiles)) {
    $PACKarray = array();
    $PACKcounter = 0;
    foreach($configFiles AS $CF) {
    $PACKarray["$CF"] = array();
    $fp = fopen($CF, "r");
    while($input = fgets($fp, 1024)) {
    preg_match("/^(.+)=\"(.*)\"/", trim($input), $find);
    if (isset($find[1]) AND !empty($find[1])) {
    if (empty($find[2])) { $find[2]='""'; }
    $PACKarray["$CF"][$find[1]] = $find[2];
    }
    }
    @fclose($fp);
    $PACKcounter++;
    }
    }
    }

    # make_clickable($text, array("target"=>"_blank"));
    function make_clickable($text, $attributes=array()) {
    $attrs = '';
    foreach ($attributes as $attribute => $value) {
    $attrs .= " {$attribute}=\"{$value}\"";
    }
    return preg_replace('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0"'.$attrs.'>\0</a>', $text);
    }

    ?>[/php]

    &quot;index.php&quot;

    [code=php]<?php
    require_once("include/global.php");
    ?>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" lang="de">
    <head>
    <title>EPSPi - Easy Project Setup for Pi</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="robots" content="disallow">
    <link rel="stylesheet" href="css/style.css" type="text/css">
    <SCRIPT type="text/javascript" language="JavaScript">
    function DivAnzeigen(id) {
    if (document.getElementById(id).style.display == "none") {
    document.getElementById(id).style.display = "block";
    } else {
    document.getElementById(id).style.display = "none";
    }
    }
    </SCRIPT>
    </head>
    <body>
    <div id="WhatIs"><h2><b>Was ist "Easy Project Setup for Pi" und was benötige ich um es zu nutzen?</b></h2>
    Easy Project Setup for Pi (kurz: EPSPi) soll gerade für Anfänger eine Hilfe sein, Benutzer-Projekte und/oder umfangreichere Paket-Bundles auf einfache Weise auf dem RaspberryPI zu installieren.<br/>
    Um EPSPi benutzen zu können reicht die Linux-Konsole völlig aus, man brauch also keinen Monitor am PI.<br/>
    <br/>
    Die Verwendung von EPSPi ist ziemlich einfach. Beim ausführen des <b><a href="<?php echo $Script; ?>">Scripts</a></b> kann man mithilfe der Pfeil- und Enter- Taste durch ein Auswahlmenü navigieren.<br/>
    Projekte/Pakete sind in Kategorien unterteilt, enthalten Beschreibungen sowie installation-Scripts die vor dem Einbinden in EPSPi überprüft wurden.<br/>
    <br/>
    Das Script überprüft beim ausführen ob von sich selbst eine neue Version verfügbar ist und updated sich selbstständig. Bei der Entwicklung wurde darauf geachten dass das Script möglichst flexibel ist,<br/>
    wenn also neue Pakete/Projekte hinzu kommen muss nicht das Script aktualisiert werden.<br/>
    Auch installierte Projekten werden als solche angezeigt, sowie beim ausführen des Script geprüft ob von diesen eine neue Version verfügbar ist.<br/>
    </div>
    <br/>
    <br/>
    <!--
    <div id="WhoCanAdd"><h2><b>Wer kann Projekte hinzufügen und wie geht das?</b></h2>
    Jeder.<br/>

    </div>

    <br/>
    <br/>
    -->

    <?php getPacks($Source."/packs/"); ?>
    <div id="AvailablePacks"><h2><b>Derzeit verfügbare Pakete/Projekte:</b> (<?php echo $PACKcounter; ?>)</h2>
    <?php
    foreach($PACKarray AS $PackCFG => $PackCFGarray) {
    $PackName = $PackCFGarray["Pack"];
    $PackShortDescription = str_replace("\\n", "<br/>", $PackCFGarray["shortdescription"]);
    $PackDescription = str_replace("\\n", "<br/>", $PackCFGarray["description"]);
    $PackDescription = make_clickable($PackDescription, array("target"=>"_blank"));
    $PackURL = str_replace('"', '', $PackCFGarray["url"]);
    echo "<b class='fett' onClick='DivAnzeigen(\"".$PackName."\");'>-> <a href='#'>".$PackName."</a> -></b> ".$PackShortDescription."<br/>\n";
    echo "<div id='".$PackName."' style='display:none'>\n";
    if (!empty($PackURL)) {
    $PackURL = make_clickable($PackURL, array("target"=>"_blank"));
    echo "<br/>Project URL: ".$PackURL."\n";
    }
    echo "<dir>\n";
    echo $PackDescription;
    echo "</dir>\n";
    echo "</div>\n";
    }
    ?>
    </div>

    </body>
    </html>[/php]

  • meigrafd:
    Ich bastel dann zuerst mal die Website!
    ZIP-Link kommt per PM!

    P.S.: Jab, den Webpart kann ich übernehmen!

    P.S.S.: Ich würde dann die Config-Dateien nicht statisch sondern dynamisch machen. Kannst du mit Bash den Inhalt einer Website in Form eines JSON-Strings parsen?

    MfG Perry

    Der Rauch ist dann wohl kein gutes Zeichen :lol::wallbash:

    Einmal editiert, zuletzt von perry (23. Januar 2015 um 22:34)

  • Ich weiß grad nicht genau was ich mir unter einem JSON String vorstellen soll, und auch nicht wozu man das in bash parsen können soll - aber klar, alles ist irgendwie möglich :fies: :D



    Ich denke, man sollte sich beizeiten Abgrenzungen bei diesem Projekt setzen. Die Konfiguration der Anwendung sollte dann z.B. bei der Anwendung liegen und nicht noch im SetupPi, sorry, dem EPSPi liegen...

    Yep genau so seh ich das auch. Es würde denk ich den Rahmen sprengen wenn dieses Projekt hier auch noch die zu installierenden Projekte 'kontrollieren' muss.
    In der Konfiguration dient "conflict" nur dazu - oder so war es von mir angedacht - um installierte "apt-get" Pakete zu kontrollieren, um zum Beispiel bei "LAMPS" festzlegen das parallel nicht auch noch nginx o.ä. installiert sein sollte.
    Genauere Abhängigkeiten sollten dann im jeweiligen setupfile geregelt werden

    Es wird anfangs etwas umständlich sein überhaupt erst mal ein paar PACKs aufzunehmen usw aber es kommen ja nicht Täglich neue Projekte raus die man einpflegen muss ;)

    Wichtig ist wie ich finde das es nicht allzu kompliziert wird - nicht zu viel was man für EPSPi (oder SetupPI, whatever) konfigurieren muss um die Einsteller nicht zu überfordern - darauf sollte schon geachtet werden wie ich finde ;)

    PS: Kann es bei den Umlauten an Problemen mit der Kodierung und Ländereinstellung liegen?

    Jein, zwar auch, ja, aber primär denk ich am Zeichensatz des Terminalprogramms, also zB PuTTY. Ich hab im letzten Update des Scripts versucht das zu umgehen - wenn das auch nichts bringt dann muss einfach drauf geachtet werden keine Umlaute in den Beschreibungen zu haben (das kann man ja einfach beim Einpflegen in PHP umwanden)

    PPS: Schön wäre die Möglichkeit mehrere Sprachen einzupflegen :)

    Deutsch und English sollte hier dann aber eigentlich reichen - wobei die Entwicklung ja auch in einem Deutschen Forum entsteht und vermutlich 99% Der Anwender auch Deutsch sein werden :geek:

    Man müsste dann aber auch alle Beschreibungen im Script und auch auf dem Web-Interface mehrsprachig verfügbar sein müsste... :denker:

  • Das mit den Umlauten ist behoben :thumbs1:

    Bezüglich dem Hinzufügen der Projekte:
    Eine (in der Umsetzung eher aufwändige) Idee:

    Super wäre eine HTML mit ein paar Feldern zur Eingabe der .cfg-Daten. Aus den eingegebenen Daten kann dann automatisiert die .cfg generiert werden. Nach dem Submit durch den Projektuploader hast du dann einen Unterordner auf dem Webserver, welcher die 3 nötigen Dateien projekt.cfg install.sh deinstall.sh enthält. Bin was HTML und Co angeht auch eher unfähig. Im Anhang ist ein Mock-Up.

    Die Konfliktprüfung würde ich einfach in die Installationsskripte packen:

    Das Exception Handling bezog sich auf die unterschiedliche Qualität der Skripte.
    Der eine wertet den Returncode aus nachdem was kompiliert wurde, der andere nicht.

    ->Aber solange sich jemand :fies: mit viel Geduld die ganzen Skripte anschaut, ist ja alles ok.

    edit: Da war die Antwortseite zu lange auf und das ist alles schon in der Mache


    ZIP-Link kommt per PM!

    Poste die Ergebnisse doch hier.
    Viele Augen sehen viel :thumbs1:

  • meigrafd

    Hätte dazu auch noch einen Vorschlag:
    Wenn alle Sachen online eingereicht werden, könne diese auch in einer MySQL-Db abgespeichert werden und der Inhalt der .cfg Datei dynamisch angegangen werden. Beispiel: anstatt http://setuppi.de/cfg/doorpi.cfg -> http://setuppi.de/cfg/cfg.php?p=doorpi
    Vorteil: Skripte sind vollkommen dynamisch, sämtlicher Inhalt kann jederzeit angepasst werden. Für jeden Aufruf der Datei werden die Daten neu aus der DB ausgelesen. Damit wäre eine Info-Möglichkeit auf der Homepage auch leichter umsetzbar.

    MfG perry

    P.S.: Poste das morgen mal hier ;)

    MfG Perry

    Der Rauch ist dann wohl kein gutes Zeichen :lol::wallbash:

  • Ich würde noch einen Vorschlag mit einbringen - die cfg etwas dynamischer:

    Spoiler anzeigen

    Es ist in meinem Beispiel zu Kategorieren zusammengefasst:
    Project beschreibt das Projekt selber.
    Usermanagement erzeugt User und Gruppen die zum ausführen benötigt werden (sollen) damit nicht alles als sudo oder pi läuft.
    Install ist eine Sammlung der Parameter, die durch das Installscript verarbeitet werden, z.B. rebbot nötig.
    Hardware hat nur Nutzen für den User, es wird angezeigt was als Hardware benötigt wird. Eventuell auch ; separiert und in der Form PiFace <http://www.piface.org.uk/products/piface_digital/>.
    Software ist eine Zusammenstellung der Installationsmöglichkeiten (eventuell muss nur ein Teil installiert werden)
    Software_ sind die verschiedenen Installationsvarianten.

    Für mein Beispiel würde JSON so aussehen:

    Spoiler anzeigen

    [/php]

  • P.S.S.: Die Installationsskripte werden dann auch durch ein Skript generiert! Dort gibt man an, wann welcher Befehl kommt. Die Sachen werden dann mit einer Art eigenen simplen Programmiersprache erstellt, die dann in eine .sh Datei umgewandelt wird. So können auch IF-Anfragen von Usern leicht erstellt werden. Bsp:

    Code
    update()     //apt-get update
    upgrade()     //apt-get upgrade
    run(git pull origin)     //git pull origin
    ask(restart())     //if(read() -eq "yes") then reboot; end
    say(Installation erfolgreich beendet!)     //echo "Installation erfolgreich beendet!"

    MfG Perry

    Der Rauch ist dann wohl kein gutes Zeichen :lol::wallbash:

    Einmal editiert, zuletzt von perry (23. Januar 2015 um 23:29)

  • Sorry aber langsam wirds schon etwas abgehoben wie ich finde - das machts nur unnötig kompliziert.

    motom001: Sowas ist nicht Aufgabe dieses Projekts hier sondern des jeweiligen Packs. EPSPi/SetupPI interessiert es eigentlich eher weniger als welcher Benutzer das Pack installiert wird usw.
    Das hier soll ja eigentlich nur ganz grob dazu dienen andere Scripts auszuführen... Was dann wiederum in den Installscripts drin steht ist EPSPi im Prinzip schnuppe ;)

    perry: MySQL würde es denk ich auch unnötig verkomplizieren. Ich hab so wie es zZt ist kein Problem damit umzugehen - das Installscript dann auch noch dynamisch erzeugen zu lassen würde es ebenfalls unnötig kompliziert (für uns Entwickler) machen, da dann alle möglichen Eventualitäten mit beachtet werden müssten usw und wenn jmd etwas nachträglich ändern will geht das nicht weil das ja Hardcoded aus der DB generiert wird... Also müsste man erst in der DB irgendwas ändern sodass eine Ausnahme mit beachtet werden würde (nicht alle Projekte werden identisch installiert)

    Einfacher wäre es mit einer Vorlage wie zB das DoorPI.sh was ich vor ein paar Tagen erstellt hab, erklären was dort passiert, einzelne Abschnitte die vom Einreicher ausgewählt werden können, und die machen dann copy&paste für ein InstallScript sofern sie noch keins haben...

    Die ganzen Sachen können ruhig direkt auf der Platte liegen, diese zu schreiben und/oder auszulesen stellt für mich bisher kein Problem dar - nur der HTML/CSS dreck geht mir schnell aufn kecks :D


    Gewöhn dir aber bitte auch mal an deine Beiträge zu bearbeiten und nicht immer mit "P.S.S" oder so einen neuen Beitrag zu machen, das sieht irgendwann komisch aus...


    Aber :danke_ATDE: für eure Gedanken! ;)


    //EDIT:

    Mmmh.. Ich sags ja, HTML is doof :D -> http://raspberrypi.roxxs.org/EPSPi/html/add.php

    &quot;include/config.php&quot;

    [code=php]<?php
    error_reporting(E_ALL);
    ini_set("upload_max_filesize", "100M");
    ini_set('track_errors', 1);
    ini_set('display_errors', 1);
    ini_set('log_errors', 1);

    $Source = "/var/www/EPSPi";
    $SourceURL = "http://RaspberryPI.RoXXs.org/EPSPi/";
    $Script = $SourceURL."EPSPi.sh";

    // Upload to which Directory?
    $TMPdir="/tmp/upload";
    ?>[/php]

    &quot;include/global.php&quot;

    [code=php]<?php
    require_once("config.php");

    /* Functions */

    // Auslesen der *.cfg's
    // nur variablen in " " werden ausgelesen
    function getPacks($directory) {
    global $PACKarray, $PACKcounter;
    $configFiles = glob($directory."*.cfg");
    if (!empty($configFiles)) {
    $PACKarray = array();
    $PACKcounter = 0;
    foreach($configFiles AS $CF) {
    $PACKarray["$CF"] = array();
    $fp = fopen($CF, "r");
    while($input = fgets($fp, 1024)) {
    preg_match("/^(.+)=\"(.*)\"/", trim($input), $find);
    if (isset($find[1]) AND !empty($find[1])) {
    if (empty($find[2])) { $find[2]='""'; }
    $PACKarray["$CF"][$find[1]] = $find[2];
    }
    }
    @fclose($fp);
    $PACKcounter++;
    }
    }
    }

    # make_clickable($text, array("target"=>"_blank"));
    function make_clickable($text, $attributes=array()) {
    $attrs = '';
    foreach ($attributes as $attribute => $value) {
    $attrs .= " {$attribute}=\"{$value}\"";
    }
    return preg_replace('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0"'.$attrs.'>\0</a>', $text);
    }

    function verifyUpload($fileArray, $destDir) {
    $FileName = $fileArray['name'];
    $FileError = $fileArray['error'];
    if (!move_uploaded_file($fileArray['tmp_name'], "$destDir/".$FileName."")) {
    echo "<b class='tabred'>Beim Upload trat ein Fehler auf, bitte noch mal probieren!</b> \n";
    if (isset($FileError) AND !empty($FileError)) { echo "<br/><b class='tab'>".uploaderror($FileError)."</b>\n"; }
    echo "<br/>\n";
    } else {
    $FileSize = get_size($fileArray['size']);
    $FileType = $fileArray['type'];
    echo "<b class='tabgreen'>Die Datei</b> <b class='tab'>".$FileName." (".$FileSize.")</b> ";
    echo "<b class='tabgreen'>wurde erfolgreich hochgeladen und befindet sich nun in</b> <b class='tab'>".$destDir."</b><br/>\n";
    }
    }

    function get_size($size,$precision=2,$long_name=true,$real_size=true) {
    $base=$real_size?1024:1000;
    $pos=0;
    while ($size>$base) {
    $size/=$base;
    $pos++;
    }
    $prefix=get_size_prefix($pos);
    $size_name=$long_name?$prefix."bytes":$prefix[0].'B';
    return round($size,$precision).' '.ucfirst($size_name);
    }

    function get_size_prefix($pos) {
    switch ($pos) {
    case 00: return "";
    case 01: return "Kilo";
    case 02: return "Mega";
    case 03: return "Giga";
    case 04: return "Tera";
    case 05: return "Peta";
    case 06: return "Exa";
    case 07: return "Zetta";
    case 08: return "Yotta";
    case 09: return "Xenna";
    case 10: return "W-";
    case 11: return "Vendeka";
    case 12: return "u-";
    default: return "?-";
    }
    }

    # http://www.php.net/manual/en/features.file-upload.errors.php
    function uploaderror($returncode) {
    $msg="";
    switch ($returncode) {
    case 0:
    break;
    case 1:
    $msg = "The uploaded file exceeds the upload_max_filesize directive in php.ini.";
    break;
    case 2:
    $msg = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.";
    break;
    case 3:
    $msg = "The uploaded file was only partially uploaded.";
    break;
    case 4:
    $msg = "No file was uploaded.";
    break;
    case 6:
    $msg = "Missing a temporary folder.";
    break;
    case 7:
    $msg = "Failed to write file to disk.";
    break;
    case 8:
    $msg = "A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop";
    $msg.= " examining the list of loaded extensions with phpinfo() may help.";
    break;
    default:
    $msg = "Unknown upload error";
    break;
    }
    return $msg;
    }

    ?>[/php]

    &quot;add.php&quot;

    [code=php]<?php
    require_once("include/global.php");
    $_SELF=$_SERVER['PHP_SELF'];
    $eRROR='';
    ?>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" lang="de">
    <head>
    <title>EPSPi - Add Project</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="robots" content="disallow">
    <link rel="stylesheet" href="css/style.css" type="text/css">
    <style>
    .tab {
    letter-spacing: 0px;
    font-family: verdana, arial, helvetica, verdana, tahoma, sans-serif;
    font-size: 13px;
    text-align: left;
    color: #c8c8c8;
    font-weight: normal;
    }
    .tabred {
    letter-spacing: 0px;
    font-family: verdana, arial, helvetica, verdana, tahoma, sans-serif;
    font-size: 13px;
    text-align: left;
    color: firebrick;
    font-weight: bold;
    }
    .tabgreen {
    letter-spacing: 0px;
    font-family: verdana, arial, helvetica, verdana, tahoma, sans-serif;
    font-size: 13px;
    text-align: left;
    color: limegreen;
    font-weight: bold;
    }
    </style>
    </head>
    <body>
    <?php
    getPacks($Source."/packs/");

    if (!empty($_POST)) {
    $newPackData = array();
    foreach ($_POST AS $arg => $var) {
    $newPackData[$arg] = $var;
    }
    }

    if (isset($newPackData['Pack'])) {
    $FOUND=0;
    foreach($PACKarray AS $PackCFG => $PackCFGarray) {
    foreach($PackCFGarray AS $Setting => $VALUE) {
    if ($newPackData['Pack'] == $PackCFGarray['Pack']) { $FOUND = 1; break; }
    }
    if ($FOUND === 1) { break; }
    }
    $unconfirmedPacks = glob($TMPdir."/*");
    if (!empty($unconfirmedPacks)) {
    foreach($unconfirmedPacks AS $uP) {
    if (basename($uP) == $newPackData['Pack']) { $FOUND = 1; break; }
    }
    }
    if ($FOUND === 1) {
    echo "<b class='tabred'>Es gibt bereits ein Projekt dieses Namens!</b>\n";
    } else {
    $destDir = $TMPdir."/".$newPackData['Pack'];
    if (!is_dir("$destDir") AND !mkdir("$destDir", 0777, true)) {
    echo "<b class='tabred'>Error creating Pack dir ".$destDir."</b><br/>\n";
    } else {
    if (isset($_FILES['uploadInstall']['name']) AND !empty($_FILES['uploadInstall']['name'])) {
    verifyUpload($_FILES['uploadInstall'], $destDir);
    }
    if (isset($_FILES['uploadDeInstall']['name']) AND !empty($_FILES['uploadDeInstall']['name'])) {
    verifyUpload($_FILES['uploadDeInstall'], $destDir);
    }
    if (isset($_FILES['uploadArchive']['name']) AND !empty($_FILES['uploadArchive']['name'])) {
    verifyUpload($_FILES['uploadArchive'], $destDir);
    }
    }
    $handle = fopen("".$destDir."/".$newPackData['Pack'].".cfg", 'w');
    foreach($newPackData AS $Set => $val) {
    @fwrite($handle, "".$Set."=\"".$val."\"\n");
    }
    fclose($handle);
    }
    }

    ?>
    <div id="AddPACK"><h2><b>Projekt einreichen:</b></h2>
    <form enctype='multipart/form-data' action='<?php echo htmlspecialchars($_SELF); ?>' action='' method='POST'>
    <table border="1" cellspacing="1" cellpadding="5">
    <?php
    $counter=0;
    foreach($PACKarray AS $PackCFG => $PackCFGarray) {
    if ($counter == 1) { break; }
    foreach($PackCFGarray AS $Setting => $VALUE) {
    if (isset($newPackData[$Setting])) { $value = $newPackData[$Setting]; } else { $value=''; }
    echo "<tr>\n";
    echo "<td>";
    if ($Setting == "Pack") {
    echo "<b>Projektname</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' maxlength='70' value='".$value."' autofocus='autofocus' required='required'></td>\n";
    } elseif ($Setting == "category") {
    echo "<b>Kategorie</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."'></td>\n";
    } elseif ($Setting == "shortdescription") {
    echo "<b>Kurzbeschreibung</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."' required='required'></td>\n";
    } elseif ($Setting == "description") {
    echo "<b>Langbeschreibung</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."' required='required'></td>\n";
    } elseif ($Setting == "url") {
    echo "<b>Projektseite</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."'></td>\n";
    } elseif ($Setting == "version") {
    echo "<b>Versionsnummer</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."' required='required'></td>\n";
    } elseif ($Setting == "conflict") {
    echo "<b>Konfliktpakete</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."'></td>\n";
    } elseif ($Setting == "additional") {
    echo "<b>Zusatzpakete</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."'></td>\n";
    } elseif ($Setting == "needhardware") {
    echo "<b>Hardware erforderlich?</b>";
    echo "</td>\n";
    echo "<td><input id='checkbox-Hardware' type='checkbox' name='".$Setting."' value='1'/></td>\n";
    } elseif ($Setting == "hardwaredescription") {
    echo "<b>Zusatz Hardware Beschreibung</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."'></td>\n";
    } elseif ($Setting == "Reboot") {
    echo "<b>Reboot erforderlich?</b>";
    echo "</td>\n";
    echo "<td><input id='checkbox-Reboot' type='checkbox' name='".$Setting."' value='1'/></td>\n";
    } elseif ($Setting == "setupfile") {
    echo "<b>Installscript</b>";
    echo "</td>\n";
    echo "<td><input name='uploadInstall' type='file' size='50' maxlength='100000' required='required'></td>\n";
    } elseif ($Setting == "deinstall") {
    echo "<b>Deinstallscript</b>";
    echo "</td>\n";
    echo "<td><input name='uploadDeInstall' type='file' size='50' maxlength='100000'></td>\n";
    } else {
    echo "<b>".$Setting."</b>";
    echo "</td>\n";
    echo "<td><input name='".$Setting."' type='text' size='50' value='".$value."'></td>\n";
    }
    echo "</tr>\n";
    }
    $counter++;
    }
    echo "<tr>\n";
    echo "<td>\n";
    echo "<b>Archive Datei (rar/zip/tar.gz usw)</b>";
    echo "</td>\n";
    echo "<td><input name='uploadArchive' type='file' size='50' maxlength='100000'></td>\n";
    echo "</tr>\n";
    ?>
    </table>
    <br/><input class='submitNewPack' type='submit' value='Zur Überprüfung übermitteln'>
    </form>
    </div>


    </body>
    </html>[/php]

  • Beim schreiben der Hilfe für das Add Formular ist mir aufgefallen das man einige Angaben in der momentanen *.cfg's gar nicht brauch, wie zum Beispiel "additional".

    Auch weiß ich grad nicht ob ich bei "Kategorie" ein Auswahlmenü vorgeben soll, oder dies auch einfach weg lasse sodass der Überprüfer das dann eintragen kann :s

    &quot;add.php&quot;

    [/spoiler]

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!