Secundo PM - Projektverwaltung für GitHub



  • SecundoPM - Einfaches installieren und entfernen von GitHub Paketen (auf Linux)

    Disclaimer: Ich übernehme keine Haftung für Beschädigung von Daten
    oder deren Verlust. Außerdem distanziere ich mich von allen Projekten,
    die SecundoPM als Paketmanager benutzen und nicht in den GitHub-Accounts
    von https://github.com/triploit/ oder https://github.com/survari/
    enthalten sind. Jeder, der diesen Paketmanager benutzt, tut dies mit
    eigener Verantwortung.

    Ihr habt ein supertolles Tool entwickelt, das Usern helfen soll, aber keine Ahnung wie ihr es ihnen auf Linux bereit stellt?
    Hier ist die Lösung! Um aufwendiges Kompilieren und verschieben von Dateien nicht dem User zu überlassen, habe ich einen einfachen Paketmanager gebaut.

    Lasst uns ihn folgendermaßen auf Linux installieren:

    git clone https://github.com/triploit/secundo-pm
    cd secundo-pm
    make
    ./secpm install triploit:secundo-pm
    cd ..
    rm -rf secundo-pm
    

    Offiziell gibt es keinen Windows-Support. Da Windows sich kompliziert im Umgang mit der Shell gestaltet, habe ich auch keinen Windows-Support geplant. Dies bedeutet jedoch nicht, dass ich so ein Feature nicht dulden würde. Ich freue mich immer, wenn jemand mitentwickelt.

    Wie man ein Paket erstellt

    Und hier wird man auch gleich sehen, warum der Disclaimer oben
    existiert:

    Möchte man nun sein GitHub-Projekt in ein SecundoPM Paket umwandeln, muss ein Ordner mit dem Namen "pkg" im Wurzelverzeichnis des Projektes angelegt werden. In diesem Ordner wird nun eine Datei angelegt, mit dem Namen "ins.sc". Das muss dann so aussehen:

    meinprojekt
    ├── main.cpp
    ├── main.hpp
    └── pkg
        └── ins.sc
    

    In diese Datei kommen nun das Installationsskript rein. Schreiben wir mal Folgendes:

    user nutzername
    name projektname
    ver 0.0.0.1
    dep nutzername:dependencyname 0.0.0.1
    
    func install {
        echo "Kompiliere  ..."
        g++ main.cpp -o programm
        echo "Installiere ..."
        sudo mv programm /usr/bin/programm
        echo "Fertig !"
    }
    
    func update {
        &install
    }
    

    So, was wir hier sehen ist also eine einfache Form des Skriptes. Wir haben verschiedene Funktionen definiert. Funktionen in SC (SeCundo script) können keine Argumente oder Parameter entgegennehmen. Weiterhin ist es möglich Funktionen aufzurufen, indem man in einer leeren Zeile &funktionsname schreibt.

    Funktionen, die als Standart erwartet werden, sind:

    • install - Zum Installieren von Paketen
    • update - Zum Aktualisieren von Paketen
    • remove - Zum Löschen von Paketen

    Wichtig ist außerdem, dass ihr die Befehle user, name, ver und dep beachtet.

    Befehl Aufbau Bedeutung
    user user [nutzer] Der Nutzer des GitHub-Paketes wird festgelegt. Liegt die Repository in einer Organisation, muss dort der Organisationsname stehen, wie im GitHub-Link
    name name [projektname] Der Name der Repository muss hier stehen. Genau wie im GitHub-Link. (bspw. wäre es bei SecundoPM secundo-pm, da die Repository im Link https://github.com/triploit/secundo-pm eben secundo-pm heißt.)
    ver ver [Major].[Minor].[Revision].[Build] Hier muss die Projekt-Version stehen. Die Version ist immer eine Kette bestehend aus vier Zahlen, die mit Punkten verbunden werden. Es dürfen keine Buchstaben o.ä. verwendet werden.
    dep dep [nutzer]:[projekt] Ma.Mi.R.B Macht das Projekt von dem SecPM Paket https://github.com/nutzer/projekt mit der Version Ma.Mi.R.B Abhängig.

    Wenn wir uns das Skript nun weiter anschauen, fällt folgendes auf: Shellbefehle. In den Funktionen stehen Shellbefehle. Und daher auch der Disclaimer. SecPM fragt zwar vor dem installieren, ob man die Skript-Datei vorher sehen will, jedoch installiert man immer auf eigene Gefahr.

    Wichtig ist hier noch zu sagen: Die Funktionen sind kein Shellscript. Sie werden zeilenweise unabhängig voneinander ausgeführt.

    Wenn ihr Variablen und ein eigenes Shellscript nutzen wollt, geht das folgendermaßen:

    func install {
        <[
            echo "Dies ist ein vollwertiges Shellscript!";
            i="Hallo Welt!";
            echo $i;
        ]>
    }
    

    Alles was in <[ ... ]> steht, wird als eine komplette Datei ausgeführt.
    Verkürzt geht das natürlich auch so:

    func install {<[
        echo "Dies ist ein vollwertiges Shellscript!";
        i="Hallo Welt!";
        echo $i;
    ]>}
    

    Pakete installieren, entfernen, ...

    Installation

    sudo secpm install triploit:aml
    

    Das Paket https://gitub.com/triploit/aml wird installiert.

    sudo secpm ins triploit:aml ins triploit:tsmi
    

    Abkürzung für "install" ist "ins". Die Pakete https://github.com/triploit/aml und https://github.com/triploit/tsmi werden installiert.

    sudo secpm install mustermax:projekt
    

    Das Paket https://github.com/mustermax/projekt wird installliert.

    Alternativ zu install gibt es auch den Parameter -I.

    Entfernen

    sudo secpm remove triploit:aml
    

    Das Paket https://gitub.com/triploit/aml wird entfernt.

    sudo secpm rem triploit:aml rem triploit:tsmi
    

    Abkürzung für "remove" ist "rem". Die Pakete
    https://github.com/triploit/aml und https://github.com/triploit/tsmi
    werden entfernt.

    sudo secpm rem mustermax:projekt
    

    Das Paket https://github.com/mustermax/projekt wird entfernt.

    Alternativ zu remove gibt es auch den Parameter -S.

    Aktualisieren

    Um Pakete zu aktualisieren:

    sudo secpm update triploit:aml up triploit:tsmi
    

    Alternativ zu update gibt es auch den Parameter -U.
    Oder, um alle Pakete zu aktualisieren (funktioniert nur bei Paketen, die mit SecPM 1.4/1.4+ installiert wurden):

    sudo secpm update all
    

    Alternativ zu update all gibt es auch den Parameter -Ua.

    Installieren von lokalen Paketen

    sudo secpm local /pfad/zum/projekt/
    

    Der Ordner /pfad/zum/projekt/ wird installiert. Das Skript
    /pfad/zum/projekt/pkg/ins.sc wird ausgeführt.

    Leuten vertrauen

    Da jedes Paket eine potentielle Gefahr ist, fragt SecPM ob man das Installer-Script vor dem Installieren
    ansehen möchte und fragt danach noch einmal, ob man sicher ist, dass man das Paket installieren möchte.
    Es gibt nun die Möglichkeit, für bestimmte Organisationen oder GitHub-Accounts, denen man wirklich
    vertrauen sollte, diese Nachrichten auszuschalten:

    sudo secpm trust user
    

    Ich, zum Beispiel, vertraue mir selbst 😃

    sudo secpm trust survari trust triploit
    

    Um einen Nutzer von der Liste vertrauenswürdiger Personen zu entfernen, gibt es:

    sudo secpm untrust user
    

    Alle Leute anzeigen, denen man vertraut:

    sudo secpm showtrust
    

    Leuten nicht mehr vertrauen:

    sudo secpm untrust user
    

    Keine Ausgaben!

    Um zu verhindern, dass die Installtionsskripte ausgaben tätigen, kann man das Argument quiet als erstes schreiben:

    sudo secpm quiet update all
    

    Alle Pakete werden aktualisiert, ohne Ausgaben von den Installationsskripten. Manchmal funktioniert das aber leider nicht ganz, wie gewollt.

    Und noch vieles mehr!

    Es gibt noch viele weitere Funktionen, die man benutzen kann. Dazu einfach:

    sudo secpm help
    

    Die Sprache kann man zum Beispiel auf Deutsch stellen, indem man die Konfig bearbeitet. Nach der Installation dazu einfach:

    sudo secpm config
    

    Dann öffnet vi die Konfigurationsdatei (liegt in: /usr/share/secundo/conf/config.yml).
    Dort könnt ihr folgende Optionen abändern, um es auf deutsch zu stellen:

    langcfg: /usr/share/secundo/lang/en.yml
    

    müsst ihr auf

    langcfg: /usr/share/secundo/lang/de.yml
    

    abändern. Weitere Sprachen gibt es unter /usr/share/secundo/lang. Ihr könnt auch Weitere übersetzen. Kopiert euch einfach dazu eine der Sprachdateien heraus, übersetzt die Sätze in die gewünschte Sprache und ändert den Dateinamen in die Sprachabkürzung der von euch gewählten Sprache. Für Deutsch ist es zum Beispiel de.yml, für Englisch en.yml, usw.

    Ihr könnt auch den Editor ändern, mit dem ihr die Konfigurationsdatei per sudo secpm config öffnet.
    Einfach bei

    editor: /usr/bin/vi
    

    den Pfad zum Editor eintragen. Bei mir ist es zum Beispiel:

    editor: /usr/bin/nano
    

    GitHub

    Das Projekt findet ihr hier: https://github.com/triploit/secundo-pm



  • Wozu? Was sind die Unterschiede zu anderen Paketmanagern?
    Hab ganz grob über den Code drübergeschaut, toll find ich den nicht. Zumindest würde ich von einem "professionellen" System mehr erwarten.



  • @mechanics
    Naja "professionell" ist er schonmal gar nicht 😃 .
    Der Unterschied zu anderen Paketmanagern ist, dass ich mir ehrlich gesagt nie groß diese Frage gestellt habe. Eigentlich sollte SecPM nur ein bisschen zum Testen sein. Daher sieht auch der Code dementsprechend zusammengeschustert aus (hast aber recht, muss ich wirklich mal aufräumen).

    Spontan fallen mir nur Folgendes ein:

    • sprachunabhängig (egal ob C++, Python, Java, NodeJS, o.ä.)
    • besitzt im Gegensatz zu vielen anderen Paketmanagern keinen eigenen Server, nutzt daher gleich GitHub
    • einfach in der Verwaltung und im Erstellen eigener Pakete (PKGBUILD's und hochladen in die AUR find ich aus der Sicht komplizierter)
    • mit Liebe gemacht ...?

    Ehrlich gesagt, fällt mir nicht viel ein. Aber genau aus dem Grund hab ich den Thread ja erstellt, um mal ein bisschen kritisiert und hinterfragt zu werden 🙂



  • @survari sagte in Secundo PM - Projektverwaltung für GitHub:
    Aber genau aus dem Grund hab ich den Thread ja erstellt, um mal ein bisschen kritisiert und hinterfragt zu werden 🙂

    Ich finde es schwierig, etwas zu hintefragen, wenn man sich damit nicht intensiv befasst hat 😉 Es ist dein Projekt, du hast dich viel intensiver damit beschäftigt als andere, also müsstest du zuerst mal irgendwelche Anhaltspunkte für eine Diskussion liefern.
    Es gibt schon etablierte Systeme, und es gibt relativ neue wie flatpak und snap. Die Probleme scheinen nicht komplett gelöst zu sein, sonst würde es ja keinen Bedarf an sowas geben. Mir selber ist das relativ egal, ich hatte noch nie ein Problem, einen Paketmanager zu benutzen. Musste aber auch noch nie selber ein Paket erstellen, das ich vertreiben wollte, das scheint eher der Knackpunkt zu sein.
    Also, wenn du jetzt kommst, und wieder mal was neues präsentierst, denk ich mir erstmal natürlich, schon wieder was, was keiner braucht. Solltest also schon etwas fundierter begründen, warum dein Projekt cooler ist als die anderen 😉



  • p.s. Ich weiß nicht, ob man deinen Code "aufräumen" sollte, das betrifft eher die Gesamtstruktur, dazu kann ich nichts sagen. Aber was mir beim Drüberschauen negativ aufgefallen ist, ist das oft fehlende const (und Parameterübergabe per Referenz) und string Initialisierungen mit = "". Und ich hatte eine Hilfsfunktion zum Splitten gesehen, das schaut sehr ineffizient aus. Mag egal sein, aber für unnötig ineffizienten Code werd ich mich nie begeistern können 😉



  • @mechanics

    Mag egal sein, aber für unnötig ineffizienten Code werd ich mich nie begeistern können

    Oh gott, dann würdest du wohl meine ganzen anderen Projekte auch hassen 😃
    Naja, immerhin hab ich erstmal ein paar Eindrücke bekommen.

    Mir selber ist das relativ egal, ich hatte noch nie ein Problem, einen Paketmanager zu benutzen. Musste aber auch noch nie selber ein Paket erstellen, das ich vertreiben wollte, das scheint eher der Knackpunkt zu sein.

    Genau das ist leider der Knackpunkt. Es ist so unglaublich schade... Es gibt so viele Paketmanager, aber keiner besinnt sich auf Einfachheit beim Erstellen von Paketen. Die Dokumentationen sind meist sehr komplex formuliert, mir wenigen Beispielen. Die Paketmanager lassen die Installationsskripte auf komplizierteste Weisen ausführen. Das ist Schade und genau das versucht SecPM auch anders zu machen. Ein Paket in SecPM zu erstellen, bedeutet ein einziges Shellscript hinzuzufügen und dem Nutzer das Clonen und Installieren per Hand abzunehmen. Viele andere setzen außerdem auf eigene Repository-Server, das ist unnötig. (Fast) Jeder Entwickler, der OpenSource Projekte verbreiten will, nutzt GitHub. Warum sollte ein Entwickler sein Projekt denn bitte auf einen extra Server hochladen? Unnötige Arbeit.

    Ich finde es schwierig, etwas zu hintefragen, wenn man sich damit nicht intensiv befasst hat 😉 Es ist dein Projekt, du hast dich viel intensiver damit beschäftigt als andere, also müsstest du zuerst mal irgendwelche Anhaltspunkte für eine Diskussion liefern.

    Das fällt mir schwieriger als du denkst 😃 , aber ein paar hab ich ja grad geschrieben.

    Aber was mir beim Drüberschauen negativ aufgefallen ist, ist das oft fehlende const (und Parameterübergabe per Referenz) und string Initialisierungen mit = "".

    Okay, das mit der Pass-by-Reference wurd mir schon öfter gesagt, das muss ich wirklich ändern. Hast recht.
    Aber was hat es mit der Initialisierung mit = "" aus sich, warum ist es schlecht? (Wie du merkst, C++ programmiere ich zwar, verstehen tue ich von der Sprache aber nichts 😃 )



  • @survari sagte in Secundo PM - Projektverwaltung für GitHub:

    Aber was hat es mit der Initialisierung mit = "" aus sich, warum ist es schlecht?

    Das ist völlig sinnlos und kontraproduktiv. Jede Klasse sollte sowieso unbedingt einen Default Konstruktor haben, der sie sinnvoll auf "leer" initialisiert (wenn sie einen Default Konstruktor hat, gibt natürlich auch Klassen, bei denen das keinen Sinn macht). Aber eine Klasse, die du auf leer initialisierst schaut seltsam aus. Außerdem weiß hoffentlich jeder, was der std::string default Konstruktor macht.
    Und ein string ist auch kein nativer Datentyp in C++, das schaut dann so nach Java/C# aus, wenn du strings initialisierst...



  • @mechanics
    Ja, verstehe. Und beim Lesen dachte ich mir nur so "Ich mach das so, weil ich seit Java Angst vor nicht initialisierten Strings habe" 😃

    Das ist der Nachteil, wenn man mehrere Programmiersprachen programmiert. Oder wie ein Freund von mir sagte: "Es ist nicht einfacher, eine neue Programmiersprache zu lernen, wenn man schon einige kann. Man erstellt bloß falsche Zusammenhänge."