Commit 899d2a81 authored by Michael Hanselmann's avatar Michael Hanselmann
Browse files

Add functions to modify /etc/hosts.

Reviewed-by: schreiberal
parent 59f82e3f
......@@ -20,6 +20,7 @@
"""Ganeti small utilities
"""
......@@ -745,6 +746,68 @@ def RemoveAuthorizedKey(file_name, key):
raise
def AddEtcHostsEntry(file_name, hostname, ip):
"""
"""
f = open(file_name, 'a+')
try:
nl = True
for line in f:
fields = line.split()
if len(fields) < 2 or fields[0].startswith('#'):
continue
if fields[0] == ip and hostname in fields[1:]:
break
nl = line.endswith('\n')
else:
if not nl:
f.write("\n")
f.write(ip)
f.write(' ')
f.write(hostname)
f.write("\n")
f.flush()
finally:
f.close()
def RemoveEtcHostsEntry(file_name, hostname):
"""
"""
fd, tmpname = tempfile.mkstemp(dir=os.path.dirname(file_name))
try:
out = os.fdopen(fd, 'w')
try:
f = open(file_name, 'r')
try:
for line in f:
fields = line.split()
if len(fields) > 1 and not fields[0].startswith('#'):
names = fields[1:]
if hostname in names:
while hostname in names:
names.remove(hostname)
if names:
out.write(fields[0])
out.write(' ')
out.write(' '.join(names))
continue
out.write(line)
out.flush()
os.rename(tmpname, file_name)
finally:
f.close()
finally:
out.close()
except:
RemoveFile(tmpname)
raise
def CreateBackup(file_name):
"""Creates a backup of a file.
......
......@@ -37,7 +37,8 @@ from ganeti import utils
from ganeti.utils import IsProcessAlive, Lock, Unlock, RunCmd, \
RemoveFile, CheckDict, MatchNameComponent, FormatUnit, \
ParseUnit, AddAuthorizedKey, RemoveAuthorizedKey, \
ShellQuote, ShellQuoteArgs, TcpPing, ListVisibleFiles
ShellQuote, ShellQuoteArgs, TcpPing, ListVisibleFiles, \
AddEtcHostsEntry, RemoveEtcHostsEntry
from ganeti.errors import LockError, UnitParseError
......@@ -431,6 +432,92 @@ class TestSshKeys(unittest.TestCase):
os.unlink(tmpname)
class TestEtcHosts(unittest.TestCase):
"""Test functions modifying /etc/hosts"""
def writeTestFile(self):
(fd, tmpname) = tempfile.mkstemp(prefix = 'ganeti-test')
f = os.fdopen(fd, 'w')
try:
f.write('# This is a test file for /etc/hosts\n')
f.write('127.0.0.1\tlocalhost\n')
f.write('192.168.1.1 router gw\n')
finally:
f.close()
return tmpname
def testAddingNewIp(self):
tmpname = self.writeTestFile()
try:
AddEtcHostsEntry(tmpname, 'myhost.domain.tld', '1.2.3.4')
f = open(tmpname, 'r')
try:
self.assertEqual(md5.new(f.read(8192)).hexdigest(),
'00e0e88250482e7449743c89a49e9349')
finally:
f.close()
finally:
os.unlink(tmpname)
def testAddingExistingIp(self):
tmpname = self.writeTestFile()
try:
AddEtcHostsEntry(tmpname, 'myhost.domain.tld', '192.168.1.1')
f = open(tmpname, 'r')
try:
self.assertEqual(md5.new(f.read(8192)).hexdigest(),
'4dc04c0acdd247175e0b980c6beea822')
finally:
f.close()
finally:
os.unlink(tmpname)
def testRemovingExistingHost(self):
tmpname = self.writeTestFile()
try:
RemoveEtcHostsEntry(tmpname, 'router')
f = open(tmpname, 'r')
try:
self.assertEqual(md5.new(f.read(8192)).hexdigest(),
'7d1e7a559eedbc25e0dff67d33ccac84')
finally:
f.close()
finally:
os.unlink(tmpname)
def testRemovingSingleExistingHost(self):
tmpname = self.writeTestFile()
try:
RemoveEtcHostsEntry(tmpname, 'localhost')
f = open(tmpname, 'r')
try:
self.assertEqual(md5.new(f.read(8192)).hexdigest(),
'ec4e4589b56f82fdb88db5675de011b1')
finally:
f.close()
finally:
os.unlink(tmpname)
def testRemovingNonExistingHost(self):
tmpname = self.writeTestFile()
try:
RemoveEtcHostsEntry(tmpname, 'myhost')
f = open(tmpname, 'r')
try:
self.assertEqual(md5.new(f.read(8192)).hexdigest(),
'aa005bddc6d9ee399c296953f194929e')
finally:
f.close()
finally:
os.unlink(tmpname)
class TestShellQuoting(unittest.TestCase):
"""Test case for shell quoting functions"""
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment