scripts/network/exdhcp/dhcpd_edithosts.py (87 lines of code) (raw):

#!/usr/bin/python # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # Usage: dhcpd_edithosts.py mac ip hostname dns gateway nextserver import sys, os from os.path import exists from time import sleep from os import remove usage = '''dhcpd_edithosts.py mac ip hostname dns gateway nextserver''' conf_path = "/etc/dhcpd.conf" file_lock = "/etc/dhcpd.conf_locked" sleep_max = 20 host_entry = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; filename "pxelinux.0";}' host_entry1 = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; next-server %s; filename "pxelinux.0";}' def lock(): if exists(file_lock): count = 0 while(exists(file_lock)): sleep(1) count = count + 1 if count > sleep_max: print "Can not get file lock at %s, time expired" % file_lock return False try: f = open(file_lock, "w") f.close() return True except IOError,e: print "Cannot create file lock at /etc/dhcpd.conf_locked,", e return False def unlock(): if exists(file_lock) == False: print "Cannot find %s when unlocking, race condition happens" % file_lock else: try: remove(file_lock) return True except IOError, e: print "Cannot remove file lock at %s" % file_lock return False def insert_host_entry(mac, ip, hostname, dns, gateway, next_server): if lock() == False: return 1 cmd = 'sed -i /"fixed-address %s"/d %s' % (ip, conf_path) ret = os.system(cmd) if ret != 0: print "Command %s failed" % cmd unlock() return 1 cmd = 'sed -i /"hardware ethernet %s"/d %s' % (mac, conf_path) ret = os.system(cmd) if ret != 0: print "Command %s failed" % cmd unlock() return 1 if next_server != "null": entry = host_entry1 % (hostname, mac, ip, dns, "cloudnine.internal", gateway, next_server) else: entry = host_entry % (hostname, mac, ip, dns, "cloudnine.internal", gateway) cmd = '''echo '%s' >> %s''' % (entry, conf_path) ret = os.system(cmd) if ret != 0: print "Command %s failed" % cmd unlock() return 1 cmd = 'service dhcpd restart' ret = os.system(cmd) if ret != 0: print "Command %s failed" % cmd unlock() return 1 if unlock() == False: return 1 return 0 if __name__ == "__main__": if len(sys.argv) < 7: print usage sys.exit(1) mac = sys.argv[1] ip = sys.argv[2] hostname = sys.argv[3] dns = sys.argv[4] gateway = sys.argv[5] next_server = sys.argv[6] if exists(conf_path) == False: conf_path = "/etc/dhcp/dhcpd.conf" if exists(conf_path) == False: print "Cannot find dhcpd.conf" sys.exit(1) ret = insert_host_entry(mac, ip, hostname, dns, gateway, next_server) sys.exit(ret)