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