Werbung, Webdesign & IT

Repository Aufbau

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

Repository Aufbau

Beitragvon Avedo am 27.03.2008, 16:16

Morgen!
Ich habe ein kleines Problem. Ich bin gerade dabei eine Klasse, aufbauend auf der FtpConnect Klasse zu schreiben, die bei der Verwaltung bzw. Installation von Repositories helfen soll. Nun bin ich bei zwei Sachen am überlegen, wie ich das umsetzen soll. Zum einen ist da die Frage nach dem Aufbau und Dateityp der Repos-Datei. Soll das eine .csv-Datei sein oder lieber etwas anderes. Wie soll diese Datei aufgebaut sein? Was soll kann darf drin stehen. Zu beachten ist auch, das es freie und geschützte Repositories geben soll.

Auf dem Repository Server liegt nebst den Packages noch eine Datei control.csv, die die Informationen zu den einzelnen Packages enthält. Im Folgenden habe ich eine Beispiel-Datei gebastelt und würde nun gerne von euch wissen, ob die dort enthaltenen Informationen ausreichend sind.

control.csv
Package: nested-sets
Version: 1.0.1
Depends: navigation-tool, ranking-tool, article-tool
Suggests: button-designer
Installed-Size: 5
Author: Andreas Wilhelm <andreas@mail.de>
Description: package that is base for navigation-management


Das kursiv geschriebene gibt es für jedes Package. Die Informationen werden durch einen Absatz von einander sichtbar getrennt.

Die Packages, die geladen werden können, sind *.tar-Dateien, die automatisch entpackt werden. Sie enthalten eine install.php und die benötigten Dateien.

Wäre euch sehr dankbar für Ideen und Anregungen sowie Hilfe bei der Erstellung eines passenden Regex-Codes zum Auslesen der Repositoy-Datei.
MfG, Andy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Guillermo am 27.03.2008, 22:13

Hi, ich habe leider keine Antwort auf deine Frage, und deshalb frage ich dich was Repositories sind, damit ich das auch weiß, denn vielleicht lerne ich noch was dabei ;)
Gebildet ist der, der weiß, wo er findet, was er nicht weiß.
Benutzeravatar
Guillermo
Mitglied
 
Beiträge: 361
Registriert: 01.10.2007, 18:18
Wohnort: Auerbach i.d.Opf

Re: Repository Aufbau

Beitragvon Avedo am 27.03.2008, 22:48

Also Repositories sind grob gesagt Datenlager. Um genau zu sein handelt es sich meistens um einen Server, auf den verschiedene Leute zugreifen können, um Programmpakete (Packages) herunter zu laden und zu installieren. Linux arbeitet mit einem solchen System. Das hat den Vorteil, dass du, wenn du einen Linux-Rechner hast nur über die Konsole das Repository aufrufen musst und es wird dir eine Liste der zur Verfügung stehenden Packages mit einer kleinen Beschreibung gezeigt. Nun kannst du dieses oder jenes Package ganz einfach über einen weiteren Befehl herunterladen und auf deinem Rechner installieren.
Dieses System hat mehrere Vorteile. Die Software ist immer aktuell, da man oftmals auch alle Software-Pakete mit einem Befehl in der Konsole auf einmal auf ihre Aktualität überprüfen kann. Zudem hat man keine riesigen Installations-Dateien, die den Speicherplatz blockieren (besonders im Web interessant). Wie du siehst ist das eine sehr interessante Sache, die aber wohl durchdacht sein muss, da ja Andere Personen Daten von deinem Server abfragen und downloaden können. Deshalb brauche ich eure Hilfe. Ich muss also einmal eine Datei, wie oben gezeigt von diesem Repository-Server auslesen und per RegEx verständlich gestalten und andererseits muss ich eine Datei oder einen Ordner von einem Server herunterladen und entpacken (TarHandler Klasse habe ich schon geschrieben).
MfG, Andy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Guillermo am 27.03.2008, 23:46

Uff ;) hört sich alles ganz gut an, naja jetzt bin ich ein bisschen schlauer, um die Praxis kümmere ich mich wananders ;)
Auf jeden Fall danke für die ausführliche Information
Gebildet ist der, der weiß, wo er findet, was er nicht weiß.
Benutzeravatar
Guillermo
Mitglied
 
Beiträge: 361
Registriert: 01.10.2007, 18:18
Wohnort: Auerbach i.d.Opf

Re: Repository Aufbau

Beitragvon Basti am 28.03.2008, 00:33

Habe selbst auch noch nicht damit gearbeitet, aber insbesondere für mein CMS wäre es schon interessant da ich teils ähnliche Überlegungen hatte, aber keine Idee wie ich das einfach auf PHP Basis verwirklichen sollte.

Das mit den RegExp sollten wir hinbekommen, ich selbst fühle mich dort inzwischen relativ fit und einige andere hier haben auch schon Erfahrungen damit gesammelt. Für die genauen Ausdrücke müssten wir dann aber wissen, was du alles auslesen möchtest.
Gruß,
Basti


Die Testversion des neuen sf-d FlexiPanels ist da! Jetzt testen!
Benutzeravatar
Basti
Moderator
 
Beiträge: 1654
Registriert: 15.06.2006, 17:33
Wohnort: Rheinbreitbach

Re: Repository Aufbau

Beitragvon Avedo am 30.03.2008, 02:49

Guten Morgen!
Also ich mache mir jetzt mal einfach so ein paar Gedanken, weil ich gerade etwas Zeit habe. Wenn jemand eine Idee hat oder etwas ergänzen möchte, würde ich ihn bitten dies zu tun.

Also was soll die Klasse alles machen? Sie soll:
  • die *.csv-Datei auslesen, in der die Repository-Server stehen
  • von diesen Servern die control.csv mit den Package-Informationen auslesen
  • die Package-Informationen zerlegen und als Array zurückgeben
  • einen Download auf den eigenen Server von ungeschützten Packages ermöglichen
  • einen Download auf den eigenen Server von geschützten Packages ermöglichen
  • einen Upload von neuen Packages ermöglichen
  • in die control.csv die neuen Package-Informationen eintragen
  • einen Repository-Server in die Liste hinzufügen

Nun überlege ich gerade, ob man diese Aufgaben in zwei Klassen aufteilen sollte oder nicht. Also eine Klasse, die die Methoden enthält, die für den User wichtig sind und eine Klasse, die die Methoden enthält, die für den Programmierer neuer Pakete wichtig sind.

Des weiteren könnte es noch eine übergeordnete Klasse ExtendedRepository geben, die auf meine TarHandler Klasse aufbaut. So könnte sie das heruntergeladene Package (im *.tar-Format) in einen gleichnamigen Ordner entpacken. Was dann mit den entpackten Dateien in diesem Ordner passiert ist eine andere Sache, über die ich mir jetzt keine Sorgen machen brauche.

Achso wichtig ist natürlich noch, dass der Download möglichst ohne eine FTP-Verbindung von Statten geht, da ich natürlich nicht das Passwort von den Repository-Servern preisgeben möchte. Da kommt dann natürlich die Frage auf, wie man das mit den geschützten Repository-Servern macht. Zudem darf natürlich auch keine Anfrage kommen, wohin das ganze gespeichert werden soll. Das ganze soll zu einem relativen Pfad zum Verzeichnis des ausgeführten Scripts heruntergeladen werden.

Ich hoffe, dass zu diesem Überlegungen noch jemand Ideen, Anregungen oder Hilfestellungen auf Lager hat. Wäre euch sehr dankbar.

MfG, Andy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Avedo am 15.04.2008, 17:31

Hallo!
Habe heute, wie ich glaube, erfolgreich Politik geschrieben und so nach Deutsch schon die zweite Arbeit erfolgreich hinter mich gebracht. Da ich nun doch etwas Abstand brauchte, habe ich mich mal eine viertel Stunde an die Repository-Klasse gesetzt. Nur vorweg. Die Datei, die die URLs zu den Repository-Servern enthält heißt nun repos.csv. Aufgebaut wie folgt:

Öffentlich zugängliche Packages
Code: Alles auswählen
repos http://www.host.de/path/to/repos/dir/ public


Kostenpflichtige Packages
Code: Alles auswählen
repos http://www.host.de/path/to/repos/dir/ privat 234f


Wie ihr seht steht am Anfang jeder Eintagrung repos gefolgt von einer url. Das nachfolgende public oder privat bestimmt, ob ein Repository-Server gesichert ist oder nicht. Wenn privat steht, folgt ein vierstelliges Passwort.

Die Datei control.csv, die die Package Informationen enthält sieht aus, wie oben beschrieben. Die einzelnen Info-Blöcke sind durch Leerzeilen getrennt. Die Klasse findet ihr im momentanen Zustand angehängt. Ist glaube ich noch sehr verbesserungswürdig. Vorschläge und Anregungen sind gerne gesehen. Besondere Hilfe bedürfte ich auch noch bei der getPackInfo()-Methode.

Repository.php
Code: Alles auswählen
<pre>

<?php 
error_reporting(E_ALL);
   
// define server-constants
define ('REPOS', 0);
define ('SERVER', 1);
define ('PERM', 2);
define ('PWD', 3);
   
// define constants for control.csv
define ('PACK', 0);
define ('VERSION', 1);
define ('DEPENDS', 2);
define ('SUGGESTS', 3);
define ('SIZE', 4);
define ('AUTHOR', 5);
define ('DESCRIPTION', 6);

/***
* 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
{
   // protected class variables
   protected $repos = array();
   protected $packages = 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 $server)
      {
         // split up the differnet elements of a line by delimeter " "
         $server = preg_split("/ /", $server, 100, PREG_SPLIT_NO_EMPTY);
         
         print_r($server);
         
         // is it a file that contains repository-servers?
         if( $server[REPOS] == 'repos' )
         {   
            if( $server[PERM] == 'public' )
            {
               $this->repos[$server[SERVER]] = 'NONE';
            }
            
            else if( $server[PERM] == 'privat' )
            {
               $this->repos[$server[SERVER]] = $server[PWD];
            }
            
            else
            {
               throw new Exception("$path is not a valid path to repository-server.");
            }               
         }
         
         else
         {
            throw new Exception("$path holds no repository-servers.");
         }
      }
   }
   
   /**
   * getRepos() - Returns the array of repository-servers and passwords
   *
   * @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()
   {
      // get repository-servers
      $host = $this->getRepos();
      
      foreach( $host as $server => $pwd)
      {      
         // path to the file that contains the package-information
         $path = 'control.csv';
         
         // save each line of data to an array-element
         $lines = file($server.$path);
         
         // split up the control.csv into the different information
         $block = split("\n\n", $lines);
         
         // save information to an array with the last element as url to the package
         foreach($block as $pack)
         {
            // extract each line of the information-block
            $line = split("\n", $pack);
            
            // delete description at the beginning of each line
            preg_replace ( '/^package: /', ' ', $line[PACK]);
            preg_replace ( '/^version: /', ' ', $line[VERSION]);
            preg_replace ( '/^depends: /', ' ', $line[DEPENDS]);
            preg_replace ( '/^suggests: /', ' ', $line[SUGGESTS]);
            preg_replace ( '/^size: /', ' ', $line[SIZE]);
            preg_replace ( '/^author: /', ' ', $line[AUTHOR]);
            preg_replace ( '/^desciption: /', ' ', $line[DESCRIPTION]);
         
            // save information to array
            $this->packages[]["package"] = $line[PACK];
            $this->packages[]["version"] = $line[VERSION];
            $this->packages[]["depends"] = $line[DEPENDS];
            $this->packages[]["suggests"] = $line[SUGGESTS];
            $this->packages[]["size"] = $line[SIZE];
            $this->packages[]["author"] = $line[AUTHOR];
            $this->packages[]["desciption"] = $line[DESCRIPTION];
            $this->packages[]["url"] = $server.$line[PACK];
         }
      }
      
      return $this->packages;
   }
   
   /**
   * 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();
}

?>

</pre>

Die Methode getPack() wird wahrscheinlich auf cURL aufbauen. Nichts genaues weiß man aber noch nicht. :lol:
MfG, Andy
Zuletzt geändert von Avedo am 18.04.2008, 09:14, insgesamt 2-mal geändert.
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Avedo am 17.04.2008, 23:57

Kann mir denn keiner helfen?
Da müssen einige Denkfehler drin sein. Wenn ich das Script ausprobiere, sagt er mir zum Beispiel, dass die Datei http://www.avedo.net/repository/repos.txt nicht existiert. Das tut sie aber. Woran liegt das? Wäre einfach nett, wenn jemand mal drüber schauen könnte und so die schlimmsten Fehler aufdecken würde. Bin ein bisschen am verzweifeln.
MfG, Andy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon mAu am 18.04.2008, 08:44

PHP.net: file_exists()
Hinweis: Diese Funktion kann nicht mit entfernten Dateien arbeiten, da der Zugriff auf die Datei, die bearbeitet werden soll, über das Dateisystem des Servers möglich sein muss.
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008, 10:17

Re: Repository Aufbau

Beitragvon Avedo am 18.04.2008, 09:25

Morgen!
Danke das hat mich schon ein bisschen weitergebracht. Hab auch so noch einige teilweise wirklich harte Fehler beheben können. Man sollte halt nicht nach einer 6stdündigen Klausur noch programmieren.

Hast du eine Ahnung, wie ich folgende Meldung wegbekomme?
Undefined offset: 1 in /home/www/web193/html/repository/Repository.php on line 126

Das gleiche Problem hatte ich auch schon bei der FTP-Klasse.
MfG, ANdy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Basti am 18.04.2008, 12:56

Werde mir das nacher auch mal ansehen, wobei ich noch nicht sagen kann, ob ich dir helfen kann ;)

Ich habe bisher nämlich noch nicht viel OOP mit Klassen in PHP programmiert wegen PHP 4 Kompatibilität. Da der Support da aber bald sowieso eingestellt wird bin ich gerade dabei auf PHP 5 umzustellen und mal richtig da reinzusteigen.
Insofern ist das gar nicht mal schlecht für mich um etwas dazuzulernen.

Also falls ich was finde melde ich mich einfach nochmal hier.

// Update:
Habe mir besagte Stelle (Zeile 120 ff.) einmal angesehen. Also der Fehler mit dem Offset rührt daher, dass es die verwendeten Elemente des Arrays einfach nicht gibt.
Eine Überprüfung von $block, $pack und $line zeigt auch, dass diese Variablen bzw. Arrays leer sind.
So, du liest ja bei $lines den Inhalt der "control.csv" aus, das funktioniert ja auch problemlos. Allerdings liefert dir diese Funktion bereits einen Array, für jede Zeile ein neues Element. Was ich jetzt nicht nachvollziehen kann ist, warum du zweimal mit split()-Anweisungen etwas zerlegen möchtest, da ja in dem Array nirgends mehr Zeilenumbrüche (also "\n") enthalten sind. Deshalb gibt es auch nur leere Arrays.
Vielleicht hat sich an deiner "control.csv" ja inzwischen etwas geändert, aber mit deiner geposteten Version funktioniert das so jedenfalls nicht. Ich fände es außerdem praktischer, wenn du die einzelnen Werte aus der Datei mit Regulären Ausdrücken ausliest (über preg_match), mir erscheint das Ersetzen der vorangestellten Informationen ("package", "version", ...) unnötig kompliziert.

Vielleicht hilft dir das ja schonmal ein wenig weiter.
Gruß,
Basti


Die Testversion des neuen sf-d FlexiPanels ist da! Jetzt testen!
Benutzeravatar
Basti
Moderator
 
Beiträge: 1654
Registriert: 15.06.2006, 17:33
Wohnort: Rheinbreitbach

Re: Repository Aufbau

Beitragvon Avedo am 18.04.2008, 17:22

Hallo!
Erstmal vielen Dank für deine Mühen. werde mir das auch nochmal alles durch den Kopf gehen lassen und deinen Hinweis zu preg_match() dabei berücksichtigen. Leider ist ein kleines Problem aufgetreten. Mein Host hat allow_url_fopen auf off stehen und möchte das auch nicht ändern. Das ist wohl bei vielen Anbietern so und deshalb sollte man das ganze wohl besser gleich nicht mit den file()-Funktionen machen. Mit curl soll man so etwas auch machen können. Den Download der Packages wollte ich ja so oder so damit machen. Allerdings habe ich mich noch nie mit curl beschäfftigt. Kennt jemand vielleicht ein Tutorial und hat vielleicht sogar noch den Codeschnipsel mit einigen Erläuterungen parat, mit dem ich eine Datei auslesen kann? Ich weiß, dass man dazu auch etwas im Manual findet, aber da steige ich noch nicht so durch. Ein Tutorial wäre mir lieber. Danke nochmal für die Hilfe.
MfG, Andy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon mAu am 18.04.2008, 17:42

Also ich würde nicht auf cUrl setzen, da das auch bei einigen Hosts deaktiviert ist. Lieber die HTTP-Klasse von Dennis Wronka auf tutorials.de nutzen (gibt's auch hier: http://php-classes.sourceforge.net/).
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008, 10:17

Re: Repository Aufbau

Beitragvon Avedo am 18.04.2008, 23:40

Abend!
Welche Möglichkeit habe ich dann eine Datei von einem Server auf den anderen zu laden, ohne eine Anfrage an den User zu haben? Müsste auch irgendwie mit FTP lösbar sein oder? Hat jemand eine Idee? Schau mir mal die HTTP-Klasse an. Hilft mir bestimmt auch etwas auf die Sprünge.
MfG, Andy
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 382
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Repository Aufbau

Beitragvon Basti am 19.04.2008, 00:04

Wie sieht es denn mit den PHP FTP-Funktionen aus? Oder lassen die sich je nach Sicherheitseinstellung auch nur lokal ausführen?

Weil ansonsten könntest du ja einen FTP Benutzer für der Repository Verzeichnis erstellen und dann alles per FTP abrufen. Bin mir da aber jetzt auch nicht so sicher weil ich mit den Funktionen schon länger nicht mehr gearbeitet habe.
Gruß,
Basti


Die Testversion des neuen sf-d FlexiPanels ist da! Jetzt testen!
Benutzeravatar
Basti
Moderator
 
Beiträge: 1654
Registriert: 15.06.2006, 17:33
Wohnort: Rheinbreitbach

Nächste

Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: Keine Mitglieder und 1 Gast