stack.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import string
  5. import subprocess
  6. # Translations
  7. MSG_HOSTNAME = {
  8. "en": "Hostname contains invalid characters: '%s'",
  9. "tr": "Makine ismi geçersiz karakterler içeriyor: '%s'",
  10. "fr": "Le nom d'hôte contient des caractères invalides: '%s'",
  11. "nl": "Hostnaam bevat ongeldige lettertekens: '%s'",
  12. }
  13. # Translations End
  14. HEADER_DEFAULT = """# Default DNS settings
  15. #
  16. """
  17. HEADER_DYNAMIC = """# This file is automatically generated by COMAR
  18. # Use network-manager to set default DNS settings or edit "resolv.default.conf"
  19. #
  20. # Bu dosya COMAR tarafından otomatik olarak üretilir.
  21. # Öntanımlı DNS ayalarını değiştirmek için network-manager uygulamasını kullanın
  22. # veya "resolv.default.conf" dosyasını düzenleyin.
  23. #
  24. """
  25. MAX_SERVERS = 3
  26. HOST_CHARS = string.ascii_letters + string.digits + '.' + '_' + '-'
  27. NAME_PATH = "/etc/env.d/01hostname"
  28. CMD_ENV = "/sbin/update-environment"
  29. HOSTS_PATH = "/etc/hosts"
  30. RESOLV_USER = "/etc/resolv.default.conf"
  31. RESOLV_PISILINUX = "/usr/share/baselayout/resolv.conf"
  32. def getSearchDomain():
  33. if not os.access(RESOLV_USER, os.R_OK):
  34. return None
  35. for line in file(RESOLV_USER):
  36. line = line.strip()
  37. if line.startswith("search"):
  38. return line.split()[1]
  39. return None
  40. def getPisiLinuxNameServers():
  41. servers = []
  42. if not os.access(RESOLV_PISILINUX, os.R_OK):
  43. return servers
  44. for line in file(RESOLV_PISILINUX):
  45. line = line.strip()
  46. if line.startswith("nameserver"):
  47. ip = line.split()[1]
  48. if ip not in servers:
  49. servers.append(ip)
  50. return servers
  51. # Network.Stack methods
  52. def getNameServers():
  53. servers = []
  54. if not os.access(RESOLV_USER, os.R_OK):
  55. return servers
  56. for line in file(RESOLV_USER):
  57. line = line.strip()
  58. if line.startswith("nameserver"):
  59. ip = line.split()[1]
  60. if ip not in servers:
  61. servers.append(ip)
  62. return servers
  63. def setNameServers(nameservers, searchdomain):
  64. f = file("/etc/resolv.default.conf", "w")
  65. f.write(HEADER_DEFAULT)
  66. for server in nameservers:
  67. f.write("nameserver %s\n" % server)
  68. if searchdomain:
  69. f.write("searchdomain %s\n" % searchdomain)
  70. f.close()
  71. def useNameServers(nameservers, searchdomain):
  72. # Append default name servers
  73. nameservers.extend(getNameServers())
  74. nameservers.extend(getPisiLinuxNameServers())
  75. servers = []
  76. for server in nameservers:
  77. if server not in servers:
  78. servers.append(server)
  79. f = file("/etc/resolv.conf", "w")
  80. f.write(HEADER_DYNAMIC)
  81. for server in servers[:MAX_SERVERS]:
  82. f.write("nameserver %s\n" % server)
  83. if searchdomain:
  84. f.write("search %s\n" % searchdomain)
  85. elif getSearchDomain():
  86. f.write("search %s\n" % getSearchDomain())
  87. f.close()
  88. def registerNameServers(iface, nameservers, searchdomain):
  89. useNameServers(nameservers, searchdomain)
  90. def unregisterNameServers(iface, nameservers, searchdomain):
  91. # Remove nameservers from list
  92. nameservers = getNameServers()
  93. for server in nameservers:
  94. try:
  95. nameservers.remove(server)
  96. except ValueError:
  97. pass
  98. # Set search domain to "" if it's active one
  99. if searchdomain == getSearchDomain():
  100. searchdomain = ""
  101. useNameServers(nameservers, searchdomain)
  102. def flushNameCache():
  103. pass
  104. def getHostName():
  105. cmd = subprocess.Popen(["/usr/bin/hostname"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  106. a = cmd.communicate()
  107. if a[1] == "":
  108. return a[0].rstrip("\n")
  109. return ""
  110. def setHostName(hostname):
  111. if not hostname:
  112. return
  113. invalid = filter(lambda x: not x in HOST_CHARS, hostname)
  114. if len(invalid) > 0:
  115. fail(_(MSG_HOSTNAME) % ("".join(invalid)))
  116. # hostname
  117. if os.path.exists(NAME_PATH):
  118. import re
  119. f = file(NAME_PATH)
  120. data = f.read()
  121. f.close()
  122. data = re.sub('HOSTNAME="(.*)"', 'HOSTNAME="%s"' % hostname, data)
  123. else:
  124. data = 'HOSTNAME="%s"\n' % hostname
  125. f = file(NAME_PATH, "w")
  126. f.write(data)
  127. f.close()
  128. # hosts
  129. f = file(HOSTS_PATH)
  130. data = f.readlines()
  131. f.close()
  132. f = file(HOSTS_PATH, "w")
  133. flag = 1
  134. for line in data:
  135. if line.startswith("127.0.0.1"):
  136. line = "127.0.0.1 localhost %s\n" % hostname
  137. flag = 0
  138. f.write(line)
  139. if flag:
  140. f.write("127.0.0.1 localhost %s\n" % hostname)
  141. f.close()
  142. # update environment
  143. os.system(CMD_ENV)