Meg akarom tudni, hogy hány IP cím van kiosztva a dhcp pool-ból. Erre nem találtam jó megoldást, csak olyat, hogy töltsem le, fordítsam le, és majd jó lesz. Vagy nem.
Kalapáltam egy scriptet, ami a lease fájlt eszi: http://pastebin.com/5YF7Ehmh
A terv az, hogy a lease rekordjait egy sorba szedem, majd valahogy kibogarászom, hogy mennyi az épp foglalt. Sajnos a dokumentáció szerint egy adott lease akár többször is szerepelhet a fájlban, mivel mindig csak hozzáfűzi a változásokat. Szóval egy szimpla grep nem elég.
Ezért aztán arra fanyalodtam, hogy végigolvasom az egyes mac addresseket, és egyenként felírom az utolsó státuszát, majd megszámolom, hogy hány az aktív. Ez működik, nincs vele nagy bajom. Viszont zabbix alatt az lenne a kényelmes, ha system.run-nal tudnék futtatni egy viszonylag egysoros parancsot, még ha bonyolultat is. De az én megoldásom nem ilyen, és belefáradtam az awk matatásába, de valaki hozzáértőnek hátha van jó megoldása erre. Nem beszélve a tr -d meg a grep \: esetleges kiváltásáról.
Minta dhcpd.leases: http://pastebin.com/H7U07WeZ
- 3117 megtekintés
Hozzászólások
Hello!
Par eszrevetel:
- ha valtozoba akarod feltolteni a mac-ek allapotat (binding state active), akkor elotte kellene leszurni az aktivakat, mert igy ha kovetkezo sorban ujra szerepel a mac csak nem active statusszal akkor az felul fogja irni
- az hogy binding state active meg nem feltetlenul jelenti, hogy valoban aktiv, konnyen lehet hogy talalsz az aktivak kozt olyat aminek mar lejart a lease time-ja igazabol csak a kliens nem kuldott release-t es meg van szabad ip a tartomanyban igy dhcp szerver nem szabaditotta fel, de szukseg eseten kiosztja (mondjuk ez fugg azt hiszem a max lease time ertektol is, hogy azon is tul van-e mar), szoval lehet active helyett/mellett az end time-ot is nezni kellene.
- azzal nem kalkulaltal, hogy ha tobb subneted van akkor ossze kellene hasonlitani, hogy melyik lease melyik subnetben van es igy minden subnetben nezve van-e szabad, de ez csak akkor szamit ha tobb subnetet definialtal es akkor is szamolni kell azzal, hogy lease file-ban nincs egyertelmuen az adott lease melyik subnetbol van, csak ip alapjan parosithatod manualisan.
- ha elegendo azt nezni hogy binding state active akkor talan van egyszerubb megoldas is, nem mondom hogy szep, de egyszerubb mint file-ba kiiratni es valtozokban taroltatni: grep -A 3 "^[ ]*binding state active;$" dhcpd.leases | grep "hardware ethernet" | sort -u |wc -l
- ha elegendo ha arrol kapsz ertesitest, hogy valakinek nem jutott eppen ip (es nem akarsz elore figyelmeztetest ha mar csak 10 szabad ip van), akkor lehet egyszerubb lenne logot figyelni no free leases uzenet utan akar egy logcheck-el.
--
Don't Panic if you see me laughing,
that's not a bug, just a feature.
- A hozzászóláshoz be kell jelentkezni
"ha valtozoba akarod feltolteni a mac-ek allapotat (binding state active), akkor elotte kellene leszurni az aktivakat, mert igy ha kovetkezo sorban ujra szerepel a mac csak nem active statusszal akkor az felul fogja irni"
Igen, ez volt a cél, lásd kiírás, ill. man dhcpd.leases.
"dhcp szerver nem szabaditotta fel, de szukseg eseten kiosztja "
Azaz ha a kliens IP-t kér, akkor aktívat, kap, nem újat, tehát nem "fogynak" az IP címek. Ez bevállalható kompromisszum.
Nincs több subnet.
"ha elegendo azt nezni hogy binding state active"
Nem elegendő, lásd kiírást, ill. man dhcpd.leases.
Nem elegendő, előre akarom látni a bajt, nem akkor, amikor már megtörtént.
- A hozzászóláshoz be kell jelentkezni
Ezt nézted?
http://dhcpd-pools.sourceforge.net/
Most nézem, hogy erre gondolhattál. Érdekes, nekem egy perl-es verzió van belőle...
Meg is van:
http://folk.uio.no/trondham/software/dhcpd-pool.html
- A hozzászóláshoz be kell jelentkezni
Igen, de mint íram, épp ezek a nem jók. Scriptet írni én is tudok, de azt is ki kell tenni a gépre, és épp ezt nem akarom.
- A hozzászóláshoz be kell jelentkezni
Hasznalj dnsmasq-ot, annak ilyen a formatuma:
1349238548 00:25:90:3d:0f:58 10.0.0.128 build0 *
1349230101 00:25:90:3d:10:14 10.0.0.138 build4 *
1349209180 00:27:0e:26:a0:e4 10.0.0.30 sungift *
1349236250 00:25:90:3d:0f:30 10.0.0.132 build1 *
Igy elsore azt latom, h duplikacio sincs benne.
tompos
- A hozzászóláshoz be kell jelentkezni
Végül is használhatnék, tudja matatni a bind zónákat úgy, mint a isc dhcpd?
- A hozzászóláshoz be kell jelentkezni
Passz, annak magad kell utana jarnod:)
tompos
- A hozzászóláshoz be kell jelentkezni
perl + hash
tökéletes....csak egyetlen egyszer fog benne szerepelni minden, ha a kulcsként használod a macaddress-t
- A hozzászóláshoz be kell jelentkezni
Így is egyszer szerepel, mert indexként használom a mac-t.
- A hozzászóláshoz be kell jelentkezni
"Szóval egy szimpla grep nem elég."
Anélkül, hogy kellő mennyiségű koffein hiányában holisztikusan nézném a problémádat, és hogy biztos volnék abban, hogy értem ezt a részét (egy feldolgozandó kimenet többet érne, mint egy önbevallottan túlterhelt szkript*):
grep ..... | tail -1
awk-ban pedig kb. igy, egy processzben:
BEGIN {
IPMEZO = ? # add meg
STATUSZMEZO = ? # ezt is
}
{
statuszok[ $IPMEZO ] = $STATUSZMEZO
}
END {
for (ip in statuszok) {
print ip, statuszok[ ip ]
}
}
* Annyit azért első blikkre sem tudok nem elmondani, hogy az awk sub(), gsub(), gensub() függvényeivel tökéletesen kiváltható a tr.
Egyébként pedig ha már az awk dokumentációjának matatásába belefáradsz, akkor meg fog még gyűlni a bajod, mert ennél kevesebb elemű nyelv és ennél rövidebb nyelvi leírás tán nem is létezik.
- A hozzászóláshoz be kell jelentkezni
Jogos, itt a forrásadat egy része: http://pastebin.com/H7U07WeZ
- A hozzászóláshoz be kell jelentkezni
Ezt tudtam erre összehozni:
awk -vRS='[\n;]+' '/^lease/ { IP=$2}; /binding state/ { state=$3; states[IP]=state}; END { for (ip in states) { ++sum[states[ip]]}; for (state in sum) { printf "%s=%d ", state, sum[state]}; print "" }'
- A hozzászóláshoz be kell jelentkezni
Jónak tűnik, mert ugyanazt adja mint amit én írtam, most megkísérlem megérteni :)
Köszi!
---
Javítanom kellett rajta:
/binding state/ -> /^ binding state/
, mert amúgy a next binding state-t számolta, és nem szép üzenetet írt ki; marha voltam, a mintában nincs active lease, ami ilyen:
lease 172.16.0.194 {
starts 2 2012/10/02 09:00:51;
ends 2 2012/10/02 19:00:51;
cltt 2 2012/10/02 09:00:51;
binding state active;
next binding state free;
hardware ethernet 1c:6f:65:c3:b5:eb;
uid "\001\034oe\303\265\353";
set ddns-rev-name = "194.0.16.172.in-addr.arpa.";
set ddns-txt = "31231ca39f9ed8c217fc160e8bcaacd3ce";
set ddns-fwd-name = "wkso92.in.c3d.hu.";
client-hostname "wkso92";
}
---
Ez az egy példa hasznosabb volt a számomra mint a tegnapi összes dokumentáció olvasás, már csak ezért is köszi :)
- A hozzászóláshoz be kell jelentkezni
Nincs mit.
Igen, a minta sor elejére rögzítése jó - én is megtettem volna, csak nem voltam biztos abban, hogy szóköz-e, ami annak látszik, és karakterlistával nem akartam tupírozni -, és ennél hosszabb és nagyobb számosságú rekordhalmaznál kötelező, ha meg lehet tenni, mert drámai gyorsulást tud hozni.
- A hozzászóláshoz be kell jelentkezni