web-dev-qa-db-ja.com

ISC-DHCP:dhcpスクリプトからホスト名を取得するための戦い

  • サーバーOS:Ubuntu 12.0.4.1 LTSサーバー
  • デスクトップOS:Ubuntu 12.0.4.1 LTSおよびWindows 7

Powerdnsデータベースの更新方法に関するネットの記事をフォローしました。 ISC DHCPおよびPowerDNS リースを要求しているクライアントのホスト名を取得するためにどのくらい戦いますか。ログファイルから、dhcpサーバーが(括弧内に)それを持っていることがわかります。

  • dhcpd:eth0を介した00:1c:c0:1c:1e:84(MINION)からの192.168.0.90のDHCPREQUEST
  • dhcpd:eth0経由で192.168.0.90から00:1c:c0:1c:1e:84(MINION)のDHCPACK

私の問題は、Host-decl-nameが値を保持していないという事実にあります。これは、クライアントの名前であるMINIONを保持すると考えていたでしょう。 dhcpd.confの実行でMINIONという名前をどのように取得しますか。 b.t.w.ミニオンはWindows 7マシンです。

私のdhcpd.conf:

 ddns-update-style none; 
 option domain-name "butylseal.int"; 
 option domain-name-servers 192.168.0.201、192.168.0.202; 
 default-lease-time 600; 
 max-lease-time 7200; 
 authoritative; 
 log-facility local7; 
 
 subnet 192.168。 0.0 netmask 255.255.255.0 {
 range 192.168.0.1 192.168.0.99; 
 option routers 192.168.0.249; 
 option netbios-name-servers 192.168.0.201; 
 option netbios-node-type 8; 
 on commit {
 log( "============= [START COMMIT] ========= ======= "); 
 log("ホスト名は: "); 
 log(Host-decl-name); 
 set ClientIP = binary- to-ascii(10、8、 "。"、リースアドレス); 
 set ClientMac = binary-to-ascii(16、8、 ":"、substring(hardware、1、6)); 
 log(concat( "Commit:IP:"、ClientIP、 "Mac:"、ClientMac、 "Hostname:"、Host-decl-name)); 
 execute( "/ etc/dhcp/dhcp-event "、" commit "、ClientIP、ClientMac、Host-decl-name); [.___ _。] log( "============ [END COMMIT] ================="); 
} 
 on release {
 log( "============ [START RELEASE] ==============="); 
 set ClientIP = binary-to-ascii(10、8、 "。"、リースアドレス); 
 set ClientMac = binary-to-ascii(16、8、 ":"、substring( hradware、1、6)); 
 log(concat( "Release:IP:"、ClientIP、 "Mac:"、ClientMac、 "Hostname:"、Host-decl-name)); 
 execute( "/ etc/dhcp/dhcp-event"、 "release"、ClientIP、ClientMace、Host-decl-name); 
 log( "=========== ENDリリース] ==================); 
} 
有効期限{
 log( "===== ====== [START EXPIRY] ================)=)); 
 set ClientIP = binary-to-ascii(10、8、 "。" 、リースアドレス); 
 set ClientMac = binary-to-ascii(16、8、 ":"、substring(hardware、1、6)); 
 log(concat( "Expiry: IP: "、ClientIP、" Mac: "、ClientMac、" Hostname: "、Host-decl-name)); 
 execute("/etc/dhcp/dhcp-event "、" expiry "、ClientIP、ClientMac); 
 log(" =========== [END EXPIRY] ================= "); 
} 
} 
 

実行するスクリプト:

#!/ usr/bin/env python 
 import MySQLdb 
 import os、sys 
 import pprint 
 pp = pprint.PrettyPrinter()
 
 mysql_Host = "localhost" 
 mysql_user = "mysqlUsr" 
 mysql_pass = "mySqlPass" 
 mysql_db = "mypdnsdb" 
 
 
 if(len(sys.argv)> 1):
 command = sys.argv [1] 
 clientIP = sys.argv [2] 
 clientMac = sys.argv [3] 
 hostname = sys.argv [4] 
 if command == "commit":
 pp.pprint( "commit")
 f = open( "/ tmp/leases"、 "a")
 s = "リース:%s〜%s\n"%(clientIP、hostname)
 f。 write(s)
 f.flush()
 f.close()
 db = MySQLdb.connect(Host = mysql_Host、user = mysql_user、passwd = mysql_pass、db = mysql_db )
 cursor = db.cursor()
 cursor.execute( "INSERT INTO records(domain_id、name、type、content、ttl、prio、change_date)VALUES(%s、%s、%) s、%s、%s、%s、UNIX_TIMESTAMP(NOW())) "、[1、hostname、" A "、clientIP、3600,0])
 cursor.close()
 db.commit()
 db.close()
 Elif command == "release":
 pp.pprint ( "release")
 f = open( "/ tmp/leases"、 "a")
 s = "リリース:%s from%\ n"%(clientIP、hostname)
 f.write(s)
 f.flush()
 f.close()
 db = MySQLdb.connect(Host = mysql_Host、user = mysql_user、passwd = mysql_pass、db = mysql_db)
 cursor = db.cursor()
 cursor.execute( "レコードから削除WHEREコンテンツ=%s AND名前=%s"、[clientIP、hostname])
 db.commit()
 db.close()
 Elif command == "expiry":
 pp.pprint( "expiry")
 f = open( "/ tmp/leases"、 "a")
 s = "期限切れ:%sからの%s\n"%(clientIP、hostname)
 f.write(s) 
 f.flush()
 f.close()
 db = MySQLdb.connect(Host = mysql_Host、user = mysql_user、passwd = mysql_pass、db = mysql_db)
 cursor = db.cursor()
 cursor.execute( "DELETE FROM records WHERE content =%s AND name =%s"、[clientIP、hostname])
 db.commit()
 db.close()
 

ありがとうございました
Mark Hollander

3
user108502

「最初に選択する値」があなたを助けることができると思います。次の方法でそれを行うことができます。set clientName = pick-first-value(オプションfqdn.hostname、オプションHost-name);

4
kron