Advertisement
Guest User

Untitled

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