def Run(self, args): start = time_utils.CurrentTimeSec() # Set up Encryption utilities. openssl_executable = files.FindExecutableOnPath('openssl') if windows_encryption_utils: crypt = windows_encryption_utils.WinCrypt() elif openssl_executable: crypt = openssl_encryption_utils.OpensslCrypt(openssl_executable) else: raise utils.MissingDependencyError( 'Your platform does not support OpenSSL.') # Get Authenticated email address and default username. email = gaia_utils.GetAuthenticatedGaiaEmail(self.http) if args.user: user = args.user else: user = gaia_utils.MapGaiaEmailToDefaultAccountName(email) if args.name == user: raise utils.InvalidUserError( MACHINE_USERNAME_SAME_ERROR.format(user, args.name)) # Warn user (This warning doesn't show for non-interactive sessions). message = RESET_PASSWORD_WARNING.format(user) prompt_string = ( 'Would you like to set or reset the password for [{0}]'.format( user)) console_io.PromptContinue(message=message, prompt_string=prompt_string, cancel_on_no=True) log.status.Print( 'Resetting and retrieving password for [{0}] on [{1}]'.format( user, args.name)) # Get Encryption Keys. key = crypt.GetKeyPair() modulus, exponent = crypt.GetModulusExponentFromPublicKey( crypt.GetPublicKey(key)) # Create Windows key entry. self.windows_key_entry = self._ConstructWindowsKeyEntry( user, modulus, exponent, email) # Call ReadWriteCommad.Run() which will fetch the instance and update # the metadata (using the data in self.windows_key_entry). objects = super(ResetWindowsPassword, self).Run(args) updated_instance = list(objects)[0] # Retrieve and Decrypt the password from the serial console. enc_password = self._GetEncryptedPasswordFromSerialPort(modulus) password = crypt.DecryptMessage(key, enc_password) # Get External IP address. try: access_configs = updated_instance['networkInterfaces'][0][ 'accessConfigs'] external_ip_address = access_configs[0]['natIP'] except KeyError: log.warn(NO_IP_WARNING.format(updated_instance['name'])) external_ip_address = None # Check for old Windows credentials. if self.old_metadata_keys: log.warn( OLD_KEYS_WARNING.format(self.ref.Name(), self.ref.Name(), self.ref.zone, ','.join(self.old_metadata_keys))) log.info('Total Elapsed Time: {0}'.format(time_utils.CurrentTimeSec() - start)) # The connection info resource. connection_info = { 'username': user, 'password': password, 'ip_address': external_ip_address } return connection_info
def SetUp(self): self.crypt = openssl_encryption_utils.OpensslCrypt(_OPEN_SSL_EXECUTABLE)
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client start = time_util.CurrentTimeSec() # Set up Encryption utilities. openssl_executable = files.FindExecutableOnPath('openssl') if windows_encryption_utils: crypt = windows_encryption_utils.WinCrypt() elif openssl_executable: crypt = openssl_encryption_utils.OpensslCrypt(openssl_executable) else: raise utils.MissingDependencyError( 'Your platform does not support OpenSSL.') # Get Authenticated email address and default username. email = properties.VALUES.core.account.GetOrFail() if args.user: user = args.user else: user = gaia.MapGaiaEmailToDefaultAccountName(email) if args.instance_name == user: raise utils.InvalidUserError( MACHINE_USERNAME_SAME_ERROR.format(user, args.instance_name)) # Warn user (This warning doesn't show for non-interactive sessions). message = RESET_PASSWORD_WARNING.format(user) prompt_string = ( 'Would you like to set or reset the password for [{0}]'.format( user)) console_io.PromptContinue(message=message, prompt_string=prompt_string, cancel_on_no=True) log.status.Print( 'Resetting and retrieving password for [{0}] on [{1}]'.format( user, args.instance_name)) # Get Encryption Keys. key = crypt.GetKeyPair() modulus, exponent = crypt.GetModulusExponentFromPublicKey( crypt.GetPublicKey(key)) # Create Windows key entry. self.windows_key_entry = self._ConstructWindowsKeyEntry( user, modulus, exponent, email) # Call ReadWriteCommad.Run() which will fetch the instance and update # the metadata (using the data in self.windows_key_entry). instance_ref = self.CreateReference(client, holder.resources, args) get_request = self.GetGetRequest(client, instance_ref) objects = client.MakeRequests([get_request]) new_object = self.Modify(client, objects[0]) # If existing object is equal to the proposed object or if # Modify() returns None, then there is no work to be done, so we # print the resource and return. if objects[0] == new_object: log.status.Print( 'No change requested; skipping update for [{0}].'.format( objects[0].name)) return objects updated_instance = client.MakeRequests( [self.GetSetRequest(client, instance_ref, new_object)])[0] # Retrieve and Decrypt the password from the serial console. enc_password = self._GetEncryptedPasswordFromSerialPort( client, instance_ref, modulus) password = crypt.DecryptMessage(key, enc_password) # Get External IP address. try: access_configs = updated_instance.networkInterfaces[ 0].accessConfigs external_ip_address = access_configs[0].natIP except (KeyError, IndexError) as _: log.warning(NO_IP_WARNING.format(updated_instance.name)) external_ip_address = None # Check for old Windows credentials. if self.old_metadata_keys: log.warning( OLD_KEYS_WARNING.format(instance_ref.instance, instance_ref.instance, instance_ref.zone, ','.join(self.old_metadata_keys))) log.info('Total Elapsed Time: {0}'.format(time_util.CurrentTimeSec() - start)) # The connection info resource. connection_info = { 'username': user, 'password': password, 'ip_address': external_ip_address } return connection_info