diff --git a/src/jcl/jabber/command.py b/src/jcl/jabber/command.py index 2d5c203..4801c8d 100644 --- a/src/jcl/jabber/command.py +++ b/src/jcl/jabber/command.py @@ -1083,19 +1083,20 @@ class JCLCommandManager(CommandManager): def execute_restart_2(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing command 'restart' step 2") - announcement = session_context["announcement"][0] delay = int(session_context["delay"][0]) - if announcement is not None and announcement != "": - users = account.get_all_users(\ - filter=AND(Account.q.userID == User.q.id, - Account.q._status != account.OFFLINE), - distinct=True) - result = [] - for user in users: - result.append(Message(from_jid=self.component.jid, - to_jid=user.jid, - body=announcement)) - command_node.setProp("status", STATUS_COMPLETED) + result = [] + if session_context.has_key("announcement"): + announcement = session_context["announcement"][0] + if announcement is not None and announcement != "": + users = account.get_all_users(\ + filter=AND(Account.q.userID == User.q.id, + Account.q._status != account.OFFLINE), + distinct=True) + for user in users: + result.append(Message(from_jid=self.component.jid, + to_jid=user.jid, + body=announcement)) + command_node.setProp("status", STATUS_COMPLETED) def delayed_restart(self, delay): threading.Event().wait(delay) self.component.restart = True @@ -1143,19 +1144,20 @@ class JCLCommandManager(CommandManager): def execute_shutdown_2(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing command 'shutdown' step 2") - announcement = session_context["announcement"][0] delay = int(session_context["delay"][0]) - if announcement is not None and announcement != "": - users = account.get_all_users(\ - filter=AND(Account.q.userID == User.q.id, - Account.q._status != account.OFFLINE), - distinct=True) - result = [] - for user in users: - result.append(Message(from_jid=self.component.jid, - to_jid=user.jid, - body=announcement)) - command_node.setProp("status", STATUS_COMPLETED) + result = [] + if session_context.has_key("announcement"): + announcement = session_context["announcement"][0] + if announcement is not None and announcement != "": + users = account.get_all_users(\ + filter=AND(Account.q.userID == User.q.id, + Account.q._status != account.OFFLINE), + distinct=True) + for user in users: + result.append(Message(from_jid=self.component.jid, + to_jid=user.jid, + body=announcement)) + command_node.setProp("status", STATUS_COMPLETED) def delayed_restart(self, delay): threading.Event().wait(delay) self.component.running = False diff --git a/src/jcl/jabber/tests/command.py b/src/jcl/jabber/tests/command.py index ad2fd92..563c06d 100644 --- a/src/jcl/jabber/tests/command.py +++ b/src/jcl/jabber/tests/command.py @@ -2849,7 +2849,7 @@ class JCLCommandManager_TestCase(JCLTestCase): self.assertEquals(self.comp.config.get("component", "admins"), "admin3@test.com,admin4@test.com") - def test_execute_restart(self): + def _common_execute_restart(self): self.comp.account_manager.account_classes = (ExampleAccount, Example2Account) self.comp.running = True @@ -2930,6 +2930,11 @@ class JCLCommandManager_TestCase(JCLTestCase): submit_form.add_field(field_type="list-multi", name="delay", value=[0]) + return (submit_form, command_node, info_query, xml_command, session_id) + + def test_execute_restart(self): + (submit_form, command_node, info_query, + xml_command, session_id) = self._common_execute_restart() submit_form.add_field(field_type="text-multi", name="announcement", value=["service will be restarted in 0 second"]) @@ -2966,7 +2971,36 @@ class JCLCommandManager_TestCase(JCLTestCase): self.assertTrue(self.comp.restart) self.assertFalse(self.comp.running) - def test_execute_shutdown(self): + def test_execute_restart_no_announcement(self): + (submit_form, command_node, info_query, + xml_command, session_id) = self._common_execute_restart() + submit_form.as_xml(command_node) + result = self.command_manager.apply_command_action(\ + info_query, + "http://jabber.org/protocol/admin#restart", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "completed") + self.assertEquals(xml_command.prop("sessionid"), session_id) + self.__check_actions(result[0]) + context_session = self.command_manager.sessions[session_id][1] + self.assertFalse(context_session.has_key("announcement")) + self.assertEquals(context_session["delay"], + ["0"]) + self.assertFalse(self.comp.restart) + self.assertTrue(self.comp.running) + threads = threading.enumerate() + self.assertEquals(len(threads), 2) + threading.Event().wait(1) + threads = threading.enumerate() + self.assertEquals(len(threads), 1) + self.assertTrue(self.comp.restart) + self.assertFalse(self.comp.running) + + def _common_execute_shutdown(self): self.comp.account_manager.account_classes = (ExampleAccount, Example2Account) self.comp.running = True @@ -3047,6 +3081,11 @@ class JCLCommandManager_TestCase(JCLTestCase): submit_form.add_field(field_type="list-single", name="delay", value=0) + return (submit_form, command_node, info_query, xml_command, session_id) + + def test_execute_shutdown(self): + (submit_form, command_node, info_query, + xml_command, session_id) = self._common_execute_shutdown() submit_form.add_field(field_type="text-multi", name="announcement", value=["service will be shut in 0 second"]) @@ -3083,6 +3122,35 @@ class JCLCommandManager_TestCase(JCLTestCase): self.assertFalse(self.comp.restart) self.assertFalse(self.comp.running) + def test_execute_shutdown_no_announcement(self): + (submit_form, command_node, info_query, + xml_command, session_id) = self._common_execute_shutdown() + submit_form.as_xml(command_node) + result = self.command_manager.apply_command_action(\ + info_query, + "http://jabber.org/protocol/admin#shutdown", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "completed") + self.assertEquals(xml_command.prop("sessionid"), session_id) + self.__check_actions(result[0]) + context_session = self.command_manager.sessions[session_id][1] + self.assertFalse(context_session.has_key("announcement")) + self.assertEquals(context_session["delay"], + ["0"]) + self.assertFalse(self.comp.restart) + self.assertTrue(self.comp.running) + threads = threading.enumerate() + self.assertEquals(len(threads), 2) + threading.Event().wait(1) + threads = threading.enumerate() + self.assertEquals(len(threads), 1) + self.assertFalse(self.comp.restart) + self.assertFalse(self.comp.running) + def suite(): test_suite = unittest.TestSuite() test_suite.addTest(unittest.makeSuite(CommandManager_TestCase, 'test'))