mysql mount liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo zusammen,
ich habe eine DB in der ich Pfade, user, pass für mount hinterlegt habe, es kann sein das an einem Tag nur ein mount ausgeführt werden muss aber es kann auch sein das mehrere mounts ausgeführt werden müssen, wenn es nur ein mount ist habe ich kein Problem damit, beim mehreren mounts komme ich nicht klar wie soll ich das nacheinander abarbeiten.
Ich hoffe eine hat Zeit und lust mir da weiter zu helfen, ich poste meinen code was ich bis jetzt habe dann Versteht man mein Problem (für euch Profis ist es wahrscheinlich nicht der rede Wert) besser.

in abfrage habe ich
(1, pfad1, pfad2, user1, pass1)
(2, pfad1, pfad2, user2, pass2)
in diesem fall müsste ich 4 mal Pfade mounten, 2x mit übergabe user, pass, 2x ohne
schwierig zu erklären :)

Code: Alles auswählen

#!/usr/bin/python3

#import pymysql
import mysql.connector
import subprocess

def abfrage():
    try:
    	rows=[]
    	mydb = mysql.connector.connect (option_files='pfad_zu file')
    	db_cursor = mydb.cursor()
    	sql =("""mein query
    		""")
    	db_cursor.execute(sql)
        row = db_cursor.fetchall()
        if row == None:
            print ("nichts da")
            exit("CIAO")
        else:
            print ("etwas ist da")
            #for elem in row:
                #rows.append(row)
            return row
            
    except mysql.connector.Error as e:
        print("Error reading data from MySQL table", e)
    finally:
        if mydb.is_connected():
            mydb.close()
            db_cursor.close()
            #print("MySQL connection is closed")    

def mount():
    source = "1.pfad1"
    target = " 1.pfad2"
    subprocess.run(["mount", source, target, 1.user1,1.pass1 ])
    #wenn fertig dann 2 mount
            
def main()
    def weiter():
        rows = abfrage()
        for e in rows:
            print (e)
            #ausgabe:
            # (1, pfad1, pfad2, user1, pass1)
            #(2, pfad1, pfad2, user2, pass2)
        	#wie kann ich jetzt mehrere mounts nach einander ausführen in einer schleife?
        	#zeilenweise Elemente an mount übergeben, zu sagen erstmal 1, pfad1, user, pass und dann 2, pfad1, pfad2
	               
if __name__ == '__main__':
    main()              
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@ganja,

du solltest die mount() Funktion so umschreiben, dass sie als Parameter alles annimmt, was sie für einen Mount-Vorgang benötigt.
Dann rufst du die mount() Funktion wiederholt mit jedem einzelnen Parametersatz in der Schleife auf.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

hallo @rogerb,
danke dir, aber ich weiß es nicht wie!
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@ganja,

dann fehlen dir aber einige sehr fundamentalen Grundlagen um in Python zu programmieren. Wo hast du denn den Code her? Willst du dich nicht lieber erstmal mit den Grundlagen beschäftigen?

Eine Funktion kann ein oder mehrere Eingangsparameter erhalten, die in den Klammern angegeben werden:

Code: Alles auswählen

def summe(a, b):
    print(f"Die Summe von {a} und {b} ist {a+b}.")


summe(1, 2)
Beim Funktionsaufruf, wie hier, werden die Zahlen 1 und 2 der Reihenfolge entsprechend, an die Namen a und b, gebunden und können so innerhalb der Funktion als lokale Variablen verwendet werden.
So musst du der mount() Funktion "source", "target", "username" und "password" übergeben.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ganja: Der Quelltext kommt nicht mal am Compiler vorbei. ``1.user1`` ist keine gültige Syntax. Und bei der Definition der `main()`-Funktion fehlt ein Doppelpunkt.

Dann ist die lokale Funktion `weiter()` falsch. Die gehört da nicht hin sondern entweder komplett weg, oder auf Modulebene.

In `abfrage()` ist das ``except`` falsch, denn wenn da eine Ausnahme auftritt, gibt die Funktion einen Text aus, und arbeitet dann einfach weiter als wäre nichts geschehen und gibt implizit `None` zurück, was dann in `main()` unweigerlich zu einem Folgefehler führt, weil man über `None` nicht mit einer ``for``-Schleife iterieren kann.

Ein `exit()` gehört nicht in so eine Funktion. Das gehört in das Hauptprogramm und da auch nur wenn mindestens potentiell ein anderer Rückgabecode als 0 an den Aufrufer zurückgegeben wird. Wobei das sowieso toter Code ist, denn `fetchall()` liefert niemals `None` als Ergebnis.

Der Ausgabetext muss übrigens auch nicht stimmen, denn das Problem könnte auch schon beim Verbindungsaufbau auftreten und nicht erst beim Lesen der abgefragten Daten.

`rows` wird als leere Liste definiert und dann nirgends verwendet. `row` dagegen enthält gar nicht nur *eine* Zeile, sondern potentiell mehrere, sollte also `rows` heissen.

Statt des ``try``/``finally`` mit dem Test, würde man besser `contextlib.closing()` und ``with`` verwenden.

`subprocess.run()` sollte man dazu bringen bei einem anderen Rückgabecode als 0 bescheid zu sagen, damit Probleme beim mounten nicht einfach ignoriert werden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess
from contextlib import closing

import mysql.connector


def abfrage():
    with closing(
        mysql.connector.connect(option_files="pfad_zu file")
    ) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute(
                """mein query
                """
            )
            return cursor.fetchall()


def mount(source, target, username, password):
    subprocess.run(["mount", source, target, username, password], check=True)


def main():
    for _, source, target, username, password in abfrage():
        mount(source, target, username, password)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Danke @__blackjack__

ich bekomme jetzt
raise errors.InternalError(Unread result found)
das liegt wahrscheinlich daran da ich im query zu vile spalten abfrage.

Danke @__blackjack__
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Danke @__blackjack__

ich bekomme jetzt
raise errors.InternalError(Unread result found)
das liegt wahrscheinlich daran da ich im query zu vile spalten abfrage.

An welcher stelle muss ich die rows definieren? Ich frage 10 spalten ab brauche aber für den mount nur 4, an eine anderen stelle brauche ich die anderen rows.
source = row[5]
target = row[8]
username = row[6]
password = row[8]

vor dem return? Oder in der main vor der for schleife?

Vielen Dank im Voraus @__blackjack__
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Ich glaube das geht nicht so mit der mount Funktion, bekomme die ganze Zeit "returned non-zero exit status", es wird aber alles richtig übergeben 'user' 'pass' 'source' 'target'!
subprocess.run(["mount", "-t", "cifs", source, target, username, password, "-o", f"vers={vers}]")
Dasteht dan alles richtig in Hochkommas 'Inhalt source' 'Inhalt target'
Vielleicht liegt es an den Hochkommas!
In der shell wenn ich den mount Befehl abschicke, es geht aber nicht aus dem Script!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Bist Du Dir sicher, dass Du username und password richtig übergibst?
Ich bezweifle, dass das so in der Shell aussieht.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo @Sirius3,

ich denke ja, auch der Inhalt in user, pass source, target passt, das einzige was mir auffällt sind die Hochkommas. ich weiß nicht wie ich die maskieren kann aber ich denke daran liegt es.
Ich dachte da ich die domain nicht übergebe, aber es geht auch ohne domain, in der shell getestet mit und ohne.

Über shell geht es da sind aber keine Hochkommas:
sudo mount -t gifs -o user=xxxxx,password=xxxxxx //xxxxxx/xxxxx /xxx/xxxx

mount: bad usage
Try 'mount --help' for more information.
Traceback (most recent call last):
File "./newtest.py", line 47, in <module>
main()
File "./newtest.py", line 43, in main
mount(source, target, user, password)
File "./newtest.py", line 36, in mount
subprocess.run(["mount", "-t", "cifs", source, target, user, password, "-o", f"vers={vers}"], check=True)
File "/usr/lib/python3.8/subprocess.py", line 516, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['mount', '-t', 'cifs', '//xxxxxxxxxx/xxx', '/xxx/xxxxxxxx', 'xxxxxxxx', 'xxxxxxxxxxxx', '-o', 'vers=3.0']' returned non-zero exit status 1.
xxx@xxxxx:/home/xxx/xxxxxx# mount --help

Mit der Funktion (da habt ihr mir auch geholfen :)) geht es, da lese ich aber user pass aus dem file.

Code: Alles auswählen

def mount_xxxxx():
    options = "/xxx/xxxxx/.xxx"
    vers = "3.0"
    source = "//xxxx/xxx"
    target = "/xxx/xxxxxxxxx"
    subprocess.run(["mount", "-t", "cifs", source, target, "-o", f"credentials={options}", "-o", f"vers={vers}"])
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Beim Programmieren, und bei Computern generell, kommt es auf jedes Zeichen an. Ein `gifs` gibt es nicht.
Und Du mußt doch sehen, dass der Aufruf im Programm kein -o user=...,password=... enthält.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

VIelen Dank @Sirius3,

gifs gibt es nicht :lol:

ja ich habe es dann gesehen.

Danke
Antworten