Explorar el Código

实现在线密码重置

James Iter hace 8 años
padre
commit
ee6030482a
Se han modificado 3 ficheros con 38 adiciones y 7 borrados
  1. 30 4
      api/guest.py
  2. 1 3
      docs/todo.md
  3. 7 0
      models/event_processor.py

+ 30 - 4
api/guest.py

@@ -150,7 +150,7 @@ def r_create():
             disk.size = 0
             disk.path = config.storage_path + '/' + disk.uuid + '.' + disk.format
             disk.guest_uuid = ''
-            # disk.node_id 由 guest 事件处理机更新。涉及迁移时,其所属 node_id 会变更。参见 models/event_processory.py:111 附近。
+            # disk.node_id 由 guest 事件处理机更新。涉及迁移时,其所属 node_id 会变更。参见 @models/event_processory.py:111 附近。
             disk.node_id = 0
             disk.quota(config=config)
             disk.create()
@@ -817,17 +817,43 @@ def r_reset_password(uuids, password):
         ji.Check.previewing(args_rules, {'uuids': uuids, 'password': password})
 
         guest = Guest()
+        os_template_image = OSTemplateImage()
+        os_template_profile = OSTemplateProfile()
+
         # 检测所指定的 UUDIs 实例都存在
         for uuid in uuids.split(','):
             guest.uuid = uuid
             guest.get_by('uuid')
 
-        # 重置密码的 boot job id 固定为 1
         for uuid in uuids.split(','):
             guest.uuid = uuid
             guest.get_by('uuid')
-            guest.password = password
-            guest.update()
+
+            os_template_image.id = guest.os_template_image_id
+            os_template_image.get()
+
+            os_template_profile.id = os_template_image.os_template_profile_id
+            os_template_profile.get()
+
+            user = 'root'
+
+            if os_template_profile.os_type == 'windows':
+                user = 'administrator'
+
+            # guest.password 由 guest 事件处理机更新。参见 @models/event_processory.py:189 附近。
+
+            message = {
+                '_object': 'guest',
+                'action': 'reset_password',
+                'uuid': guest.uuid,
+                'node_id': guest.node_id,
+                'os_type': os_template_profile.os_type,
+                'user': user,
+                'password': password,
+                'passback_parameters': {'password': password}
+            }
+
+            Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
 
         ret = dict()
         ret['state'] = ji.Common.exchange_state(20000)

+ 1 - 3
docs/todo.md

@@ -75,9 +75,7 @@
 - [x] 计算机节点加入是否接受自动分配虚拟机开关
 - [ ] 实现网络流量限速
 - [ ] 实现变配功能
-- [ ] 取消单独的初始化密码操作,合并入具体的操作系统初始化操作中
-- [ ] 替换 host 对象中的 node_id 为 hostname,统一主键。并消除 node_id
-- [ ] 考虑用管理接口的 IP 地址来区别计算节点,而不是用主机名
+- [x] 取消单独的初始化密码操作,合并入具体的操作系统初始化操作中
 - [ ] 迁移中的虚拟机,不允许做任何操作
 - [ ] 通过 QemuGuestAgent 实现 Guest 的内存使用率监控
 

+ 7 - 0
models/event_processor.py

@@ -186,6 +186,13 @@ class EventProcessor(object):
                     cls.disk.update_by_filter({'guest_uuid': '', 'sequence': -1, 'state': DiskState.idle.value},
                                               filter_str='guest_uuid:eq:' + cls.guest.uuid)
 
+            elif action == 'reset_password':
+                if state == ResponseState.success.value:
+                    cls.guest.uuid = uuid
+                    cls.guest.get_by('uuid')
+                    cls.guest.password = cls.message['message']['passback_parameters']['password']
+                    cls.guest.update()
+
             elif action == 'attach_disk':
                 cls.disk.uuid = cls.message['message']['passback_parameters']['disk_uuid']
                 cls.disk.get_by('uuid')