Prüfung, ob DB-Server installiert ist

Spezielle Fragen zu PostgreSQL, MySQL, SQLite, SQL ...
Antworten
Benutzeravatar
Honsek
Foriker
Beiträge: 443
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Prüfung, ob DB-Server installiert ist

Beitrag von Honsek » Do 10. Jun 2021, 09:42

Hallo,

ich möchte prüfen, ob der Mysql-Server und der PostgreSQL-Server installiert sind. In meinem Fall sind beide Server installiert und gestartet.

In der Konsole ergibt sich für PostgreSQL:

hans@mint20:~$ dpkg --get-selections | grep postgresql
gambas3-gb-db-postgresql install
odbc-postgresql:amd64 install
postgresql install
postgresql-12 install
postgresql-client-12 install
postgresql-client-common install
postgresql-common install
postgresql-contrib install
postgresql-doc install
postgresql-doc-12 install

Die (Gambas-)Funktion System.Exist(postgresql) liefert NULL; genauso wie System.Find(postgresql).

Für MySQL wird das ausgegeben:

hans@mint20:~$ dpkg --get-selections | grep mysql
gambas3-gb-db-mysql install
gambas3-gb-mysql install
libmysqlclient21:amd64 install
mysql-client install
mysql-client-8.0 install
mysql-client-core-8.0 install
mysql-common install
mysql-server install
mysql-server-8.0 install
mysql-server-core-8.0 install

Die (Gambas-)Funktion System.Exist(mysql) liefert nicht NULL und System.Find(mysql) den Pfad /usr/bin/mysql.

Was nun - was tun?

Mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
PJBlack
Foriker
Beiträge: 68
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von PJBlack » Do 10. Jun 2021, 11:59

dpkg ist nicht auf allen Systemen verfügbar ... meine Idee:
gambas code

    Dim sAnswer As String
    Dim pgExists, pgRun As Boolean

    Shell "which postgres" To sAnswer
    If sAnswer = "" Then pgExists = False Else pgExists = True
    Shell "nmap -p 5432 127.0.0.1 |grep 5432" To sAnswer
    If InStr(sAnswer, "open") Then pgRun = True Else pgRun = False


Benutzeravatar
tionov
Site Admin
Beiträge: 400
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von tionov » Do 10. Jun 2021, 12:23

Da brauchst du aber vorher eine Prüfung ob nmap installiert ist (was eine Seltenheit sein dürfte). ;-)
Das selbe gilt für Programme wie netstat oder telnet, mit denen man so etwas auch prüfen könnte.

Außerdem kann der Server installiert sein und laufen, aber nicht an einem Port lauschen.

Ich würde den Benutzer des Computers fragen.
Alles Gute,

tionov

Benutzeravatar
Honsek
Foriker
Beiträge: 443
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von Honsek » Do 10. Jun 2021, 14:10

Hallo.
@PGBlack

In der Konsole ergibt 'which postgres' keine Ausgabe - der PostgreSQL-Server ist aber installiert und gestartet. Das bringt mich nicht weiter. Es wundert, dass Du postgres verwendest?

@tionov
Wenn ich meine DB-Beispiel-Programme im Buch vorstelle, dann möchte ich sichern, dass das DB-Programm nur dann startet, wenn A der DB-Server installiert ist und B auch gestartet ist. Für genau den 1. Fall benötige ich die Abfrage. Ob der DB-Server gestartet ist, lässt sich über seinen Status abrufen, was bei PostgreSQL und MySQL sicher funktioniert. Ja, ich könnte auch im Kapitel-Vorspann erwähnen, das ein gestarteter DB-Server Voraussetzung ist.

Mit freundlichem Gruß

Hans
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
PJBlack
Foriker
Beiträge: 68
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von PJBlack » Do 10. Jun 2021, 14:27

tionov hat geschrieben:
Do 10. Jun 2021, 12:23
Da brauchst du aber vorher eine Prüfung ob nmap installiert ist (was eine Seltenheit sein dürfte). ;-)
Das selbe gilt für Programme wie netstat oder telnet, mit denen man so etwas auch prüfen könnte.
Stimmt, ich sehe das ganze aber aus Sicht eines Netzwerkers (bei dem MariaDB und PG auf eigenen Servern laufen) und da ist nmap sehr hilfreich und sollte installiert sein ... auch um den eigenen Rechner zu prüfen ... und für diese Tests reichen die Benutzerrechte.
tionov hat geschrieben:
Do 10. Jun 2021, 12:23
Außerdem kann der Server installiert sein und laufen, aber nicht an einem Port lauschen.
Stimmt auch, aber Hans möchte wohl benutzbare DBMS finden.
tionov hat geschrieben:
Do 10. Jun 2021, 12:23
Ich würde den Benutzer des Computers fragen.
<sarkastisch=on>Hattest du schon mal mit durchschnittlichen Benutzern zu tun</sarkastisch>

