Webdesign in Siegen

Repository Aufbau

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

Re: Repository Aufbau

Beitragvon mAu am 19.04.2008, 09:31

Also FTP bekommt von mir ein ganz klares Nein :) Per HTTP ist das schon die eleganteste Lösung.
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008

Re: Repository Aufbau

Beitragvon Avedo am 01.05.2008, 15:21

Hallo!
Also nun habe ich nochmal eine Frage zu der Sache HTTP oder FTP. Beides sollte ab demnächst ja kein Problem mehr darstellen, da die FTP-Klasse so gut wie fertig ist und die HTTP-Klasse nicht mehr lange auf sich warten lässt, sobald der Fehler in der divideReply()-Methode behoben ist. Allerdings muss ich dir mAu etwas widersprechen. Wenn ich mich da nun richtig eingelesen habe kann ich keine Dateien mit HTTP verschicken, sondern nur die Ausgabe dieser Dateien empfangen. Das möchte ich zwar auch, aber eben nicht nur. Auf der einen Seite soll die Repository-Klasse ja die Ausgabe einer bestimmten Datei auf dem Repository-Server auslesen und und die empfangenen Daten verarbeiten und eine Ausgabe dieser ermöglichen. Zum anderen soll sie aber auch komplette Dateien bzw. Packages zwischen den Servern übertragen. Das geht wiederum nicht mit HTTP, sondern nur mit FTP. Leider weiß ich nicht, wie ich es verhindern kann, dass der empfangende Client gefragt wird, ob er diese Datei auf seinem Server speichern möchte oder nicht. Daher meine Frage, wie ich es am cleversten anstellen kann, dass die Datei (z.B. package.tar) vom Repository- auf den Client-Server übertragen werden kann ohne dass eine Anfrage an den User gestellt wird. Wie müsste der dazugehörige Aufruf der retr()-Mathode aussehen. (retr() liefert ein Download-Handle zurück) Oder kann ich das vielleicht sogar auf die einfachere Methode mit rnfr() und rnto() machen? Wäre wie immer für eure Hilfe sehr Dankbar.
MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 605
Registriert: 09.12.2007
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Avedo am 26.05.2008, 13:30

Hallo!
Da sich ja mehrere für dieses Thema interessiert haben, gibt es jetzt mal kurz den Zwischenstand.

Dank der HTTP Klasse ist es mir nun möglich eine Datei in der die Repository-Server stehen auszulesen und auszugeben. Der Aufbau dieser Datei ist immer gleich und sieht daher ungefähr so aus:

repos.txt
Code: Alles auswählen
repos http://www.avedo.net/repository/public public
repos http://www.avedo.net/repository/public2 public
repos http://www.avedo.net/repository/forum private hutab

Wie man sieht fängt jede Zeile mit dem Stichwort repos an, dass darauf hinweißt, dass nun die Zugangsdaten für einen Repository-Server folgen. Danach steht die URL zu diesem Server. Die Stichwörter public und private geben aufschluss darüber ob ein Repository geschützt ist oder nicht. Ist es geschützt folgt ein Passwort. Warum gibt es keine Angabe zu dem Usernamen? Der wird doch auch gebraucht! Ja das stimmt, aber der Username soll immer der gleiche, nämlich repos sein. All diese Daten werden nun in einem Array gespeichert. Den Pfad zu dieser Datei, die die Informationen über die Repository-Server enthält, übergibt man bei der Instanzierung der Klasse. Der Constructor ließt diese Datei dann aus und speichert die Informationen in das Array.

Die Methode getPackInfo() stellt nun via HTTP eine Verbindung zu den im Array enthaltenen Repository-Servern her und fordert die Datei control.txt an. Dort sind die Informationen zu den verschiedenen Paketen enthalten, die auf diesem Server liegen. Diese Informationen werden gespeichert und wiederum in einem Array gespeichert. Zu den Informationen der einzelnen Packages wird die jeweilige URL zu diesem Package angefügt.

Ein Aufruf der Klasse und der soeben beschriebenen Methoden sieht so aus:
Code: Alles auswählen
// create object and declare the file that holds the repository-servers
$repos = new Repository('repos.txt');

// get the array with the information of the repository-servers
$server = $repos->getRepos();

// get the Information of all packages available
$packs = $repos->getPackInfo();

// print out the data
print_r ($server);
print_r ($packs);   


