Wenn ich mehr Zeit hätte wäre ich übrigens an der siginfo-ng 0.2 entwickelung interressiert. Vielleicht lässt sich sogar ein Windows NT-Basierenden Port zu realisieren? (obwohl ich als Programmiersprachen-Noob davon ausgehe das man siginfo-ng zu 80% umschreiben dürfte.) Wollte jetzt zum Winter endlich mal eine Programmiersprache der Art angreifen.
Präsentiere: siginfo-ng 0.1
-
-
Ich veröffentliche den Code, wenn da nicht so viele dumme Fehler drin sind...
Was ich gut finden würde, wenn gandro mir verraten würde, wie das mit den Makefile krams ist, oder sonstige Implentierungen in siginfo-ng, damit ich mein Plug-In so implrntieren kann, wie ich mir das vorstelle.Wenn mir jemand hilft, habe ich schon eine Idee für ein zweites Plug-In, welches den von vnstat ermitteltdn Traffic ausgibt.
-
Fehler sind immer dumm, oder gibts gute/schlaue Fehler ;D?
Du musst öfters mal in gits von wichtigen Sachen gucken.. da kriegste auch öfters mal ein schock, aber sind halt meist flüchtigkeitsfehler bzw kaffeemangel
-
Was sind gits?
Mit dummen Fehlern meine ich sowas wie wenn ich vergesse, die wichtigste Variabele zu deklarieren, oder anstatt do od schreibe, das sind für mich dumme Fehler.
-
Zitat von Wynton
Fehler sind immer dumm, oder gibts gute/schlaue Fehler ;D?
naja wenn man z.B. nen taschenrechner programmiert und der statt dem Ergebnis einer Addition den Beweis von Fermats letztem Satz ausgibt, das würde ich nen schlauen Fehler nennen
-
Zitat von Blue-Fox
Was sind gits?
Mit dummen Fehlern meine ich sowas wie wenn ich vergesse, die wichtigste Variabele zu deklarieren, oder anstatt do od schreibe, das sind für mich dumme Fehler.
Das ist zb ein git, und dieser git ist für den Kernel.
schau da: würde nur die newline vergessen (/n), flüchtigkeitsfehler halt
-
Ich glaube, ich verstehe was das ist...
Aber mein Programm mit all den Headern und Fehlern ist nicht so, wie ich das möchte.
-
Zitat von Wynton
(obwohl ich als Programmiersprachen-Noob davon ausgehe das man siginfo-ng zu 80% umschreiben dürfte.).
Problem ist Netzwerk (also HTTP) und der ganze Kram, den gibts in C nicht plattformunabhängig, ohne besondere Bibliothek. Und die Plugins selber müssen um an die Infos ranzukommen direkt Linux-Funktionen verwenden. Plugins muss man also so oder so auch für Windows neu schreiben.Ansonsten dürfte man siginfo-ng ohne Plugins vermutlich mit einer POSIX-kompatiblen Umgebung wie cygwin unter Windows kompileren können. Unter OSX kompiliertes ja angeblich.
Zitat von Blue-FoxWas ich gut finden würde, wenn gandro mir verraten würde, wie das mit den Makefile krams ist, oder sonstige Implentierungen in siginfo-ng, damit ich mein Plug-In so implrntieren kann, wie ich mir das vorstelle.
Als Pluginentwickler brauchst du nicht an der Makefile rumzufummeln, lediglich wenn es dich interessiert, wie das intern läuft, aber dazu musst du so ne Makefile auch lesen könne, um das zu verstehen.Kleines Beispiel-Plugin:
C
Alles anzeigen#include <stdio.h> #include "../plugin.h" #include "../siginfo-ng.h" void myplugin_funktion(plugin_t *self) { int variable = 42; set_value(self, &variable, T_INTEGER); } void myplugin_init() { register_plugin("MY_PLUGIN", myplugin_funktion); }
Beachten: #include "../plugin.h"#include "../siginfo-ng.h"
Wird benötigt für die Funktionen und Datentypen die man als Plugin braucht. Dass man die <stdio.h> einbinden muss, ist mehr ein Bug den ich gerade gefunden habe.
Wichtig: Der Dateiname (hier myplugin.c) muss auch in den Funktionen verwendet werden. Wenn du also im "plugins" Ordner eine "myplugin.c" erstellst, muss in dieser Datei eine Funktion myplugin_init() vorhanden sein.
Diese Funktion wird beim Starten von siginfo-ng bei allen Plugins aufgerufen, in dieser Funktion meldest du deine "Hooks" an. Im obigen Beispiel soll beim Hook "MY_PLUGIN" (in der Konfigurationsdatei dann {MY_PLUGIN}) die Funktion myplugin_funktion bei jedem Update aufgerufen werden.
Die Funktion muss einen Parameter als Pointer von Typ plugin_t sein. In diesem Beispiel, heisst der self. Jetzt kannst du in der Funktion tun und lassen was du willst, das Resultat, welches am Ende in der Signatur angezeigt werden soll, gibst du dann über die Funktion set_value(plugin_t *plugin, const void *value, type_t type) zurück.
Den Wert hinter dem Pointer *value (in diesem Falle &variable) kannst du danach wieder löschen/freigeben, er wird kopiert. Als Datentyp kannst du momentan Strings (T_STRING), Ganzahlen (T_INTEGER), Gleitpunktzahlen (T_FLOAT)) oder lange Ganzzahlen (T_LONG) zurückgeben.
Die fertige Datei kommt wie gesagt mit richtigem Dateinamen ins "plugins"-Verzeichnis. Danach machst du im Hauptverzeichnis (da wo die Makefile liegt) sicherheitshalber erstmal ein "make clean", danach ein "make config", wo du dein Plugin jetzt mit Y aktivieren kannst. Danach compilieren mit "make".
-
An mein BOFH-Plugin sähe der Code so aus:
Spoiler anzeigen
Meine siginfo-ng.conf sieht so aus:
Spoiler anzeigen
Coderow1=CPU: {CPU0_MODEL}, {CPU0_CACHE} KB Cache, {CPU_COUNT} Kerne. row2=RAM: {RAM_USED} von {RAM_TOTAL} MB benutzt, {RAM_FREE} MB frei. Swap: {SWAP_USED} von {SWAP_TOTAL} MB benutzt, {SWAP_FREE} MB frei. row3=OS: {UNAME_SYSNAME}, {UNAME_RELEASE} auf {UNAME_NODENAME}, wo{PROCESSES} Prozesse laufen. row4=HDD: {HDD_USED} von {HDD_TOTAL} GB Speicher benutzt, {HDD_FREE} GB frei. row5=Uptime: {UPTIME_DAYS_TOTAL} Tage, {UPTIME_HOURS} Stunden, {UPTIME_MINS} Minuten und {UPTIME_SECS} Sekunden. {BOFH_PLUGIN}
Und die Befehle (make) so:Spoiler anzeigen
Code
Alles anzeigenroot@Christopher-Linux:~/Downloads/Siginfo/gandro-siginfo-ng-0.1.3# make clean rm -f siginfo-ng rm -f init_plugins.c rm -f plugins/*.o rm -f *.o root@Christopher-Linux:~/Downloads/Siginfo/gandro-siginfo-ng-0.1.3# make config Use plugin 'bofh'? [Y/n] y Use plugin 'linux_fsstat'? [Y/n] y Use plugin 'linux_sysinfo'? [Y/n] y Use plugin 'linux_uptime'? [Y/n] y Use plugin 'linux_x86_cpuinfo'? [Y/n] y Use plugin 'posix_uname'? [Y/n] y root@Christopher-Linux:~/Downloads/Siginfo/gandro-siginfo-ng-0.1.3# make cc -c siginfo-ng.c cc -c http.c cc -c plugin.c cc -c plugins/bofh.c -o plugins/bofh.o; cc -c plugins/linux_fsstat.c -o plugins/linux_fsstat.o; cc -c plugins/linux_sysinfo.c -o plugins/linux_sysinfo.o; cc -c plugins/linux_uptime.c -o plugins/linux_uptime.o; cc -c plugins/linux_x86_cpuinfo.c -o plugins/linux_x86_cpuinfo.o; cc -c plugins/posix_uname.c -o plugins/posix_uname.o; plugins/bofh.c: In Funktion »bofh_funktion«: plugins/bofh.c:7: Fehler: »variable« nicht deklariert (erste Benutzung in dieser Funktion) plugins/bofh.c:7: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt plugins/bofh.c:7: Fehler: für jede Funktion in der er auftritt.) echo "/* this file was auto-generated by 'make' */">init_plugins.c echo "extern void bofh_init();">>init_plugins.c; echo "extern void linux_fsstat_init();">>init_plugins.c; echo "extern void linux_sysinfo_init();">>init_plugins.c; echo "extern void linux_uptime_init();">>init_plugins.c; echo "extern void linux_x86_cpuinfo_init();">>init_plugins.c; echo "extern void posix_uname_init();">>init_plugins.c; echo >>init_plugins.c echo "void init_plugins() {">>init_plugins.c echo " bofh_init();">>init_plugins.c; echo " linux_fsstat_init();">>init_plugins.c; echo " linux_sysinfo_init();">>init_plugins.c; echo " linux_uptime_init();">>init_plugins.c; echo " linux_x86_cpuinfo_init();">>init_plugins.c; echo " posix_uname_init();">>init_plugins.c; echo "}">>init_plugins.c cc -c init_plugins.c cc siginfo-ng.o http.o plugin.o plugins/bofh.o plugins/linux_fsstat.o plugins/linux_sysinfo.o plugins/linux_uptime.o plugins/linux_x86_cpuinfo.o plugins/posix_uname.o init_plugins.o -o siginfo-ng cc: plugins/bofh.o: No such file or directory make: *** [siginfo-ng] Fehler 1
Bei Make kommt immer ein Fehler, dass irgendwas falsch in Zeile 7 sei.
-
Schau mal in deinen Code... hast nen Typo.
-
Typo?
wat's that?
-
Ein Tippfehler: int [b]variablbe[/b] = 42;
-
okay, habe ich übersehen...
Edit: Tippfehler verbessert, make meckert nicht mehr rum, aber...
...wenn ich siginfo-ng ausführe, kommt eine Fehlermeldung:ZitatWarning: Unkown plugin hook {BOFH} in row 5!
-
Noch ein Flüchtigkeitsfehler: Du hast den Hook in deinem Quellcode BOFH_PLUGIN und nicht BOFH genannt.
Überigens, falls das Ding dann läuft und du mehr machen willst, schau dir die Ausgabe von Strings & Co evtl. das Beispiel-Plugin von weiter vorne an:
-
Zitat von gandro
Noch ein Flüchtigkeitsfehler: Du hast den Hook in deinem Quellcode BOFH_PLUGIN und nicht BOFH genannt.
[...]
Das habe ich geändert;
C
Alles anzeigen#include <stdio.h> #include "../plugin.h" #include "../siginfo-ng.h" void bofh_funktion(plugin_t *self) { int variable = 42; set_value(self, &variable, T_INTEGER); } void bofh_init() { register_plugin("BOFH", bofh_funktion); }
Gleicher Fehler...
-
Hast du auch neu kompiliert?
-
Klar...
make clean
make config
makeDas gleiche Problem tritt auch auf, wenn ich das Beispielplugin aus #36 verwende...
-
Hast du auch dran gedacht, dass das möglicherweise installierte siginfo-ng nicht dem eben gerade kompilierten ./siginfo-ng entspricht?
-
Nein, da liegt der Fehler!
Wenn ich ./siginfo-ng eintippe geht es!
-
Huhu, Version 0.1.3-1 ist fertig!
Muss nur noch Fehlerbereinig werden, bzw. optimiert werden.
Edit: Fehlerfrei!
Edit2: Optimiert!
Edit3: Jetzt fehlt nur noch die sprueche.conf
Edit4: Done!
Edit5: Quellcode:Spoiler anzeigen
C
Alles anzeigen#include <stdio.h> // Standard #include <stdlib.h> // Für srand #include "../plugin.h" #include "../siginfo-ng.h" #define BUF 255 char temp[BUF]; char puffer[BUF]; void bofh_funktion(plugin_t *self) { char *getsline_number(int n, FILE *file) { int i; for(i = 0; i < n-1; i++) if(fgets(temp, BUF, file) == NULL) /* Bis zur n-ten Zeile lesen */ return NULL; /* Zeile scheint nicht zu existieren */ /* Stream ist jetzt in der n-ten Zeile */ if(fgets(puffer,BUF,file) == NULL) return NULL; /* Zeile scheint nicht zu existieren */ return puffer; /* Zeile an Aufrufer zurück */ } FILE *f; unsigned int line; char *linenr; f = fopen("sprueche.conf","r"); if(f == NULL) { printf("Error 101"); } srand(time(NULL)); // Zufalls- line = rand() % 8 + 1;// generator linenr=getsline_number(line, f); if(linenr == NULL) { fprintf(stderr, "Fehler beim Lesen der" " %d-ten Zeile, Error102-%d\n", line, line); } set_value(self, &linenr, T_STRING); } void bofh_init() { register_plugin("BOFH", bofh_funktion); }
Bis jetzt weiß ich noch nicht genau, ob das so funktioniert...
Edit6: Die sprueche.conf muss selber geschrieben werden und im plugin-Verzeichnis abgelegt werden.So, 0.1.3-1pl1 ist fertig, Zip, rar und tar folgen.
Done!:
http://blue-fox.bplaced.net/BOFH/bofh-plug….3-1pl1.tar.bz2
http://blue-fox.bplaced.net/BOFH/bofh-plugin-0.1.3-1pl1.tar.gz
http://blue-fox.bplaced.net/BOFH/bofh-plugin-0.1.3pl1.7z
http://blue-fox.bplaced.net/BOFH/bofh-plugin-0.1.3pl1.tar
http://blue-fox.bplaced.net/BOFH/bofh-plugin-0.1.3pl1.zipIst alles das selbe, nur in Anderen Archiven.
Wichtig: Ich übernehme keine Haftung für Schäden an PC und Software!
(gandro wies mich darauf hin, dass ich aufpassen soll, das meine Programme keine Hunde fressen.) -
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!