[Problem] AVM NAS nicht entfernen, nur weil eigener smbd/nmbd gebaut wird ...

SpaceRat

Neuer User
Mitglied seit
23 Jun 2005
Beiträge
25
Punkte für Reaktionen
0
Punkte
1
Hallo!

Ich verwende schon seit einiger Zeit Freetz und dabei nimmt das Samba-Paket eine Entwicklung, die ich persönlich nicht so toll finde.

Prinzipiell würde mir der AVM-eigene Samba-Server völlig reichen, wenn er nicht ein gravierendes und ein eher harmloses Problem hätte:
Das harmlose, womit ich leben könnte, ist die fehlende Sichtbarkeit in der Netzwerkumgebung.
Gravierend ist für mich, daß der leidige "ftpuser" nun einmal gar nichts darf und es einfach nervt, parallel zu einem Kopiervorgang auch immer eine ssh-Verbindung zur Fritz!Box aufnehmen zu müssen, um den Besitz und die Rechte von Dateien, die vom PC rüberkopiert wurden, anzupassen bzw. die von Dateien, die zum PC kopiert werden sollen, so zu ändern, daß der ftpuser dran darf.

Nach meiner Logik tut es aber keine Not, alle NAS/Samba-Funktionen aus der AVM-Firmware rauszuschnippseln, nur weil man einen eigenen smbd/nmbd baut. Das zieht ja inzwischen auch einen ganzen Rattenschwanz weiterer Patches nach sich, die weitere Funktionen einschränken oder ganz entfernen ..

Meines Erachtens wäre es benutzerfreundlicher, einfacher und weniger einschneidend, wenn man smbd/nmbd über Freetz selber bauen könnte und diese einfach den entsprechenden Funktionen der AVM-Firmware vorsetzen könnte. Den Unterschied würden die doch gar nicht merken ...

Ich habe mir mal die AVM-Sambascripts angeguckt:
AVM erzeugt beim Start des Servers "on-the-fly" eine Samba-Konfiguration aus den wenigen Konfigurationsmöglichkeiten in der AVM GUI und einigen defaults. Diese Konfiguration sollte genausogut mit den von Freetz gebauten smbd/nmbd funktionieren.

Meine Idealvorstellung wäre jetzt, wenn man in der Freetz-GUI einfach den Betriebsmodus der Samba-Erweiterung ändern könnte:

( ) Vollständig durch AVM-Firmware kontrolliert
( ) Benutzerverwaltung durch Freetz
( ) Erweiterte Konfiguration durch Freetz
( ) Vollständige Kontrolle durch Freetz

Die Modi sind weitgehend selbsterklärend:
Im ersten Modus verhält sich der Samba-Server genauso wie der von AVM selber, wird auch von deren Samba-Scripts gestartet/beendet, usw. usf., lediglich die Binaries wurden durch die von Freetz ausgetauscht. Ergibt durchaus Sinn, weil die ja externalisiert werden können und damit im Flash Platz sparen.
(Würde man dann im Anschluß die Samba-Webkonfiguration in Freetz optional machen, wäre dies der resultierende Modus)

"Benutzerverwaltung durch Freetz" ergänzt den 1. Modus um die Möglichkeit, weitere Benutzer für die AVM-Freigabe zu erstellen.
Dazu braucht nur in AVMs samba_control hinter "samba_config_gen" eine Zeile eingefügt werden, über die ein Script zur Anpassung der Standardkonfiguration ausgeführt wird. Das Script würde dann in diesem Modus im Wesentlichen einfach nur die Zeilen mit "username map" und "smb passwd file" so anpassen, daß diese auf die von Freetz verwalteten Exemplare verweisen.
Meines Erachtens wäre das der Modus, der 98% der Benutzer der geeignete wäre: Es wird keine AVM-Funktionalität kastriert und die Original-Freigabe könnte auf Wunsch als "root" genutzt werden. Für die Benutzung als echtes NAS sind die USB-Ports der Fritz!Boxen, inkl. der USB-3.0-Ports der 7490, sowieso zu langsam, als daß man aufwendigste Freigabe- und Benutzerszenarien anlegen wollen würde.

"Erweiterte Konfiguration durch Freetz" wäre wiederum ein Schritt weiter: In diesem Modus könnte innerhalb von Freetz eine komplette Samba-Konfiguration verwaltet werden, wie jetzt auch, Start und Stop erfolgen aber weiterhin durch die AVM-Firmware. Das im vorherigen Modus erwähnte Script zur Anpassung der AVM-Config würde in diesem Modus allerdings alle Zeilen, die auch in Freetz konfiguriert sind, durch die entsprechende Freetz-Einstellung ersetzen bzw. zusätzliche Zeilen einfügen.
Perfekter Modus für Power-User: Ohne die AVM-Funktionalität zu verkrüppeln könnte man so z.B. WINS-Server-Funktionalität zufügen und und und.

"Vollständige Kontrolle durch Freetz" wäre der aktuelle status quo: Die AVM-Konfiguration bleibt wirkungslos
Ich weiß ehrlich gesagt nicht, ob das irgend jemand so gut findet.

Durch Einstellungen beim Bauen von Freetz ließen sich der erste und der letzte Modus erzwingen:
1. Die Freetz-Webkonfiguration für Samba optionalisieren
2. Das Entfernen der AVM-Webkonfiguration für Samba nicht mehr automatisch aktivieren, wenn Samba gebaut wird

Wird die Freetz-Webkonfiguration für Samba dann nicht ausgewählt, läuft Samba dauerhaft im Modus 1; wird das Entfernen der AVM-Webkonfiguration ausgewählt, so müßte Samba im Modus vier betrieben werden (So wie jetzt).

Würde das so Anklang finden?
 
Dein Vorschlag ist durchaus berechtigt, ist jedoch mit enormen Pflegeaufwand verbunden. Die Art und Weise, wie genau AVM Samba steuert, hat sich im Laufe der Zeit von einer Firmware-Version zu der anderen geändert. Es ist vom Aufwand her viel einfacher, das meiste von AVM rauszuschmeissen und dann eine einheitliche Freetz-Version von Samba dem User anzubieten (einheitlich im Sinne identisch auf allen Boxen/Firmware-Versionen ohne die Notwendigkeit irgendwelche komplexen Fall-Unterscheidungen einzuführen).

Edit: die 4 von Dir vorgeschlagenen Modi bedürfen auch eines nicht geringen Umsetzungsaufwandes.
 
Zuletzt bearbeitet:
Dein Vorschlag ist durchaus berechtigt, ist jedoch mit enormen Pflegeaufwand verbunden....
Edit: die 4 von Dir vorgeschlagenen Modi bedürfen auch eines nicht geringen Umsetzungsaufwandes.

Naja, zumindest der erste und letzte Modus als Dauerzustand (Also durch das Bauen von Freetz festgelegt) sind ja kein Problem:
Die Auswahl von Packages > Samba soll einfach nur nicht automatisch zur Ausführung von "300-remove-samba" und Auswahl der Freetz Samba Config führen.
Dann hätte man Modus 1 als Dauerzustand, d.h. AVMs Samba-Konfiguration bleibt für die Verwaltung des Samba-Servers zuständig und kriegt einfach nur neue Binaries untergejubelt, die externalisiert werden können.

Die Freetz Samba Config dann einfach als optionalen Unterpunkt in "Web interfaces --->" eingesetzt und erst wenn die ausgewählt wird, wird verfahren wie bisher = Modus 4 als Dauerzustand
 
Dein Vorschlag ist durchaus berechtigt, ist jedoch mit enormen Pflegeaufwand verbunden. Die Art und Weise, wie genau AVM Samba steuert, hat sich im Laufe der Zeit von einer Firmware-Version zu der anderen geändert. Es ist vom Aufwand her viel einfacher, das meiste von AVM rauszuschmeissen und dann eine einheitliche Freetz-Version von Samba dem User anzubieten (einheitlich im Sinne identisch auf allen Boxen/Firmware-Versionen ohne die Notwendigkeit irgendwelche komplexen Fall-Unterscheidungen einzuführen).
Da mich das so nicht mehr wirklich befriedigt (Bei alten Fritz!Boxen war's ok, weil der eingebaute Samba gar nix konnte und für Nix Voraussetzung war), weil einfach mehr kaputtgemacht wird als Zusatznutzen zu erzeugen, habe ich mal etwas rumgefrickelt und bin bei einer für mich akzeptablen, aber noch nicht ganz perfekten Lösung.

Ich beschreibe mal, was ich bisher gemacht habe, vielleicht greift es ja jemand für eine elegante Lösung auf:

  • ./patches/scripts/300-remove-samba.sh vom Killer zum Patch umgebaut
    Es enthält nur noch diesen einen Patch:
    Code:
    echo1 "patching rc.net: renaming sambastart()"
    modsed 's/\/bin\/smbd/\/sbin\/smbd/' "${FILESYSTEM_MOD_DIR}/etc/init.d/rc.net"

    Es müßte allerdings noch ein zweiter rein, es muß nämlich die original AVM-samba_control (In /etc/samba_control) wie folgt geändert werden:

    Nach
    Code:
    		SHARE_PRESENT=yes
    	else
    		SHARE_PRESENT=no
    	fi
    einfügen:
    Code:
    	/var/mod/etc/init.d/rc.samba config


    Ergebnis:
    1. Das Web-Interface wird nicht mehr kaputtgepatched (Fehlermeldung "undefined", wenn man den WebDAV-Dienst umkonfigurieren will).
    2. Es wird weiterhin AVMs samba_control verwendet, nur ergänzt um eine Zeile zum Aufruf der Konfigurationsübernahme.
  • /var/mod/usr/lib/cgi-bin/samba.cgi ist entschlackt
    Der ganze Block
    sec_begin '$(lang de:"Starttyp" en:"Start type")'
    ...
    sec_end
    fliegt raus, das macht AVMs Samba.

    Aus dem Block
    sec_begin '$(lang de:"Konfiguration" en:"Configuration")'
    ...
    sec_end
    kann eigentlich auch (fast) alles raus, denn nichts davon ist Grundeinstellung, sondern eher "erweitert".

    Drin gelassen habe ich vorerst
    cgi_print_textline_p "user" "$SAMBA_USER" 40/255 "$(lang de:"Benutzername" en:"User name"):"
    cgi_print_password_p "pass" "$SAMBA_PASS" 40/255 "$(lang de:"Passwort" en:"Password"):" \
    "<br><font size="-2">$(lang de:"leer lassen zum deaktivieren" en:"leave empty to deactivate")</font>"
    cgi_print_textline_p "netbios_name" "$SAMBA_NETBIOS_NAME" 20/255 "$(lang de:"Netbios Name" en:"Netbios Name"):"

    Man kann hier also nur noch einen (zusätzlichen) Benutzer anlegen und den Namen des Servers angeben (AVM-Standard ist namenlos).
    Wer einen Master Browser o.ä. aufsetzen will, kann das immer noch direkt unter erweitert machen ...

    Der letzte Abschnitt sieht jetzt so aus:
    Code:
    if [ -d /var/media/ftp ]; then
    sec_begin '$(lang de:"Standardfreigaben" en:"Default shares")'
    cgi_print_checkbox_p "avmshares" "$SAMBA_AVMSHARES" "$(lang de:"AVM-Freigabe behalten" en:"Keep AVM standard share")"
    cgi_print_checkbox_p "readonly" "$SAMBA_READONLY" "$(lang de:"Freigaben sind nur lesbar" en:"Shares are only readable")"
    sec_end
    fi

  • /etc/default.samba/samba_conf umgeschrieben

    Diese sieht nun so aus:
    Code:
    #!/bin/sh
    
    USERS=$(cat /var/tmp/samba/lib/smb.conf | grep "username" | grep "boxusr10"),root
    if [ -z "$USERS" ]; then
        USERS=" username = boxusr10,root"
    fi
    VUSERS=$(cat /var/tmp/samba/lib/smb.conf | grep "valid users" | grep "boxusr10"),root
    if [ -z "$VUSERS" ]; then
        VUSERS=" valid users = boxusr10,root"
    fi
    
    echo "### global"
    
    cat << EOF
    [global]
    netbios name = $SAMBA_NETBIOS_NAME
    workgroup = $(ctlmgr_ctl r ctlusb settings/samba-workgroup)
    server string = $(ctlmgr_ctl r ctlusb settings/samba-server-string)
    syslog = 0
    username map = /mod/etc/samba/users.map
    smb passwd file = /var/tmp/smbpasswd
    encrypt passwords = true
    passdb backend = smbpasswd
    obey pam restrictions = yes
    socket options = TCP_NODELAY
    unix charset = UTF8
    max stat cache size = 64
    mangled names = no
    security = user
    guest account = $SAMBA_SYSTEMUSER
    null passwords = yes
    EOF
    
    echo "### expert"
    
    [ -r "/tmp/flash/samba/sharesx" ] && cat /tmp/flash/samba/sharesx
    
    echo "### default"
    
    if [ "$SAMBA_AVMSHARES" == "yes" ]; then
    	echo "[$(ctlmgr_ctl r ctlusb settings/fritznas_share)]"
    	echo " path = /var/media/ftp"
    	echo " read only = $SAMBA_READONLY"
    	echo "$USERS"
    	echo "$VUSERS"
    	echo " create mask = 0777"
    	echo " force create mode = 0777"
    	echo " directory mask = 0777"
    	echo " force directory mode = 0777"
    fi
    
    echo "### shares"
    
    if [ -r "/tmp/flash/samba/shares" ]; then
    	cat /tmp/flash/samba/shares | grep -v "^#" | while read -r path name gk ro options comment; do
    		if [ -n "$path" -a -n "$name" -a -d "$path" ]; then
    			case $gk in
    				1|y|yes|Y|YES)  gk="yes" ;;
    				0|n|no|N|NO|"") gk="no"  ;;
    			esac
    			case $ro in
    				1|y|yes|Y|YES)  ro="yes" ;;
    				0|n|no|N|NO|"") ro="no"  ;;
    			esac
    			if  [ "$options" != "-" ]; then
    				options=$(echo "$options" | sed -r -e 's,=, = ,g;s,(%20| )+, ,g;')
    			else
    				options=""
    			fi
    			echo "$options" | grep -q "user =" >/dev/null 2>&1 || options="$options,user = $SAMBA_SYSTEMUSER"
    			options=$(echo -e "${options//,/\\n }")
    cat << EOF
    [${name//%20/ }]
     comment = $comment
     path = $path
     guest ok = $gk
     read only = $ro
     $options
    EOF
    		fi
    	done
    fi
    
    echo "### fin"
    Es wird im wesentlichen dieselbe Konfiguration geschrieben, die auch AVMs samba_config_gen generiert und die Einstellung SAMBA_AVMSHARES macht jetzt was Logisches, nämlich bestimmen, ob auch die Standard-Freigabe mit übernommen werden soll oder nur welche aus Freetz.

    Hier wäre wohl noch Arbeit nötig, denn das funktioniert mit einiger Sicherheit so nur auf aktuellen Firmwares. Für die alten Versionen müssen die Einstellungen ggf. anders ermittelt werden.
    Ich habe auch etwas quick and dirty gepfuscht, um dem User root Zugriff auf die AVM-Freigabe zu ermöglichen, das kann man eleganter machen.
  • rc.samba verkleinert
    Die Funktionen
    create_rc()
    do_smbd()
    do_nmbd()
    wurden zu dummy-Funktionen reduziert ( { return; } ).
  • etc/default.samba/samba.save verkleinert
    Enthält nur noch
    Code:
    apply_changes()
    {
    	/etc/samba_control reconfig_pw
    }
    AVMs samba_control ruft ja nun während seiner Funktion reconfig_pw auch rc.samba config auf ...

Ergebnis:
Es wird weiterhin eine eigene Konfiguration für den Samba von Freetz benutzt (In /mod/etc/samba), diese entspricht aber nahezu 1:1 der Konfiguration, die auch AVMs Samba verwendet hätte, inklusive der Übernahme der diversen Boxuser-Rechte (Die es wohl erst seit Fritz!OS 5 gibt) in die AVM-Freigabe.
Prinzipiell könnte man dieses Verfahren auch anwenden, wenn Freetz gar keinen Samba baut, sondern den AVM-Samba drin läßt. Es müßte dann nur die umgeschriebene Konfiguration wieder dorthin verlinkt werden, wo AVMs smbd/nmbd sie erwartet oder man paßt die Startscripte so an, daß der Parameter "-s /var/mod/etc/samba/smb.conf" verwendet wird.
Dann würde sich Freetz nämlich wieder so verhalten, wie im Freetz-Wiki beschrieben.

Todo:
Die Boxuser werden zwar mit ihren Rechten in die AVM-Freigabe übernommen, fehlen aber in users.map und smbpasswd.
Das folgende Script erzeugt die beiden Dateien on-the-fly:
Code:
#!/bin/ash

USERS=$(allcfgconv -C ar7 -c -o - | sed -n -e '/boxusers/,/^}/p' | egrep 'id|name|password' | grep -v 'remote_access' | sed -e 's/^[ \t]*//')

echo -e "$USERS" | awk '
BEGIN { RS = ";[:space:\n]*id = " ; FS = "\n" }
	{
		id = $1
		name = $2
		pass = $3
		sub (/id = /, "", id)
		sub (/name = /, "", name)
		sub (/password = /, "", pass)
		sub (/;/, "", id)
		sub (/;/, "", name)
		sub (/;/, "", pass)
		print "!boxusr" id " = " name
     }
' > /var/media/ftp/tools/samba/users.test

echo -e "$USERS" | awk '
BEGIN { RS = ";[:space:\n]*id = " ; FS = "\n" }
	{
		id = $1
		name = $2
		pass = $3
		sub (/id = /, "", id)
		sub (/name = "/, "", name)
		sub (/password = "/, "", pass)
		sub (/";/, "", id)
		sub (/";/, "", name)
		sub (/";*/, "", pass)
		sysid=id+1000
		if (name == "ftpuser") {
			print "root:0:" pass ":[UX         ]:LCT-00000001:"
		}
		print "boxusr" id ":" sysid ":" pass ":[UX         ]:LCT-00000001:"
     }
' > /var/media/ftp/tools/samba/smbpasswd.cleartext

Der Inhalt dieses Scripts, vermutlich läßt sich das auch wesentlich eleganter lösen, müßte noch in die samba_conf eingebaut werden, damit nicht nur der in Freetz konfigurierte User mitmachen darf, sondern auch die Boxuser (In alten Firmwares ggf. der ftpuser).

Danach wäre das Ergebnis folgendes:
Wenn nichts in der Samba-Konfiguration von Freetz eingestellt ist, verhält sich Samba, egal ob das von AVM oder von Freetz, exakt so wie AVMs Samba. Nichts was von Samba abhängt müßte mehr aus AVMs Weboberfläche rausgeschnippselt werden!
Über die Seite "Konfiguration" könnte der Server einen Namen kriegen und ein zusätzlicher User (Mit root-Rechten) angelegt werden.
Mehr wird meines Erachtens auch selten benötigt.

Profi-Einstellungen könnte man nach wie vor "händisch" auf der Seite "Samba -> erweitert" eintragen, auch solche, die AVMs Standardkonfiguration widersprechen, denn aus der Samba-Konfiguration wird bei widersprüchlichen Einstellungen die zuletzt vorgenommene verwendet. Trägt man also unter "erweitert"
username map = /var/media/ftp/tools/samba/users.map
smb passwd file = /var/media/ftp/tools/samba/smbpasswd
ein, dann werden die auch tatsächlich verwendet, obwohl in der übernommenen Konfiguration vorher etwas anderes steht!

Dementsprechend kann man dort auch immer noch Experten-Einstellungen wie
Code:
wins support = yes
dns proxy = yes
name resolve order = wins bcast host lmhosts
domain master = yes
local master = yes
vornehmen, etc. pp.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.