eine (sehr unelegante) Lösung mit Bordmitteln:
ip a -> eigene IP rausfutscheln +
ip nei -> verfügbare (?) Rechner im Netzwerk

alle IPs durchgehen und versuchen eine DBConnection aufzubauen ... gefällt mir nmap aber besser ;-)

Benutzeravatar
PJBlack
Foriker
Beiträge: 68
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von PJBlack » Do 10. Jun 2021, 14:40

Honsek hat geschrieben:
Do 10. Jun 2021, 14:10
@PGBlack
SEHR toller Tipfehler und voll im Kontext ... sehr cool :-)
Honsek hat geschrieben:
Do 10. Jun 2021, 14:10
In der Konsole ergibt 'which postgres' keine Ausgabe - der PostgreSQL-Server ist aber installiert und gestartet. Das bringt mich nicht weiter. Es wundert, dass Du postgres verwendest?
shell code
[mnaltrogge@DE-FLONTB01 ~]$ which postgresql
which: no postgresql in (/home/mnaltrogge/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/cuda/bin:/opt/cuda/nsight_compute:/opt/cuda/nsight_systems/bin:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin)
[mnaltrogge@DE-FLONTB01 ~]$ which postgres
/usr/bin/postgres
Honsek hat geschrieben:
Do 10. Jun 2021, 14:10
A der DB-Server installiert ist und B auch gestartet ist
... ist A nicht genau betrachtet irrelevant? Ich meine, der kann fünfmal installiert sein aber wenn er nicht läuft bringt mir das gar nichts?

Benutzeravatar
tionov
Site Admin
Beiträge: 400
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von tionov » Do 10. Jun 2021, 14:44

Honsek hat geschrieben:
Do 10. Jun 2021, 14:10
@tionov
Wenn ich meine DB-Beispiel-Programme im Buch vorstelle, dann möchte ich sichern, dass das DB-Programm nur dann startet, wenn A der DB-Server installiert ist und B auch gestartet ist. Für genau den 1. Fall benötige ich die Abfrage. Ob der DB-Server gestartet ist, lässt sich über seinen Status abrufen, was bei PostgreSQL und MySQL sicher funktioniert. Ja, ich könnte auch im Kapitel-Vorspann erwähnen, das ein gestarteter DB-Server Voraussetzung ist.
Ein DB-Server ist praktisch nie auf dem eigenen Computer installiert, außer bei Programmierern, die damit arbeiten. Wenn du für dein Programm also voraussetzt, dass ein DB-Server installiert ist, musst du das dem Benutzer vorher mal erzählt haben und/oder kannst davon ausgehen, dass Benutzer davon wissen.

Postgresql und Mariadb (AFAIK) fragen bei der Installation nach einem Hauptbenutzer und dessen Passwort. Ohne diese Zugangsdaten (die nur die Person wissen kann, die die Server installiert hat) kannst du auch keine Datenbank installieren.

Da geht also nichts automatisch.
Alles Gute,

tionov

Benutzeravatar
PJBlack
Foriker
Beiträge: 68
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von PJBlack » Do 10. Jun 2021, 14:51

Off Topic und auch nicht ...

Frage: Wenn ich davon ausgehe, das Du des Englischen mächtig bist (immerhin gibt es Dein Buch auch in Englisch) dann Frage ich mich, wieso Du parallel Deine Fragen nicht auch in Gambas One stellst ???
Da sind einige gute Leute unterwegs, es gibt dort "mehr Leben" als hier und die Qualität Deines Buches wird dort auch langsam immer mehr erkannt.

Benutzeravatar
tionov
Site Admin
Beiträge: 400
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von tionov » Do 10. Jun 2021, 15:33

PJBlack hat geschrieben:
Do 10. Jun 2021, 14:51
Off Topic und auch nicht ...

Frage: Wenn ich davon ausgehe, das Du des Englischen mächtig bist (immerhin gibt es Dein Buch auch in Englisch) dann Frage ich mich, wieso Du parallel Deine Fragen nicht auch in Gambas One stellst ???
Da sind einige gute Leute unterwegs, es gibt dort "mehr Leben" als hier und die Qualität Deines Buches wird dort auch langsam immer mehr erkannt.
Hey, Gambas One kenne ich gar nicht, muss ich mir mal ansehen. Seine Frage ist nun auch in der Gambas Mailinglist:

https://lists.gambas-basic.org/pipermai ... 73520.html
Alles Gute,

tionov

Benutzeravatar
PJBlack
Foriker
Beiträge: 68
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von PJBlack » Do 10. Jun 2021, 15:39

https://forum.gambas.one/

Mailing List wäre meine nächste Idee gewesen :-)

Benutzeravatar
Honsek
Foriker
Beiträge: 443
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von Honsek » Fr 11. Jun 2021, 18:16

Frage: Wenn ich davon ausgehe, das Du des Englischen mächtig bist (immerhin gibt es Dein Buch auch in Englisch) dann Frage ich mich, wieso Du parallel Deine Fragen nicht auch in Gambas One stellst ???
Russisch wäre mir fast lieber ... .
Da sind einige gute Leute unterwegs, es gibt dort "mehr Leben" als hier.
Mag sein.
und die Qualität Deines Buches wird dort auch langsam immer mehr erkannt.
Woran hast Du das erkannt?

Ich hänge hier mal die Antwort von Tobias an, die er in der schon erwähnten Maling-Liste gab - hoch interessant:

On Thu, 10 Jun 2021, Hans Lehmann wrote:
> Hello.
>
> When I present my DB sample programs in the Gambas book, I want to make
> sure that the DB program only starts if (A) the DB server is installed and
> (B) is also started. For (A) I use both System.Find("postgresql") and
> System.Exist("postgresql"). In both cases the output is NULL. With MySQL,
> however, I get TRUE and the path '/usr/bin/mysql'. Whether the DB server -
> related to (B) - is started can be safely retrieved via its status, which
> certainly works for PostgreSQL *and* MySQL on my system. Now the question:
> Where do you see possible errors?
>

System.Find or System.Exist look for *program names*, not *package names*
(which are of course not standardized across distributions). You may have
the package "postgresql" installed, but the program you may want to look
for is the postgresql server program, called "postgres". This should work
unless your distribution decides to change the executable name.

As for question (B), I can suggest two alternatives:

(1) Before your main program starts, pop up a small input form which asks
the user for their preferred database connection string (and give the user
feedback about whether you detect a server at the given address) and maybe
store that for the future in a settings file. This is the robust solution
which annoys or expects too much knowledge from your users.

Given the myriad ways of running a database server (over TCP, which port,
or over UNIX only, or ...) it will be hard to detect if there is a specific
database server. Even default configurations may vary across systems.

(2) Rather, I would suggest you use your system's service manager. This
is less portable because some (many) systems use systemd, some the old
/etc/init.d scripts. BSDs may work yet differently. But _if_ you commit
to systemd-based distributions, you can query systemctl for the status
of any service managed by it:

$ systemctl is-active postgresql
inactive

This has the added advantage that that "mariadb" and "mysqld" are synonyms,
so you could use either to get the status of whatever implementation is
installed on the machine.

Using systemctl also allows you to solve your problem (A). The exit status
of `systemctl status` tells you whether a service is active, inactive or
unknown (which you can take as "not installed"):

$ systemctl status NetworkManager >/dev/null 2>&1; echo $?
0 # --> NetworkManager is running (and obviously installed)

$ systemctl status postgresql >/dev/null 2>&1; echo $?
3 # --> postgresql is installed but not running

$ systemctl status msaccess >/dev/null 2>&1; echo $?
4 # --> no service by the name "msaccess" on my system

This is documented in `man systemctl`.

In Gambas, you would do the following to obtain $?:

' Exec For Read Write but do not read or write anything to avoid
' cluttering the terminal. We only want the exit code.
Exec ["systemctl", "status", "postgresql"] Wait For Read Write
Print Process.LastValue

Of course, you can do something similar with /etc/init.d scripts instead
of systemd.

Best,
Tobias

Mit freundlichen Grüßen

Hans
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
Honsek
Foriker
Beiträge: 443
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von Honsek » Fr 11. Jun 2021, 18:21

Hallo.

So habe ich die Umsetzung der Idee von Tobias in einem Modul ausprobiert:

