| #!/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) |
| |