mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/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)
 | 
						|
 |