Code: Alles auswählen

    Exec ["systemctl", "status", argType] Wait For Read Write

'-- EXIT STATUS IN PROCESS.LASTVALUE
'------------------------------------------------------------
'-- Documented in `man systemctl` 
'-- 0 -> program is running or service is OK │ unit is active
'-- 3 -> program is not running | unit is not active 
'-- 4 -> program or service status is unknown │ no such unit

    Select Case Process.LastValue
      Case 4
        MAddOns.PlaySound(MCreateDir.SoundsDir &/ "sound_e.wav")
        sMessage = "<b><font size='+1', color='DarkRed'>"
        sMessage &= ("Fehler!")
        sMessage &= "</b></font><hr>"
        sMessage &= Subst("&1 &2 &3", ("The DB server"), Upper(argType), ("is obviously not installed!"))
        sMessage &= gb.NewLine
        sMessage &= "<b>" & ("The application is therefore terminated!") & "</b>"
        Message.Error(sMessage)
    '-- The (main) program is terminated. -----------------------------------------
        Quit
      Case 3
        MAddOns.PlaySound(MCreateDir.SoundsDir &/ "sound_e.wav")
        sMessage = "<b><font size='+1', color='DarkRed'>"
        sMessage &= ("Fehler!")
        sMessage &= "</b></font><hr>"
        sMessage &= Subst("&1 &2 &3", ("The DB server"), Upper(argType), ("is not started!"))
        sMessage &= gb.NewLine
        sMessage &= "<b>" & ("The application is therefore terminated!") & "</b>"
        Message.Error(sMessage)
    '-- The (main) program is terminated. -----------------------------------------
        Quit
    End Select
Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
Honsek
Foriker
Beiträge: 443
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von Honsek » Fr 11. Jun 2021, 18:30

Hallo PJBlack,
... ist A nicht genau betrachtet irrelevant? Ich meine, der kann fünfmal installiert sein aber wenn er nicht läuft bringt mir das gar nichts?
Für aussagekräftige Fehlermeldungen ist es wohl interessant, ob der Server zwar installiert ist, aber nicht gestartet wurde. Ist der DB-Server nicht installiert, dann kann man das Programm getrost zum aktuellen Zeitpunkt beenden.

fehler_db_server.png
fehler_db_server.png (18.11 KiB) 6 mal betrachtet

Mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
PJBlack
Foriker
Beiträge: 68
Registriert: Sa 8. Dez 2018, 23:50
Kontaktdaten:

Re: Prüfung, ob DB-Server installiert ist

Beitrag von PJBlack » Fr 11. Jun 2021, 22:32

Honsek hat geschrieben:
Fr 11. Jun 2021, 18:16
Frage: Wenn ich davon ausgehe, das Du des Englischen mächtig bist (immerhin gibt es Dein Buch auch in Englisch) dann Frage ich mich, wieso Du parallel Deine Fragen nicht auch in Gambas One stellst ???
Russisch wäre mir fast lieber ... .
... da wäre ich dann sowas von raus --- wobei ich mir aber wirklich vorstellen könnte, dass im russischen Sprachraum viel Gambas Know-How vorhanden sein könnte.
und die Qualität Deines Buches wird dort auch langsam immer mehr erkannt.
Woran hast Du das erkannt?
Na ja, ich preise Dein Buch dort an wie sauer Bier und letzte Woche kam tatsächlich mal was zurück:
P.S. I just came across what looks to me like the best Gambas manual till now. It’s in German, but the authors are working on an English translation. Certainly well worth it to pay a visit.
https://gambas-buch.de/dwen/doku.php?id=start. It has some examples on ‘stretch’.
... wenn das kein hübscher Kommenar ist :-) ...
Ich hänge hier mal die Antwort von Tobias an, die er in der schon erwähnten Maling-Liste gab - hoch interessant:
Ja, tatsächlich ist die Mailingliste die m.M.n. maximal mögliche Ansammlung von Gambas wissen, weswegen ich dort auch täglich mitlese. Last but not least ... Ich denke, über den, dessen Name nicht genannt werden darf, muss man nun wirklich nichts mehr sagen ... außer vielleicht: Ist mit ihm wie mit Benoit (und einigen ganz wenigen anderen), wenn sie antworten dann halt die Klappe, lies und versuche es zu verstehen! Danach bist du um einiges schlauer ...

Antworten

Wer ist online?

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