Advertisement
Guest User

Untitled

a guest
Jan 15th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.34 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ##############################################################
  4. # Get IP of VM by name on ESXi
  5. #
  6. ##############################################################
  7. ##############################################################
  8. # author: Valeriy Solovyov <weldpua2008@gmail.com>
  9. # version 0.2 <4.11.2015>
  10. # - fixed issue on getting ip. By default return same as you
  11. # see in the vSphere Client
  12. # version 0.1 <3.11.2015>
  13. # - initial
  14. ##############################################################
  15. from pysphere import VIException
  16. from pysphere import VIServer
  17. import logging
  18. import sys
  19. import argparse
  20. import base64
  21. import getpass
  22. import re
  23. import time
  24.  
  25.  
  26. def vm_by_name(name, con):
  27. """Find vm by name
  28. :param name:
  29. :param con:
  30. :return:
  31. """
  32.  
  33. try:
  34. vm = con.get_vm_by_name(name)
  35. logging.debug('Found VM %s' % vm.properties.name)
  36. return vm
  37. except VIException:
  38. return None
  39.  
  40.  
  41. def to_esx(server, username, password):
  42. con = VIServer()
  43. try:
  44. logging.debug('Trying to connect with provided credentials')
  45. con.connect(server, username, password)
  46. logging.info('Connected to server %s' % server)
  47. logging.debug('Server type: %s' % con.get_server_type())
  48. logging.debug('API version: %s' % con.get_api_version())
  49. except VIException as ins:
  50. logging.error(ins)
  51. logging.debug('Loggin error. Program will exit now.')
  52. sys.exit()
  53.  
  54. return con
  55.  
  56.  
  57. def get_args(): # pragma: no cover
  58. # Creating the argument parser
  59. parser = argparse.ArgumentParser(
  60. description="Getting info of VM.")
  61. parser.add_argument(
  62. '-s',
  63. '--server',
  64. nargs=1,
  65. required=True,
  66. help='The vCenter or ESXi server to connect to',
  67. dest='server',
  68. type=str)
  69. parser.add_argument(
  70. '-u',
  71. '--user',
  72. nargs=1,
  73. required=True,
  74. help='The username with which to connect to the server',
  75. dest='username',
  76. type=str)
  77. parser.add_argument(
  78. '-p',
  79. '--password',
  80. nargs=1,
  81. required=False,
  82. help='The password in plain text with which to connect to the host. If not specified, the user is prompted at runtime for a password.',
  83. dest='password',
  84. type=str)
  85. parser.add_argument(
  86. '-pe',
  87. '--password-encrypted',
  88. nargs=1,
  89. required=False,
  90. help='The password encrypted using Base64 with which to connect to the host. ',
  91. dest='passwordEncrypted',
  92. type=str)
  93. parser.add_argument(
  94. '-m',
  95. '--vm',
  96. nargs=1,
  97. required=True,
  98. help='The virtual machine (VM)',
  99. dest='vmname',
  100. type=str)
  101. parser.add_argument(
  102. '-v',
  103. '--verbose',
  104. required=False,
  105. help='Enable verbose output',
  106. dest='verbose',
  107. action='store_true')
  108. parser.add_argument(
  109. '-d',
  110. '--debug',
  111. required=False,
  112. help='Enable debug output',
  113. dest='debug',
  114. action='store_true')
  115. parser.add_argument(
  116. '-l',
  117. '--log-file',
  118. nargs=1,
  119. required=False,
  120. help='File to log to (default = stdout)',
  121. dest='logfile',
  122. type=str)
  123.  
  124. parser.add_argument(
  125. '-V',
  126. '--version',
  127. action='version',
  128. version="%(prog)s (version 0.1)")
  129.  
  130. # subparsers = parser.add_subparsers(help='commands')
  131. args = parser.parse_args()
  132. return args
  133.  
  134.  
  135. def find_ip(vm, ipv6=False, timeout=1800):
  136. ips = None
  137. ip = vm.get_property('ip_address', False)
  138.  
  139. i = 0
  140. sleep_delay_sec = 1
  141. while not ip:
  142. time.sleep(sleep_delay_sec)
  143. ip = vm.get_property('ip_address', False)
  144. i += sleep_delay_sec
  145. if i > timeout:
  146. break
  147.  
  148. # getting ipthat inside ESXi was shown
  149. if ip:
  150. if ipv6 and re.match('\d{1,4}\:.*', ip) and not re.match('fe83\:.*',ip):
  151. print 'IPv6 address found: %s' % ip
  152. ips = ip
  153. #return ip
  154. elif not ipv6 and re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',ip) and ip != '127.0.0.1':
  155. print 'IPv4 address found: %s' % ip
  156. ips = ip
  157. else:
  158. # getting ip that inside vm object
  159. net_info = vm.get_property('net', False)
  160. if net_info:
  161. for ip in net_info[0]['ip_addresses']:
  162. if ipv6 and re.match('\d{1,4}\:.*', ip) and not re.match('fe83\:.*',ip):
  163. print 'IPv6 address found: %s' % ip
  164. ips = str(ips) + ';' + ip
  165. #return ip
  166. elif not ipv6 and re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',ip) and ip != '127.0.0.1':
  167. print 'IPv4 address found: %s' % ip
  168. ips = str(ips) + ';' + ip
  169. #return ip
  170. return ips
  171.  
  172.  
  173. def run(): # pragma: no cover
  174. # Notification settings
  175. args = get_args()
  176. # argsdict = vars(args)
  177. server = args.server[0]
  178. username = args.username[0]
  179. vmname = args.vmname[0]
  180. verbose = args.verbose
  181. debug = args.debug
  182. log_file = None
  183. password = None
  184.  
  185. if args.password:
  186. password = args.password[0]
  187. if args.logfile:
  188. log_file = args.logfile[0]
  189.  
  190. # Logging settings
  191. if debug:
  192. log_level = logging.DEBUG
  193. elif verbose:
  194. log_level = logging.INFO
  195. else:
  196. log_level = logging.WARNING
  197.  
  198. #Initializing logger
  199. if log_file:
  200. logging.basicConfig(
  201. filename=log_file,
  202. format='%(asctime)s %(levelname)s %(message)s',
  203. level=log_level)
  204. else:
  205. logging.basicConfig(
  206.  
  207. format='%(asctime)s %(levelname)s %(message)s',
  208. level=log_level)
  209.  
  210. logger = logging.getLogger(__name__)
  211. logger.debug('logger initialized')
  212. try:
  213. logger.debug('Using encrypted password. Decrypting now.')
  214. if args.passwordEncrypted:
  215. password = base64.b64decode(args.passwordEncrypted[0])
  216. except Exception as error:
  217. logger.error(error)
  218. logger.debug(
  219. 'Password error. Either this is not an encrypted passowrd or is not well formated.')
  220. sys.exit()
  221.  
  222. # Asking Users password for server
  223. if password is None:
  224. logger.debug(
  225. 'No command line password received, requesting plain text password from user.')
  226. password = getpass.getpass(
  227. prompt='Enter password for vCenter %s for user %s: ' %
  228. (server, username))
  229.  
  230. logger.debug(password)
  231.  
  232. # Connecting to server
  233. logger.info('Connecting to server %s with username %s' % (server, username))
  234. con = to_esx(
  235. server=server,
  236. username=username,
  237. password=password)
  238. try:
  239. # Getting VM object
  240. vm = vm_by_name(vmname, con)
  241.  
  242. if vm:
  243. logger.info(
  244. 'Successfully found %s in %s' %
  245. (vm.get_property('name'), vm.get_property('path')))
  246. else:
  247. logger.error(
  248. "Could not find %s, please verify VM's name and try again." %
  249. vm)
  250. con.disconnect()
  251. sys.exit()
  252. find_ip(vm)
  253. con.disconnect()
  254. except VIException as inst:
  255. logger.error(inst)
  256. logger.error('An unexpceted error ocurred. Program will be terminated.')
  257. sys.exit()
  258.  
  259. if __name__ == '__main__': # pragma: no cover
  260. run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement