djbdns [was: Re: Zabezpeceni DNS [was: Re: Jednodisketova distribuce...]]
Veros Kaplan
veros-XXXX na tac.cz
Čtvrtek Říjen 17 11:05:41 CEST 2002
Jakub Maa01 Jirků wrote/napsal:
: >: 2) Povedlo se nekomu pridavat zaznamy z dncp do tinydns?
: >
: > Ano.
:
: A mohl bych se zeptat, jak? Jestli to ovsem neni tajne :)
Omlouvám se, je tam DNCP, což neznám.
DHCP mi chodí pěkně (mám na to skriptík). Není
dokumentovaný, ale funguje. Načte datový soubor dhcpd (z RH6.2),
proparsuje a vypíše z něho A záznamy (=něco) s přidanou doménou a hlavně
časem vypršení (a narozdíl od W2K korektním :-)
Je potřeba si to patřičně seskládat dohromady aby to generovalo
správný textový soubor (ale to už je jednoduché).
Pokud to někoho zajímá, tak skriptík přikládám.
Věroš Kaplan
--
Věroš Kaplan <veros @ tac . cz>
Tacoma Computers, Staňkova 18a, Brno, CZ http://www.tac.cz/
--
Názory v tomto mailu uvedené jsou moje vlastní a nemusí se shodovat
s názory mého zaměstnavatele.
--
"Co říkali?"
"Že jim ta tiskárna ve Windows vrže a že se na to máme podívat."
----
#!/usr/bin/env python
from shlex import shlex
from string import split,atoi,lower, replace
import time
BASEDOMAIN='home.koren.cz'
def convert_time(list):
"""Convert time from ("2","2002/04/19", "09:31:02") to UTC """
assert(len(list) == 3)
Y,M,D = map(atoi,split(list[1],'/'))
h,m,s = map(atoi,split(list[2],':'))
tup = (Y,M,D,h,m,s,0,0,1)
tm = time.mktime(tup)-time.altzone
# arrgh, why mktime creates date in localtime??
return long(tm)
def utc_to_tai(utc):
return lower(hex(long(utc) + 2l**62 + 10)[2:-1])
# 2 ** 62 - TAI shift
# -10 - TAIshift against UTC
def convert_time_key(dict, key, default = None):
if dict.has_key(key):
dict[key] = convert_time(dict[key])
elif default:
dict[key] = default
def read_lease(an):
addr = an.get_token()
beg = an.get_token()
assert beg == '{'
end = None
option = None
options = {}
params = None
while 1:
t = an.get_token()
if not t:
return None
if t == '}': # end of lease
if option:
options[option] = params
option = None
break
elif t == ';': # end of option
options[option] = params
option = None
elif not option:# new option
option = t
params = []
else: # add param
params.append(t)
convert_time_key(options, 'starts')
convert_time_key(options, 'ends')
try:
options['hostname'] = lower(options['client-hostname'][0][1:-1])
except KeyError:
split
options['hostname'] = 'unknown-%s' % replace(addr, '.', '-')
return addr,options
def parse(fname):
f = open(fname)
an = shlex(f)
an.quotes = '"';
an.wordchars = an.wordchars + './:-'
addr_now = None
leases = {}
while 1:
t = an.get_token()
if not t:
break
if t == 'lease':
addr,lease = read_lease(an)
leases[addr] = lease
del f
return leases
def generate_output(hosts):
hostnames = hosts.keys()
hostnames.sort()
for hostname in hostnames:
addr = hosts[hostname][0]
dead = utc_to_tai(hosts[hostname][2])
domain = BASEDOMAIN
print '=%(hostname)s.%(domain)s:%(addr)s:0:%(dead)s' % locals()
def main(fname):
leases = parse(fname)
hosts = {}
for addr in leases.keys():
hostname = leases[addr]['hostname']
deadtime = leases[addr]['ends']
starttime = leases[addr]['starts']
if '.' in hostname:
hostname = split(hostname, '.')[0]
if hosts.has_key(hostname):
if hosts[hostname][1] > starttime:
# two leases with same name? ugh.
continue
hosts[hostname] = (addr, starttime, deadtime)
generate_output(hosts)
if __name__ == '__main__':
main('/var/state/dhcp/dhcpd.leases')
Další informace o konferenci Linux