power_off_vultr_instance
Forcibly power off a Vultr instance with a three-step confirmation process to ensure accuracy and prevent accidental shutdowns using the Cloud Manage MCP Server.
Instructions
强制关闭Vultr实例(需要三次确认)
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | ||
| ip_confirmation | No | ||
| name_confirmation | No | ||
| operation_confirmation | No |
Implementation Reference
- main.py:512-524 (registration)MCP tool registration and wrapper handler for power_off_vultr_instance, delegates to vultr_provider@mcp.tool() def power_off_vultr_instance( instance_id: str, ip_confirmation: str = "", name_confirmation: str = "", operation_confirmation: str = "" ) -> Dict: """ 强制关闭Vultr实例(需要三次确认) """ return vultr_provider.power_off_instance( instance_id, ip_confirmation, name_confirmation, operation_confirmation )
- providers/vultr_provider.py:228-334 (handler)Core handler logic for power operations in VultrProvider, including instance fetch, triple confirmation validation, and API call to halt the instancedef _execute_power_operation( self, instance_id: str, operation: str, ip_confirmation: str, name_confirmation: str, operation_confirmation: str ) -> Dict: """ 执行电源操作的通用函数 """ if not self.available: return { 'error': f'Vultr服务不可用: {getattr(self, "error", "未知错误")}', 'provider': 'vultr' } # 首先获取实例信息 try: response = requests.get(f'{self.base_url}/instances/{instance_id}', headers=self.headers, timeout=10) if response.status_code == 404: return { 'error': f'未找到ID为 {instance_id} 的Vultr实例', 'provider': 'vultr' } if response.status_code != 200: return { 'error': f'获取实例信息失败: {response.status_code} - {response.text}', 'provider': 'vultr' } data = response.json() instance = data.get('instance', {}) # 格式化实例信息用于确认 instance_info = self._format_instance_for_confirmation(instance) except Exception as e: return { 'error': f'获取Vultr实例信息时发生错误: {str(e)}', 'provider': 'vultr' } # 检查是否提供了确认信息 if not ip_confirmation or not name_confirmation or not operation_confirmation: # 转换操作名称 operation_mapping = { 'start': 'power_on', 'halt': 'power_off', 'reboot': 'reboot' } mapped_operation = operation_mapping.get(operation, operation) return require_triple_confirmation(instance_info, mapped_operation) # 验证确认信息 security = SecurityConfirmation() operation_mapping = { 'start': 'power_on', 'halt': 'power_off', 'reboot': 'reboot' } mapped_operation = operation_mapping.get(operation, operation) is_valid, error_message = security.validate_power_operation( instance_info, mapped_operation, ip_confirmation, name_confirmation, operation_confirmation ) if not is_valid: return { 'error': f'确认验证失败: {error_message}', 'provider': 'vultr', 'requires_confirmation': True } # 执行实际操作 try: operation_data = {'action': operation} response = requests.post( f'{self.base_url}/instances/{instance_id}/actions', headers=self.headers, json=operation_data, timeout=10 ) if response.status_code not in [200, 202, 204]: return { 'error': f'执行 {operation} 操作失败: {response.status_code} - {response.text}', 'provider': 'vultr' } return { 'provider': 'vultr', 'instance_id': instance_id, 'operation_success': True, 'operation': operation, 'message': f'已成功提交 {operation} 操作', 'confirmation_validated': True } except Exception as e: return { 'error': f'执行 {operation} 操作时发生错误: {str(e)}', 'provider': 'vultr' }
- providers/vultr_provider.py:200-212 (handler)VultrProvider.power_off_instance method, maps to 'halt' operation and calls core executordef power_off_instance( self, instance_id: str, ip_confirmation: str = "", name_confirmation: str = "", operation_confirmation: str = "" ) -> Dict: """ 强制关闭Vultr实例(需要三次确认) """ return self._execute_power_operation( instance_id, 'halt', ip_confirmation, name_confirmation, operation_confirmation )
- utils/security.py:12-69 (helper)SecurityConfirmation.validate_power_operation: Validates the triple confirmation inputs (IP, name, operation) for power operations@staticmethod def validate_power_operation( instance_info: Dict, operation: str, ip_confirmation: str, name_confirmation: str, operation_confirmation: str ) -> Tuple[bool, str]: """ 验证电源操作的三次确认 Args: instance_info (dict): 实例信息 operation (str): 操作类型 ('shutdown', 'reboot', 'power_off', 'power_on') ip_confirmation (str): 用户确认的IP地址 name_confirmation (str): 用户确认的实例名称 operation_confirmation (str): 用户确认的操作类型 Returns: Tuple[bool, str]: (是否通过验证, 错误信息) """ errors = [] # 获取实例的实际信息 actual_ip = instance_info.get('public_ip', instance_info.get('public_ipv4', '未知')) actual_name = instance_info.get('name', instance_info.get('instance_name', '未知')) # 第一次确认:IP地址 if ip_confirmation.strip() != actual_ip: errors.append(f"IP地址确认失败: 期望 '{actual_ip}', 但收到 '{ip_confirmation}'") # 第二次确认:实例名称 if name_confirmation.strip() != actual_name: errors.append(f"实例名称确认失败: 期望 '{actual_name}', 但收到 '{name_confirmation}'") # 第三次确认:操作类型 valid_operations = { 'shutdown': ['shutdown', '关机', '优雅关机'], 'power_off': ['power_off', '强制关机', '强制断电'], 'reboot': ['reboot', '重启', '重新启动'], 'power_on': ['power_on', '开机', '启动'] } operation_confirmed = False for op, variations in valid_operations.items(): if op == operation and operation_confirmation.strip().lower() in [v.lower() for v in variations]: operation_confirmed = True break if not operation_confirmed: expected_ops = valid_operations.get(operation, [operation]) errors.append(f"操作确认失败: 期望 '{expected_ops[0]}', 但收到 '{operation_confirmation}'") if errors: return False, "; ".join(errors) return True, "所有确认项目验证通过"
- utils/security.py:158-190 (helper)require_triple_confirmation: Generates security prompts and safety checks for requiring triple confirmation before power operationsdef require_triple_confirmation(instance_info: Dict, operation: str) -> Dict[str, any]: """ 生成三重确认要求的完整信息 Args: instance_info (dict): 实例信息 operation (str): 操作类型 Returns: Dict[str, any]: 确认要求信息 """ security = SecurityConfirmation() # 获取确认提示 prompt = security.create_confirmation_prompt(instance_info, operation) # 检查操作安全性 is_safe, safety_level, warnings = security.check_operation_safety(instance_info, operation) return { 'requires_confirmation': True, 'confirmation_prompt': prompt, 'safety_check': { 'is_safe': is_safe, 'safety_level': safety_level, 'warnings': warnings }, 'confirmation_format': { 'ip_confirmation': f"请输入目标IP地址: {prompt['target_ip']}", 'name_confirmation': f"请输入实例名称: {prompt['target_name']}", 'operation_confirmation': f"请输入操作类型: {prompt['operation_name']}" } }