Advertisement
Guest User

Untitled

a guest
Aug 28th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.16 KB | None | 0 0
  1. #!/usr/local/bin/python
  2. from subprocess import call
  3. from subprocess import Popen
  4. from subprocess import PIPE
  5. import re
  6. import winrm
  7. import sys
  8. import time
  9.  
  10. settings = {
  11. "manage_ovf": "/Users/you/packer-virtualbox-iso-1468762258.ovf",
  12. "ad_ovf": "/Users/you/packer-virtualbox-iso-1468684516.ovf",
  13. "internal_network_name": "adintnet",
  14. "adserver_name": "core-2012r2-active-directory",
  15. "manage_name": "server-2012r2-manage-ad",
  16. "ad_server_ip": "192.168.0.225",
  17. "ad_server_computername": "DC",
  18. "domainname": "sandbox.local",
  19. "netbiosname": "SANDBOX",
  20. "manage_ad_ip": "192.168.0.110",
  21. "manage_ad_computername": "ADMANAGE"
  22. }
  23.  
  24. def vm_dict(line):
  25. vm_line_re = re.compile('"(?P<name>[^"]+)" \\{(?P<id>[^}]+)\\}')
  26. p = vm_line_re.match(line)
  27. if p == None:
  28. return None
  29. return {
  30. "name": p.group('name'),
  31. "id": p.group('id')
  32. }
  33.  
  34. def list_vms():
  35. vm_list = Popen(["VBoxManage","list","vms"], stdin=PIPE, stdout=PIPE)
  36. out, err = vm_list.communicate(input='\n'.encode())
  37. lines = out.split('\n')
  38. return [vm_dict(l) for l in lines if vm_dict(l) != None]
  39.  
  40. def list_running_vms():
  41. vm_list = Popen(["VBoxManage","list","runningvms"], stdin=PIPE, stdout=PIPE)
  42. out, err = vm_list.communicate(input='\n'.encode())
  43. lines = out.split('\n')
  44. return [vm_dict(l) for l in lines if vm_dict(l) != None]
  45.  
  46. def is_running(vm_name):
  47. running_vms = list_running_vms()
  48. matching_vms = [vm for vm in running_vms if vm["name"] == vm_name]
  49. return any(matching_vms)
  50.  
  51. def start_vm(vm_name):
  52. p = Popen(["VBoxManage","startvm",vm_name], stdin=PIPE, stdout=PIPE)
  53. out, err = p.communicate(input='\n'.encode())
  54.  
  55. def vm_exists(vm_name):
  56. vms = list_vms()
  57. results = [vm for vm in vms if vm["name"] == vm_name]
  58. return any(results)
  59.  
  60. def import_vm(ovf_path,name):
  61. vm_import = Popen(["VBoxManage","import",ovf_path,"--vsys","0","--vmname",name], stdin=PIPE, stdout=PIPE)
  62. out, err = vm_import.communicate(input='\n'.encode())
  63. print out
  64.  
  65. def vm_info(vm_name):
  66. info = Popen(["VBoxManage","showvminfo",vm_name], stdin=PIPE, stdout=PIPE)
  67. out, err = info.communicate(input='\n'.encode())
  68. setting_re = re.compile('(?P<key>[^:]+):\\s*(?P<value>.+)')
  69. lines = out.split('\n')
  70. result = {}
  71. for line in lines:
  72. m = setting_re.match(line)
  73. if m:
  74. result[m.group('key')] = m.group('value')
  75. return result
  76.  
  77. def forward_winrm_port(vm_name,external_port):
  78. p = Popen(["VBoxManage","modifyvm",vm_name,"--natpf1","guestwinrm,tcp,127.0.0.1," + str(external_port) + ",,5985"], stdin=PIPE, stdout=PIPE)
  79. out, err = p.communicate(input='\n'.encode())
  80. print out
  81.  
  82. def set_up_internal_network(vmname,internal_network_name):
  83. create_nic2 = Popen(["VBoxManage","modifyvm",vmname,"--nic2","intnet"],
  84. stdin=PIPE, stdout=PIPE)
  85. out, err = create_nic2.communicate(input='\n'.encode())
  86. print out
  87. set_network_name = Popen(["VBoxManage","modifyvm",vmname,"--intnet2",internal_network_name], stdin=PIPE, stdout=PIPE)
  88. out, err = set_network_name.communicate(input='\n'.encode())
  89. print out
  90.  
  91. def session_for_port(server_port, username = '', password = ''):
  92. if username == '':
  93. username = settings["username"]
  94. if password == '':
  95. password = settings['password']
  96. return winrm.Session('127.0.0.1:' + str(server_port), auth=(username,password))
  97.  
  98. def get_windows_features(server_port):
  99. s = session_for_port(server_port)
  100. r = s.run_ps("Get-WindowsFeature | Select Name, Installed")
  101. lines = r.std_out.split('\r\n')
  102. feature_re = re.compile('(?P<featurename>\S+)\s+(?P<installed>(False|True))')
  103. result = {}
  104. for l in lines:
  105. m = feature_re.match(l)
  106. if m:
  107. result[m.group('featurename')] = m.group('installed') == 'True'
  108. return result
  109.  
  110. def install_ad(server_port):
  111. print "Installing AD features"
  112. s = session_for_port(server_port)
  113. r = s.run_ps("""Add-WindowsFeature "RSAT-AD-Tools"
  114. Start-Job -Name addFeature -ScriptBlock {
  115. Add-WindowsFeature "AD-Domain-Services" -IncludeAllSubFeature -IncludeManagementTools
  116. Add-WindowsFeature "DNS" -IncludeAllSubFeature -IncludeManagementTools
  117. Add-WindowsFeature "GPMC" -IncludeAllSubFeature -IncludeManagementTools
  118. }
  119. Wait-Job -Name addFeature""")
  120. print r.std_out
  121.  
  122. def has_joined_ad_domain(server_port):
  123. s = session_for_port(server_port)
  124. r = s.run_ps('Get-ADDomain')
  125. return r.status_code == 0
  126.  
  127. def internal_ip_address(server_port):
  128. s = session_for_port(server_port)
  129. r = s.run_ps('Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias "Ethernet 2" | Select -ExpandProperty IPAddress')
  130. return r.std_out.split('\n')[0]
  131.  
  132. def change_ip_address(server_port, address):
  133. print "Changing IP address to " + address
  134. s = session_for_port(server_port)
  135. r = s.run_ps('$internalAdapter = Get-NetAdapter -Name "Ethernet 2"\r\n' +
  136. '$ipaddress = "' + address + '"\r\n' +
  137. '$ipprefix = 24\r\n' +
  138. '$ipgw = "192.168.0.1"\r\n' +
  139. '$ipdns = "' + settings["ad_server_ip"] + '"\r\n' +
  140. '$ipif = $internalAdapter.ifIndex\r\n' +
  141. 'New-NetIPAddress -IPAddress $ipaddress -PrefixLength $ipprefix -InterfaceIndex $ipif -DefaultGateway $ipgw')
  142. print r.std_out
  143. print r.std_err
  144.  
  145. def get_computer_name(server_port):
  146. s = session_for_port(server_port)
  147. r = s.run_ps('$env:computername')
  148. return r.std_out.strip()
  149.  
  150. def change_computer_name(server_port, computername):
  151. print "Changing computer name to " + computername
  152. s = session_for_port(server_port)
  153. r = s.run_ps('Rename-Computer -NewName ' + computername + ' -force')
  154. print r.std_out
  155. print r.std_err
  156. s.run_ps('Restart-Computer')
  157. time.sleep(60)
  158.  
  159. def create_forest(server_port):
  160. s = session_for_port(server_port)
  161. cmd = '$domainname="' + settings["domainname"] + '"\n'
  162. cmd += '$netbiosName="' + settings["netbiosname"] + '"\n'
  163. cmd += 'Import-Module ADDSDeployment\n'
  164. cmd += '$pwd=ConvertTo-SecureString "' + settings["password"] + '" '
  165. cmd += '-AsPlainText -Force\n'
  166. cmd += 'Install-ADDSForest -CreateDnsDelegation:$false '
  167. cmd += '-DatabasePath "C:\Windows\NTDS" '
  168. cmd += '-DomainMode "Win2012" '
  169. cmd += '-DomainName $domainName '
  170. cmd += '-DomainNetbiosName $netbiosName '
  171. cmd += '-ForestMode "Win2012" '
  172. cmd += '-InstallDns:$true '
  173. cmd += '-LogPath "C:\Windows\NTDS" '
  174. cmd += '-NoRebootOnCompletion:$false '
  175. cmd += '-SysvolPath "C:\Windows\SYSVOL" '
  176. cmd += '-Force:$true -SafeModeAdministratorPassword $pwd'
  177. print "Installing AD Forest"
  178. r = s.run_ps(cmd)
  179. print r.std_out
  180. print r.std_err
  181.  
  182. def join_domain(server_port):
  183. print 'Joining domain ' + settings["netbiosname"]
  184. s = session_for_port(server_port)
  185. cmd = '$pwd=ConvertTo-SecureString "' + settings["password"] + '" '
  186. cmd += '-AsPlainText -Force\n'
  187. cmd += '$credential = New-Object System.Management.Automation.PSCredential("' + settings["netbiosname"] + '\\' + settings["username"] + '", $pwd)\n'
  188. cmd += 'Add-Computer -DomainName ' + settings["netbiosname"] + ' -Credential $credential -force\n'
  189. r = s.run_ps(cmd)
  190. print r.std_out
  191. print r.std_err
  192. s.run_ps('Restart-Computer')
  193. time.sleep(60)
  194.  
  195. def get_dns_client_server_address(server_port):
  196. s = session_for_port(server_port)
  197. r = s.run_ps('Get-DnsClientServerAddress -AddressFamily IPv4 -InterfaceIndex (Get-NetAdapter -Name "Ethernet 2").InterfaceIndex | Select -ExpandProperty ServerAddresses')
  198. return r.std_out.strip()
  199.  
  200. def set_dns_client_server_address(server_port, address):
  201. s = session_for_port(server_port)
  202. r = s.run_ps('Set-DnsClientServerAddress -InterfaceIndex (Get-NetAdapter -Name "Ethernet 2").InterfaceIndex -ServerAddress ' + address)
  203.  
  204.  
  205. def main():
  206. print "Setting up Active Directory Lab"
  207. ad_server_port = 5986
  208. manage_ad_port = 5987
  209. settings["username"] = sys.argv[1]
  210. settings["password"] = sys.argv[2]
  211.  
  212. if (not vm_exists(settings["adserver_name"])):
  213. import_vm(settings["ad_ovf"],settings["adserver_name"])
  214. if (not vm_exists(settings["manage_name"])):
  215. import_vm(settings["manage_ovf"],settings["manage_name"])
  216. if (vm_info(settings["adserver_name"])["NIC 2"] == "disabled"):
  217. set_up_internal_network(settings["adserver_name"],settings["internal_network_name"])
  218. if (vm_info(settings["manage_name"])["NIC 2"] == "disabled"):
  219. set_up_internal_network(settings["manage_name"],settings["internal_network_name"])
  220.  
  221. if ("NIC 1 Rule(1)" not in vm_info(settings["adserver_name"])):
  222. forward_winrm_port(settings["adserver_name"],ad_server_port)
  223.  
  224. if (not is_running(settings["adserver_name"])):
  225. start_vm(settings["adserver_name"])
  226. time.sleep(60) # I'd say that's about as long as it takes the machine to boot up
  227.  
  228. if (not get_windows_features(ad_server_port)['RSAT-AD-Tools']):
  229. install_ad(ad_server_port)
  230. time.sleep(60)
  231.  
  232. if (internal_ip_address(ad_server_port).strip() != settings["ad_server_ip"]):
  233. change_ip_address(ad_server_port, settings["ad_server_ip"])
  234.  
  235. if (get_computer_name(ad_server_port) != settings["ad_server_computername"]):
  236. change_computer_name(ad_server_port, settings["ad_server_computername"])
  237.  
  238. if (not has_joined_ad_domain(ad_server_port)):
  239. create_forest(ad_server_port)
  240.  
  241. if ("NIC 1 Rule(1)" not in vm_info(settings["manage_name"])):
  242. forward_winrm_port(settings["manage_name"],manage_ad_port)
  243.  
  244. if (not is_running(settings["manage_name"])):
  245. start_vm(settings["manage_name"])
  246. time.sleep(60)
  247.  
  248. if (internal_ip_address(manage_ad_port).strip() != settings["manage_ad_ip"]):
  249. change_ip_address(manage_ad_port, settings["manage_ad_ip"])
  250.  
  251. if (get_computer_name(manage_ad_port) != settings["manage_ad_computername"]):
  252. change_computer_name(manage_ad_port, settings["manage_ad_computername"])
  253.  
  254. current_address = get_dns_client_server_address(manage_ad_port)
  255.  
  256. if (current_address != settings["ad_server_ip"]):
  257. set_dns_client_server_address(manage_ad_port, settings["ad_server_ip"])
  258.  
  259. if (not has_joined_ad_domain(manage_ad_port)):
  260. join_domain(manage_ad_port)
  261.  
  262. if __name__ == "__main__":
  263. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement