SambaServer mittels C/C++ Programm steuern (Start/Stop/Restart...)

sisu

Grünschnabel
Hi,
ich wollte mir gerne ein C/C++ Programm schreiben, mit dem ich meinen Sambaserver steuern kann.
Gibt es irgendeine Schnittstelle für C/C++ zu dem Sambaserver?
Oder wie könnte ich dies am besten realisieren? Hat das jemand schon von euch gemacht?

Schonmal vielen Dank für die kommenden Antworten.
Gruß Sisu.
 
Also da du ja keine Interprogrammkommunikation willst, sondern nur grobe bash-Befehle übergeben (z.B. start/stop/restart), könntest du es vermutlich mit dem system()-Befehl lösen:

Du musst zuerst rausfinden unter welchem Pfad sich das Programm befindet. Es könnte z.B. an diesen Orten mit unterschiedlichen Namen zu finden sein:
/etc/init.d/samba
/etc/rc.d/init.d/samba
/etc/rc.d/init.d/smb
/etc/init.d/smb

Wo genau, hängt natürlich vom jeweiligen UNIX-Typ ab. Leider hat mich da eine kurze Google-Suche auch nicht viel weitergebracht. Ideal wäre es natürlich, wenn sich samba als service eintragen würde, leider kenne ich mich da nicht gut aus.
Die Kommandos wären in C++ dann in etwa so:
C++:
//üblicher headerkram
... routinen ...
//folgende befehle sollten von dem Benutzer, der samba installiert hat und ausführt ausgeführt werden
system("/etc/init.d/samba restart"); //rufe Bsppfad 1 auf und starte dienst neu
system("/etc/rc.d/init.d/smb stop"); //rufe Bsppfad 3 auf und beende dienst
/* am besten ist natürlich, wenn sich samba als dienst anmeldet: */
system("service samba start"); //starte dienst "samba"
/* falls die befehle zwar syntaktisch richtig sind, aber dir die rechte fehlen, kannst du als superuser arbeiten: */
system("sudo service samba restart"); //kann aber nervig sein, da bei manchen distributionen ein passwort verlangt wird
/* also sollte dein programm bereits mit systemrechten gestartet werden... */
system("/sbin/service smb stop"); //eine etwas exotischere variante

Tut mir echt leid dass ich dir da nicht großartig weiterhelfen kann...
Das erfolgversprechende ist wahrscheinlich:
1) programm als root starten.
2) system("service samba start"); aufrufen.
3) sicherstellen dass das programm ja keine systemdaten ändert!

Hoffe es klappt
Gruß Technipion
 
Zuletzt bearbeitet:
Hi,
schonmal vielen Dank.
Ich habe mir schon überlegt mit "popen()" zu arbeiten.
Aber wie bekommen ich zum Beispiel die Rückgabewerte raus?
Wenn ich überprüfen will ob der Server bereits läuft. Brauche ihn dann ja nicht zu starten. Oder wenn ich es einfach nur als Status anzeigen will.
popen() baut da nur eine Halfduplexpipe auf. Kann ich mir da selber eine Vollduplexpipe erstellen und so in beide Richtungen kommunizieren?

Da hängts bei mir leider gerade.

Gruß sisu
 
Zuletzt bearbeitet:
Also wenn du testen möchtest, ob samba bereits läuft, dann kannst du das "status"-command benutzen:

1) Wenn du den Prozessnamen kennst: service prozessname status
Also in dem Fall so etwas wie: >> service smbd status <<
2) Wenn du die Prozessadresse kennst: /etc/init.d/prozessname status
Dann halt etwas wie: >> /etc/init.d/sambda status <<

Um eine Pipe zu erzeugen, die sowohl In- wie auch Output unterstützt, benutzt man bei UNIX-Systemen das Pipe()-Commando:

Hier ein Link: http://linux.die.net/man/2/pipe

Die Frage ist halt, ob du dir das wirklich antun willst, denn mit dem system()-Befehl kommt man - wenn man jetzt nur das Grobe will - auch schon weit...

Ich drücke dir die Daumen
Gruß Technipion
 
Dann werd ich mich mal am Wochenende hinsetzen und bischen probieren.
Villt klappt ja dann alles was ich machen will.
Wenn nicht melde ich mich nochmal hier ;-) Wenns klappt kann ich ja auch den Quelltextposten.

Gruß Sisu
 
Zurück