Dieser Aufruf erzeugt im Übrigen diese Ausgabe. Zuerst seht ihr das Array mit den Server-Daten und dann das mit den Package-Informationen. (natürlich alles fiktive Daten)

Ich hoffe ich habe noch bei einigen anderen das Interesse geweckt und bekomme noch einige Anregungen von euch.
MfG, Andy

Repository.php
Code: Alles auswählen
<?php 
error_reporting(E_ALL);

// include HttpConnect class
require_once('HttpConnect.php');

// define server-constants
define ('REPOS', 0);
define ('SERVER', 1);
define ('PERM', 2);
define ('PWD', 3);

/***
* The Repository class allows reading files that hold the repository-servers,
* reading information about different packages and
* downloading the spezific packages

* @package Repository
* @version 1.0
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Andreas Wilhelm
**/ 
class Repository extends HttpConnect
{
   // protected class variables
   protected $repos = array();

   /**
   * Constructor - Is called when the class is instanced
   *
   * @access: public
   * @param Str $path
   * @return NONE
   */
   public function __construct($path = 'repos.csv')
   {   
      // save each line of data to an array-element
      $lines = file($path);
      
      foreach($lines as $line => $server)
      {
         // split up the differnet elements of a line by space
         $server = preg_split("/ /", $server, 100, PREG_SPLIT_NO_EMPTY);
         
         // prepare Data
         $repos = trim($server[REPOS]);
         $host = trim($server[SERVER]);
         $perm = trim($server[PERM]);
         if( isset($server[PWD]) )
         {
            $pwd = trim($server[PWD]);         
         }
         
         // contains this line a repository-server
         if( $repos == 'repos' )
         {   
            if( $perm == 'public' )
            {
               $this->repos[$host] = 'NONE';
            }
            
            else if( $perm == 'private' )
            {
               $this->repos[$host] = $pwd;
            }
            
            else
            {
               throw new Exception("Line $line is not a valid path to repository-server.");
            }               
         }
         
         else
         {
            throw new Exception("Line $line holds no repository-server.");
         }
      }
   }
   
   /**
   * getRepos() - Returns the array of repository-servers
   *
   * @access: public
   * @return Array
   */
   public function getRepos()
   {
      return $this->repos;
   }
   
   /**
   * getPackInfo() - Gets the information about the different packages
   *
   * @access: public
   * @return Array
   */
   public function getPackInfo()
   {
      $host = $this->getRepos();
      
      // array that contains the package-data
      $packages = array();
   
      foreach( $host as $url => $pwd)
      {      
         // file that contains the package-information
         $file = 'control.txt';
         
         // prepare user and password
         if( $pwd == 'NONE' )
         {
            $pwd = '';
            $user = '';
            $ssl = false;
         }   
         
         else
         {
            $user = 'repos';
            $ssl = true;
         }      
         
         // prepare uri
         $host = parse_url($url, PHP_URL_HOST);
         $path = parse_url($url, PHP_URL_PATH);
         
         // send HTTP-Request
         $this->server($host, 80, $ssl);
         $get = $this->get("$path/$file", false, false, $user, $pwd);
         
         // get content of the package-information-file
         $info = $get['CONTENT'];      
                  
         // separate package-information-blocks
         $block = explode("\n\n", $info);
                  
         foreach($block as $key => $packinfo)
         {
            //get single fields
            $fields = explode("\n", $packinfo);
            
            // save information to array
            foreach($fields as $field)
            {
               if( preg_match('/([^:]+):(.+)/m', $field, $match) )
               {
                  $package[$this->getName($match[1])] = trim($match[2]);
               }
            }
         
            $package['Url'] = "$url/$package[Package]";
            
            // save info-data for actual block to $packages
            $packages[] = $package;      
         }
      }
      
      return $packages;
   }
   
   /**
   * getName() - Returns the name of a received htpp-header-field
   *
   * @access: private
   * @param Str $str
   * @return String
   */
   private function getName($str)
   {
       return preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($str)));
   } 
   
   /**
   * getPack() - Downloads a package to your server
   *
   * @access: public
   * @param Str $path
   * @return NONE
   */
   public function getPack($path)
   {
   }
}

try
{
   $repos = new Repository('repos.txt');
   $server = $repos->getRepos();
   $packs = $repos->getPackInfo();
   
   print_r ($server);
   print_r ($packs);   
}

catch(Exception $e)
{
   echo $e->getMessage();
}

?>
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 605
Registriert: 09.12.2007
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Avedo am 28.05.2008, 01:02

Abend!
Ich sitze gerade an der getPack()-Methode und komme irgendwie nicht weiter. Und zwar so mit Hilfe dieser Methode eine Datei vom Repository-Server auf den Client übertragen werden. Das habe ich mir bisher ganz einfach vorgestellt, aber ich hatte in meinem Tatendrang ganz einfach vergessen, dass ich via HTTP nur das File-Handle $_FILE[] an den Zielserver übergeben kann. Nun weiß ich nicht wirklich wie ich mein Problem lösen kann. Meine Überlegung ist jetzt, ob ich auf jedem Repository-Server eine weitere Datei movepack.php anlege, der ich via get() oder post() den Namen des gewünschten Paketes, sowie die Zugangsdaten zum Zielserver übergebe. Dann soll dieses Script das File-Handle an den Client schicken, der dann via move_uploaded_file() die Datei überträgt. meine Frage ist jetzt also, ob das so sinnvoll ist, es vielleicht eine bessere Möglichkeit gibt oder das ganze, so wie ich es beschrieben habe, so oder so nicht funktionieren würde. Bin für jede Hilfe dankbar.
MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 605
Registriert: 09.12.2007
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Basti am 28.05.2008, 13:47

Der Gedankengang klingt auf jeden Fall schon einmal schlüssig und gut. Bisher habe ich mich mit der Dateiübertragung zwischen unterschiedlichen Servern (insbesondere über HTTP) aber so gut wie gar nicht beschäftigt, weshalb mir dort einfach die Erfahrungen fehlen.

Von der Theorie sollte dein Vorhaben soweit ich das verstanden habe aber möglich sein, wie es in der Praxis aussieht ist natürlich etwas anderes. Deshalb würde ich an deiner Stelle einfach einmal testen, ob es über diesen Weg funktioniert.
Eine andere Alternative für HTTP fällt mir derzeit auch nicht ein.
Benutzeravatar
Basti
Moderator
 
Beiträge: 1922
Registriert: 15.06.2006
Wohnort: Rheinbreitbach

Re: Repository Aufbau

Beitragvon Avedo am 14.08.2008, 15:17

Guten Morgen!
Ich denke es ist mal wieder an der Zeit an dieser Stelle weiter zu arbeiten. Die Idee war ja Module oder AddOns von einem zentralen Repository-Server installieren zu können, allerdings hab ich festgestellt, dass dies ein relativ scheres unterfangen ist. Daher habe ich mich nun entschieden diese Module oder AddOns als Pakete zum Download anzubieten, damit der User diese downloaden und dann über ein Adminpanel hochladen und installieren kann.

Das Problem ist nun, dass ich nicht weiß, wie ich soetwas am besten strukturiere. An dieser Stelle hoffe ich auf eure Hilfe. Zu klären wären für mich die folgenden Fragen:
  1. Wie sollten die Packages aufgebaut sein?
  2. Wie könnte eine Installations-Datei arbeiten?
  3. Wie sollte die Deinstallation organisiert werden?
  4. Wie könnte die Fehlerbehandlung in der Installations- bzw. Deinstallations-Datei aussehen?
  5. Wie könnte eine passende Ordnerstruktur aussehen?
  6. Wie kann ich dafür sorgen, dass nur eine Version eines Packages installiert ist?
Zu einigen dieser Fragen habe ich mir bereits Gedanken gemacht.

So denke ich weiterhin, dass ich Tarballs als Packages verwenden sollte. Diese können nach dem Upload in einem Temporären Ordner abgelegt und entpackt werden. An der entsprechenden Methode habe ich ja bereits gearbeitet. Nach dem entpacken könnte eine weitere Methode die in jedem Package enthaltene install.php aufrufen und die Ausgabe des Scrippts puffern. Die install.php verschiebt alle wichtigen Dateien in einem zum Package gleichnamigen Ordner in den Ordner Module. Funktioniert dies ist alles gut. Tritt allerdings bei der Installation ein Fehler auf, sollen sowohl die temporären Dateien, als auch der neue Ordner und seine Inhalte im Ordner Module gelöscht werden. Daraufhin kann dann eine simple Anzeige "Installation von {$package} fehlgeschlagen." erscheinen.

Was haltet ihr von diesem Ansatz und habt ihr vielleicht Antworten auf meine Fragen? Ich bin wie immer für alles offen.
MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 605
Registriert: 09.12.2007
Wohnort: Göttingen

Vorherige

Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste