Script egysorosítása

Fórumok

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

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.

"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.

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

perl + hash
tökéletes....csak egyetlen egyszer fog benne szerepelni minden, ha a kulcsként használod a macaddress-t

"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.

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 :)

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.