[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Änderung von Namen und/oder IP-Adressen



Patrick Willam schrieb:
Peter Bounin schrieb:

In einem Eintrag (Jan-Aug 2005) hatte ich die Bemrkung
aufgeschnappt, daß irgendwer an einem Skript arbeiten
würde die IP-Adresse - dann "im Batch" - zu ändern.
Gibt es das Skript mittlwerweile?


Ich persoenlich weisz nur von Ansaetzen, aber nichts Fertigem.

Netzwerke laufen zwar mittels einer einfachen Logik,
allerdings kann man sehr komplexe Strukturen damit aufbauen.

Standardmaeszig benutzt unsere dhcpd.conf Namen statt Adressen.
Namensaenderungen --> DNS (bind9) und ggf.
                      DHCPD (dhcp3-server)
Adressaenderungen --> DNS (bind9) und ggf.
                      /etc/network/interfaces + /etc/resolv.conf
Zuordung MAC:Name --> DHCPD (dhcp3-server)

Falls man Adressen in seine dhcpd.conf eingebaut hat, dann muss
man dort statt Namen eben Adressen aendern (und es gilt MAC:Adr
statt MAC:Name).

Weil man mit Netzwerken komplexe Strukturen aufbauen/abbilden kann
spiegelt sich das im komplexen Aufbau der Konfigurationsdateien
fuer o.a. Netzwerk-Basisdienste wider.

Dies wiederum verlangt von einer Skriptautomatik ein 'Verstaendnis'
fuer diese Strukturen und auch ein hohes Masz an Flexibilitaet.
Kurz gesagt: ein Skript muesste /so gut wie/ intelligent sein.
Dies ist aueszerst anspruchsvoll und bisher nicht in einer Weise
realisiert worden, die frei verfuegbar ist.
Ich hab' ein kleines Skript beigefügt, daß dennoch sehr zuverlässig
entsprechende Änderungen im gesamten /etc durchführt (hat 'ne usage
und gibt ohnedies erst 'ne Warnung aus, bevor es losläuft.)


Daher kann z.Bsp. auch Webmin die Konfig.-Daten von DNS oder DHCP
nicht /so/ zu einem Interface aufbereiten, dasz diese verfummelungs-
sicher oder gar einfach zu bearbeiten waeren.
Hm, jein: mit der nur formalen Änderung (z.B. durch das Skript oder
von Hand) erreicht man für einen Skolelinux {Haupt-|Kombi-|Terminals-}
Server 95-98%. Aber es sind z.B. nur für den Namen des Servers (tjener)
23 Dateien unterhalb /etc zu ändern - da lohnt sich dann ein verläss-
lichliches Skript allemal:
zeus:~# egrep -rl '\bzeus\b' /etc
/etc/motd
/etc/adduser.conf
/etc/exim4/exim4.conf
/etc/cfengine/debian-edu/cf.homes
/etc/cfengine/debian-edu/cf.homes.dpkg-old
/etc/cfengine/debian-edu/cf.amanda
/etc/bind/debian-edu/db.edu.myskole.tld
/etc/bind/debian-edu/db.10
/etc/exim/exim-ldap-server.conf
/etc/ldap/autofs.ldif
/etc/ldap/netgroup.ldif
/etc/samba/netlogon/login.bat
/etc/samba/smb.conf
/etc/samba/smb-debian-edu.conf
/etc/slbackup/slbackup.conf
/etc/dhcp3/dhcpd.conf
/etc/dhcp3/dhcpd-debian-edu.conf
/etc/hostname
/etc/hosts
/etc/ssh/ssh_host_rsa_key.pub
/etc/ssh/ssh_host_dsa_key.pub
/etc/exports
/etc/webmin/ldap-users/config
zeus:~# egrep -rl '\bzeus\b' /etc | wc -l
23
zeus:~#
Wie gesagt, allein die Änderung des Rechnernamens (ich hab'
halt mal zum Spaß "tjener" in "zeus" umbenannt). Dauert aber
Dank des Skriptes ca. 10 Sekunden und in diesem Fall braucht
dann wirklich nichts mehr zusätzlich gemacht werden, d.h.,
Handarbeit wäre sogar eher gefährlicher).
Die Domain "intern" würde ich - sorry - als etwas unglücklich
bezeichnen, da die Zeichenfolge in vielerlei Kombinationen
auch noch anderweitig verwendet wird, habe ich also mit dem
selben Skript in 10 Sekunden mal zum Spaß in "edu.myskole.tld"
umbenannt:
zeus:~# egrep -rl '\bedu.myskole.tld\b' /etc | wc -l
24
zeus:~#
"Spannender" wird's mit IP-Adressen:
zeus:~# egrep -rl '\b192.168.3\b' /etc | wc -l
13
zeus:~# (Ja, ich hab' das 10.0.2* auch nur zum Spaß in 192.168.3* umbenannt.)
Und hierbei muß wirklich Handarbeit an:
zeus:/etc/bind/debian-edu# l
insgesamt 10
-rw-r--r--  1 root root  902 2005-08-08 10:09 db.10
-rw-r--r--  1 root root  369 2005-08-07 22:24 db.192.168
-rw-r--r--  1 root root 1674 2005-08-08 10:04 db.edu.myskole.tld
-rw-r--r--  1 root root 2475 2005-08-07 19:41 named-bind8.conf
-rw-r--r--  1 root root 2709 2005-08-07 20:32 named-bind9.conf
zeus:/etc/bind/debian-edu# zeus:/etc/dhcp3# l
insgesamt 40
drwxr-xr-x  2 root root  1024 2005-08-05 11:49 dhclient-enter-hooks.d
lrwxrwxrwx  1 root root    32 2005-08-05 11:50 dhcpd.conf -> /etc/dhcp3/dhcpd-debian-edu.conf
-rw-r--r--  1 root root 38652 2005-08-08 10:08 dhcpd-debian-edu.conf
zeus:/etc/dhcp3#
angelegt werden (bis auf named-bind8.conf und dhcpd-debian-edu.conf).

Alles in allem (IMHO): derartige Änderungen nicht automatisiert durch-
zuführen wäre viel gefährlicher als umgekehrt. (Ich hatte zwischendrin
mal den Fehler gemacht und die NETMASK für das 10.0.2er auf 255.255.2555.0
ändern lassen (anstelle 255.255.255.0). Daraufhin hat ifup sich
zurecht beschwert und nach nochmal 10 Sekunden war's wieder gut.
Wer z.B. im vi in diversen Dateien dafür das .-Kommando verwendet oder
im Webmin im entsprechenden Eingabefeld womöglich mit Cut&Paste eine
solchen Fehler macht, steht anschließend deutlich hilfloser da.)



Was viel leichter zu realisieren ist, waere ein Skript was eine
bestimmte und nicht allzu komplexe Netzwerkstruktur 'kennt', und
dann die erforderlichen Konfig.-Dateien ausspuckt, nachdem es die
Wie gesagt, wir sprechen hier als System- und/oder Netzwerkadminstratoren;
deshalb meine ich, daß das (Skript) gar nie die "richtige" Netzwerkstruktur
kennen würde und deshalb - IMHO - Skolelinux eher die Möglichkeit zur
Änderungen der zugrundezulegenden Struktur, denn eine "richtige" Struktur
bereitstellen sollte.


Schlussendlich kann ich nur erstmal zurueckfragen:
Was fuer eine Aenderung soll der von dir angefragte Automatismus denn
bewerkstelligen? ...Dabei waere etwas mehr Genauigkeit als "[irgend-]eine
IP-Adresse" sehr hilfreich.
Er sollte halt die IP-Adressen für die Skolelinux- (Sub-) Netze ändern.
Wirklich genau das.

http://www.lugbz.org/documents/smart-questions_de.html#beprecise   (s.u.)

Nur so koennen auch _konkret_ Skripte geschrieben und getestet werden.
Anderenfalls bleibt nur die Moeglichkeit ein Dutzend Skripte ins Blaue
hinein zu schreiben, und die dann halbgar unters Volk zu werfen; ggf.
mit der Resonanz, dasz die bereitstehenden Skripte gar nicht fuer die
Faelle sind, die Skolelinux-Tester/-Einrichter haben wollen.
Ich seh' das ein klein wenig anders: entweder derjenige der die Skole-Netze
betreibt hat von IP-Netzen so gut wie keine Ahnung (muß er auch nicht!),
dann bleiben die Netze so, wie die Installation dies anlegt.
Hat er aber 'ne Ahnung, dann weiß er auch (einigermaßen) was er tut und
braucht dann weniger ein möglichst umfassendes Schema, denn die Möglichkeit
dies zu ändern (verlässlich und vielseitig, aber halt ohne Schema).

Konkrete Netze sind eher verschieden als dasz sie gleichartig sind.
Und selbst bei den Gleichartigen ist es nicht immer Dasselbe.
Wenn es eine einfach Loesung gaebe, dann gaebe "es da auch schon was
von Ratiopharm". ;-)
...Traurig, aber wahr; und es aendert nichts an der Sache.
Naja, ich denke wir sind uns einig, daß es gar keine "richtige" Lösung
(vorgefertigt) geben kann, oder? Und genau deshalb hatte ich nach Hilfs-
mitteln für Änderungen gefragt.


Mit besten Grueszen,
  Patrick


Grüße für einen guten Wochenanfang!

Peter

P.S. Ich hab' keine Ahnung ob es überhaupt erlaubt ist Ahnhänge an die Liste
	zu schicken, falls diese abgewiesen werden, aber jemand dennoch einen
	Blick draufwerfen möchte, kann er sich ja nochmal melden.

P.P.S. Das Skript (steht in der usage (-?<-h|--help|-help)) ändert auch Datei-
	namen, sofern diese das entsprechende "Pattern" enthalten.
#! /bin/bash
#
# change any occurence of value <from> into new value <to>
# within "database" <dir> (directory including subdirectories).
# Additionally any file and directory name containing pattern
# <from> will be renamed into new file or directory name with
# <from> replaced by <to>.
# Assumption is, values of <from> (and <to>) - if given inside
# a file - are delimitted with any kind of word boundary (see
# ed(1) and/or egrep(1)).
# Furtheron only 'regular' files will be changed (excluding
# symbolic links) - see man test(1).
#
# Beware: anything herein is GPLed!
#
# (c) 2005 Peter Bounin
#

deffrom="intern"		# default value for <from>
defto="edu.myskole.tld"		# default value for <to>
defdir="/etc"			# default value for <dir>
waitsec=5			# seconds to wait for user interupt

shopt -s extglob		# enable +(...)
[[ "$1" == +(-h|-help|--help|-?) ]]  &&  {
	echo -e "usage: ${0##*/} [<from> [<to> [<dir>]]]" >&2
	echo -e "\t<from>\tvalue to be changed (${deffrom})" >&2
	echo -e "\t<to>\treplacement (${defto})" >&2
	echo -e "\t<dir>\t\"database\" (directory) (${defdir})" >&2
	echo >&2
	echo -e "Assumption is: <from> and (afterwards) <to>" >&2
	echo -e "inside files are delimitted with any kind of" >&2
	echo -e "word boundary (see man ed(1) and/or egrep(1))." >&2
	echo -e "Only 'regular' files (excluding symbolic links)" >&2
	echo -e "will be changed (see man test(1))." >&2
	echo >&2
	exit -1
}

from="${1:-$deffrom}"		# value to be changed
to="${2:-$defto}"		# replacement
dir="${3:-$defdir}"		# "database" to work on

echo
echo -e  "running ${0##*/} '${from}' '${to}' '${dir}'"
echo -e  "\tchanging any occurence of >${from}< within"
echo -e  "\tdirectory >${dir}< (and subdirectories) into new"
echo -e  "\tvalue >${to}<; ignoring symbolic links."
echo -ne "\tUse Ctrl-c (within ${waitsec} seconds) to interupt ...\a"
sleep ${waitsec}
echo -e  "\r\tPlease hold on ...                            \n"

for file in $(egrep -rl -D skip "\\b${from}\\b" "${dir}") ; do
	[[ ! -f "${file}"  ||  -L "${file}" ]]  &&  {
		echo -e "ignore\t${file} ... done"
		continue
	}
	echo -ne "change\t${file} ... "
	ed -s "${file}" <<-EOT >/dev/null 2>&1
		%s/\\(\\b\\)${from}\\(\\b\\)/\1${to}\2/g
		w
		q
	EOT
	rc=$?
	if [ ${rc} -eq 0 ] ; then
		echo "done"
	else	echo "maybe (rc=${rc}) done"
	fi
done
echo
echo -e  "\tchanging file/directory names containing pattern"
echo -e  "\t>${from}<; including symbolic links."
echo -e  "\r\tPlease hold on ...                            \n"
find "${dir}" -name '*'"${from}"'*' | while read file dummy ; do
	new="${file//$from/$to}"
	echo -ne "rename\t${file} --> ${new} ... "
	mv "${file}" "${new}"
	rc=$?
	if [ ${rc} -eq 0 ] ; then
		echo "done"
	else	echo "maybe (rc=${rc}) done"
	fi
done

Reply to: