예제 #1
0
 def start_error_log_tracking(self):
     if self.ctrl_be.server_profile.error_log_file_path:
         try:
             self.error_log_reader = ErrorLogFileReader(
                 self.ctrl_be, self.server_profile.error_log_file_path)
         except:
             pass
 def start_error_log_tracking(self):
     if self._ctrl_be.server_profile.error_log_file_path:
         try:
             self.error_log_reader = ErrorLogFileReader(
                 self._ctrl_be, self.server_profile.error_log_file_path)
             self.error_log_position = self.error_log_reader.file_size
         except OperationCancelledError as e:
             self.startup_msgs_log.append_text_with_encoding(
                 "Cancelled password input to open error log file: %s\n" %
                 e, self._ctrl_be.server_helper.cmd_output_encoding, True)
             raise
         except Exception as e:
             self.startup_msgs_log.append_text_with_encoding(
                 "Could not open error log file: %s\n" % e,
                 self._ctrl_be.server_helper.cmd_output_encoding, True)
 def start_error_log_tracking(self):
     if self.ctrl_be.server_profile.error_log_file_path:
         try:
             self.error_log_reader = ErrorLogFileReader(
                 self.ctrl_be, self.server_profile.error_log_file_path)
             self.error_log_position = self.error_log_reader.file_size
         except Exception, e:
             self.startup_msgs_log.append_text_with_encoding(
                 "Could not open error log file: %s\n" % e,
                 self.ctrl_be.server_helper.cmd_output_encoding)
예제 #4
0
class WbAdminConfigurationStartup(mforms.Box):
    long_status_msg = None
    short_status_msg = None
    start_stop_btn = None
    startup_msgs_log = None
    is_server_running_prev_check = None
    copy_to_clipboard_button = None
    clear_messages_button = None
    ui_created = False

    #---------------------------------------------------------------------------
    def print_output(self, text):
        ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S - ")
        self.startup_msgs_log.append_text_with_encoding(
            ts + text + "\n", self.ctrl_be.server_helper.cmd_output_encoding)

    #---------------------------------------------------------------------------
    def __init__(self, ctrl_be, server_profile, main_view):
        mforms.Box.__init__(self, False)
        self.set_managed()
        self.set_release_on_add()
        self.main_view = main_view
        self.ctrl_be = ctrl_be
        self.server_profile = server_profile
        self.main_view.add_content_page(self, "MANAGEMENT",
                                        "Startup / Shutdown",
                                        "admin_start_stop_win")

    #---------------------------------------------------------------------------
    @property
    def server_profile(self):
        return self.ctrl_be.server_profile

    #---------------------------------------------------------------------------
    @property
    def server_control(self):
        return self.ctrl_be.server_control

    #---------------------------------------------------------------------------
    def create_ui(self):
        self.suspend_layout()

        if not self.server_profile.admin_enabled:
            self.add(no_remote_admin_warning_label(self.server_profile), False,
                     True)
            self.resume_layout()
            return

        self.main_view.ui_profile.apply_style(self, 'page')
        self.set_padding(8)  # TODO check padding

        # Top layout structure.
        content = newBox(False)
        self.add(content, True, True)

        # A spacer at the bottom of the page.
        spacer = newBox(True)
        spacer.set_size(-1, 40)
        self.add(spacer, False, True)

        # Left pane (start/stop).
        heading = newLabel("Database Server Status")
        heading.set_style(mforms.BoldStyle)
        content.add(heading, False, True)

        left_pane = newBox(False)
        left_pane.set_spacing(8)

        self.long_status_msg = newLabel("The database server is stopped")
        self.long_status_msg.set_style(mforms.SmallStyle)

        status_message_part = newLabel("The database server instance is ")
        self.short_status_msg = newLabel("...")
        self.short_status_msg.set_color("#DD0000")

        self.start_stop_btn = newButton()
        self.start_stop_btn.set_text("Start server")
        self.start_stop_btn.add_clicked_callback(self.start_stop_clicked)

        start_stop_hbox = newBox(True)
        start_stop_hbox.add(status_message_part, False, True)
        start_stop_hbox.add(self.short_status_msg, False, True)
        start_stop_hbox.add(newLabel("  "), False, False)
        start_stop_hbox.add(self.start_stop_btn, False, False)

        left_pane.add(self.long_status_msg, False, True)
        left_pane.add(start_stop_hbox, False, False)

        description = newLabel(
            "If you stop the server, you and your applications will not be able to use the Database and all current connections will be closed\n"
        )
        description.set_style(mforms.SmallStyle)
        left_pane.add(description, False, False)

        auto_start_checkbox = newCheckBox()
        auto_start_checkbox.set_text(
            "Automatically Start Database Server on Startup")
        auto_start_checkbox.set_active(True)

        description = newLabel(
            "You may select to have the Database server start automatically whenever the computer starts up."
        )
        description.set_style(mforms.SmallStyle)
        description.set_wrap_text(True)

        content.add(left_pane, False, True)

        # Right pane (log).
        heading = newLabel("Startup Message Log")
        heading.set_style(mforms.BoldStyle)
        content.add(heading, False, True)

        right_pane = newBox(False)
        right_pane.set_spacing(8)

        self.startup_msgs_log = newTextBox(mforms.BothScrollBars)
        self.startup_msgs_log.set_read_only(True)
        right_pane.add(self.startup_msgs_log, True, True)

        button_box = newBox(True)
        self.refresh_button = newButton()
        self.refresh_button.set_text("Refresh Status")
        self.refresh_button.add_clicked_callback(lambda: self.refresh(2))
        button_box.add(self.refresh_button, False, False)

        self.copy_to_clipboard_button = newButton()
        self.copy_to_clipboard_button.set_size(150, -1)
        self.copy_to_clipboard_button.set_text("Copy to Clipboard")
        self.copy_to_clipboard_button.add_clicked_callback(
            self.copy_to_clipboard)
        button_box.add_end(self.copy_to_clipboard_button, False, False)

        self.clear_messages_button = newButton()
        self.clear_messages_button.set_size(150, -1)
        self.clear_messages_button.set_text("Clear Messages")
        self.clear_messages_button.add_clicked_callback(self.clear_messages)
        button_box.add_end(self.clear_messages_button, False, False)
        right_pane.add(button_box, False, True)

        content.add(right_pane, True, True)

        self.resume_layout()

        self.ctrl_be.add_me_for_event("server_started", self)
        self.ctrl_be.add_me_for_event("server_stopped", self)

    #---------------------------------------------------------------------------
    def page_activated(self):
        self.main_view.set_content_label(" Startup / Shutdown")
        if not self.ui_created:
            self.create_ui()
            self.ui_created = True
        if self.server_control:
            self.server_control.set_output_handler(self.print_output)
        self.refresh()

    #---------------------------------------------------------------------------
    def server_started_event(self):
        dprint_ex(2, "Handling server start event in start/stop page")
        self.ctrl_be.uitask(self.update_ui, "running")

    #---------------------------------------------------------------------------
    def server_stopped_event(self):
        dprint_ex(2, "Handling server stop event in start/stop page")
        self.ctrl_be.uitask(self.update_ui, "stopped")

    #---------------------------------------------------------------------------
    def update_ui(self, server_status):
        dprint_ex(3, "server_status on enter is %s" % str(server_status))

        if not self.server_profile.admin_enabled:
            return

        self.is_server_running_prev_check = server_status
        if server_status in ("running", "starting"):
            if server_status == "starting":
                self.long_status_msg.set_text(
                    "The database server is starting...")
                self.start_stop_btn.set_enabled(False)
                self.short_status_msg.set_color("#DDCC00")
            else:
                self.start_stop_btn.set_enabled(True)
                self.short_status_msg.set_color("#00DD00")
                self.long_status_msg.set_text(
                    "The database server is started and ready for client connections. To shut the Server down, use the \"Stop Server\" button"
                )
            self.short_status_msg.set_text(server_status)
            self.start_stop_btn.set_text("Stop Server")
        elif server_status in ("stopped", "stopping"):
            if server_status == "stopping":
                self.long_status_msg.set_text(
                    "The database server is stopping...")
                self.start_stop_btn.set_enabled(False)
                self.short_status_msg.set_color("#DDCC00")
            else:
                self.start_stop_btn.set_enabled(True)
                self.short_status_msg.set_color("#DD0000")
                self.long_status_msg.set_text(
                    "The database server is stopped. To start the Server, use the \"Start Server\" button"
                )
            self.short_status_msg.set_text(server_status)
            self.start_stop_btn.set_text("Start Server")
        else:
            self.long_status_msg.set_text(
                "The state of the database server could not be determined, please verify server profile settings."
            )
            self.short_status_msg.set_text("unknown")
            self.short_status_msg.set_color("#FF0000")
            self.start_stop_btn.set_text("Start Server")
            self.start_stop_btn.set_enabled(False)

        dprint_ex(3, "Leave")

    #---------------------------------------------------------------------------
    def start_error_log_tracking(self):
        if self.ctrl_be.server_profile.error_log_file_path:
            try:
                self.error_log_reader = ErrorLogFileReader(
                    self.ctrl_be, self.server_profile.error_log_file_path)
            except:
                pass

    #---------------------------------------------------------------------------
    def print_new_error_log_entries(self):
        if hasattr(self, 'error_log_reader'):
            end = self.error_log_reader.file_size
            self.error_log_reader.refresh()
            self.error_log_reader.chunk_start = end
            self.error_log_reader.chunk_end = self.error_log_reader.file_size
            records = self.error_log_reader.current()
            if records:
                self.startup_msgs_log.append_text_with_encoding(
                    '\nFROM %s:\n' % self.server_profile.error_log_file_path,
                    self.ctrl_be.server_helper.cmd_output_encoding)
                self.startup_msgs_log.append_text_with_encoding(
                    '\n'.join([
                        4 * ' ' + timestamp + '  ' + details.strip()
                        for timestamp, details in records
                    ]) + '\n', self.ctrl_be.server_helper.cmd_output_encoding)

    #---------------------------------------------------------------------------
    def start_stop_clicked(self):
        self.start_error_log_tracking()
        status = self.ctrl_be.is_server_running(verbose=1)
        # Check if server was started/stoped from outside
        if self.is_server_running_prev_check == status:
            if status == "running":
                self.start_stop_btn.set_enabled(False)
                self.refresh_button.set_enabled(False)

                try:
                    if self.server_control and not self.server_control.stop_async(
                            self.async_stop_callback):
                        self.start_stop_btn.set_enabled(True)
                        self.refresh_button.set_enabled(True)
                        return
                except Exception, exc:
                    self.start_stop_btn.set_enabled(True)
                    self.refresh_button.set_enabled(True)
                    Utilities.show_error(
                        "Stop Server",
                        "An error occurred while attempting to stop the server.%s %s\n"
                        % (type(exc).__name__, exc), "OK", "", "")
                    return
            elif status == "stopped":
                self.start_stop_btn.set_enabled(False)
                self.refresh_button.set_enabled(False)

                try:
                    if self.server_control and not self.server_control.start_async(
                            self.async_start_callback):
                        self.start_stop_btn.set_enabled(True)
                        self.refresh_button.set_enabled(True)
                        return
                except Exception, exc:
                    self.start_stop_btn.set_enabled(True)
                    self.refresh_button.set_enabled(True)
                    Utilities.show_error(
                        "Stop Server",
                        "An error occurred while attempting to stop the server.%s %s\n"
                        % (type(exc).__name__, exc), "OK", "", "")
                    return

            elif status == "stopping":
                self.print_output("Server is stopping, please wait...")
class WbAdminConfigurationStartup(mforms.Box):
    long_status_msg = None
    short_status_msg = None
    start_stop_btn = None
    startup_msgs_log = None
    is_server_running_prev_check = None
    copy_to_clipboard_button = None
    clear_messages_button = None
    ui_created = False

    #---------------------------------------------------------------------------
    def print_output(self, text):
      ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S - ")
      self.startup_msgs_log.append_text_with_encoding(ts + text + "\n", self.ctrl_be.server_helper.cmd_output_encoding)

    #---------------------------------------------------------------------------
    def __init__(self, ctrl_be, server_profile, main_view):
        mforms.Box.__init__(self, False)
        self.main_view = main_view
        self.ctrl_be = ctrl_be
        self.server_profile = server_profile
        self.main_view.add_content_page(self, "MANAGEMENT", "Startup / Shutdown", "admin_start_stop_win")

    #---------------------------------------------------------------------------
    @property
    def server_profile(self):
        return self.ctrl_be.server_profile

    #---------------------------------------------------------------------------
    @property
    def server_control(self):
        return self.ctrl_be.server_control

    #---------------------------------------------------------------------------
    def create_ui(self):
        self.suspend_layout()

        if not self.server_profile.admin_enabled:
            self.add(no_remote_admin_warning_label(self.server_profile), False, True)
            self.resume_layout()
            return

        self.main_view.ui_profile.apply_style(self, 'page')
        self.set_padding(8) # TODO check padding

        # Top layout structure.
        content = newBox(False)
        self.add(content, True, True)

        # A spacer at the bottom of the page.
        spacer = newBox(True)
        spacer.set_size(-1, 40)
        self.add(spacer, False, True)

        # Left pane (start/stop).
        heading = newLabel("Database Server Status")
        heading.set_style(mforms.BoldStyle)
        content.add(heading, False, True)

        left_pane = newBox(False)
        left_pane.set_spacing(8)

        self.long_status_msg = newLabel("The database server is stopped")
        self.long_status_msg.set_style(mforms.SmallStyle)

        status_message_part = newLabel("The database server instance is ")
        self.short_status_msg = newLabel("...")
        self.short_status_msg.set_color("#DD0000")

        self.start_stop_btn = newButton()
        self.start_stop_btn.set_text("Start server")
        self.start_stop_btn.add_clicked_callback(self.start_stop_clicked)

        start_stop_hbox = newBox(True)
        start_stop_hbox.add(status_message_part, False, True)
        start_stop_hbox.add(self.short_status_msg, False, True)
        start_stop_hbox.add(newLabel("  "), False, False)
        start_stop_hbox.add(self.start_stop_btn, False, False)

        left_pane.add(self.long_status_msg, False, True)
        left_pane.add(start_stop_hbox, False, False)

        description = newLabel("If you stop the server, you and your applications will not be able to use the Database and all current connections will be closed\n")
        description.set_style(mforms.SmallStyle)
        left_pane.add(description, False, False)

        auto_start_checkbox = newCheckBox()
        auto_start_checkbox.set_text("Automatically Start Database Server on Startup")
        auto_start_checkbox.set_active(True)

        description = newLabel("You may select to have the Database server start automatically whenever the computer starts up.")
        description.set_style(mforms.SmallStyle)
        description.set_wrap_text(True)

        content.add(left_pane, False, True)

        # Right pane (log).
        heading = newLabel("Startup Message Log")
        heading.set_style(mforms.BoldStyle)
        content.add(heading, False, True)

        right_pane = newBox(False)    
        right_pane.set_spacing(8)

        self.startup_msgs_log = newTextBox(mforms.BothScrollBars)
        self.startup_msgs_log.set_read_only(True)
        right_pane.add(self.startup_msgs_log, True, True)

        button_box = newBox(True)
        self.refresh_button = newButton()
        self.refresh_button.set_text("Refresh Status")
        self.refresh_button.add_clicked_callback(lambda:self.refresh(2))
        button_box.add(self.refresh_button, False, False)

        self.copy_to_clipboard_button = newButton()
        self.copy_to_clipboard_button.set_size(150, -1)
        self.copy_to_clipboard_button.set_text("Copy to Clipboard")
        self.copy_to_clipboard_button.add_clicked_callback(self.copy_to_clipboard)
        button_box.add_end(self.copy_to_clipboard_button, False, False)

        self.clear_messages_button = newButton()
        self.clear_messages_button.set_size(150, -1)
        self.clear_messages_button.set_text("Clear Messages")
        self.clear_messages_button.add_clicked_callback(self.clear_messages)
        button_box.add_end(self.clear_messages_button, False, False)
        right_pane.add(button_box, False, True)

        content.add(right_pane, True, True)

        self.resume_layout()

        self.ctrl_be.add_me_for_event("server_started", self)
        self.ctrl_be.add_me_for_event("server_stopped", self)

    #---------------------------------------------------------------------------
    def page_activated(self):
        self.main_view.set_content_label(" Startup / Shutdown")
        if not self.ui_created:
            self.create_ui()
            self.ui_created = True
        if self.server_control:
            self.server_control.set_output_handler(self.print_output)
        self.refresh()

    #---------------------------------------------------------------------------
    def server_started_event(self):
      dprint_ex(2, "Handling server start event in start/stop page")
      self.ctrl_be.uitask(self.update_ui, "running")

    #---------------------------------------------------------------------------
    def server_stopped_event(self):
      dprint_ex(2, "Handling server stop event in start/stop page")
      self.ctrl_be.uitask(self.update_ui, "stopped")

    #---------------------------------------------------------------------------
    def update_ui(self, server_status):
      dprint_ex(3, "server_status on enter is %s" % str(server_status))

      if not self.server_profile.admin_enabled:
        return

      self.is_server_running_prev_check = server_status
      if server_status in ("running", "starting"):
        if server_status == "starting":
          self.long_status_msg.set_text("The database server is starting...")
          self.start_stop_btn.set_enabled(False)
          self.short_status_msg.set_color("#DDCC00")
        else:
          self.start_stop_btn.set_enabled(True)
          self.short_status_msg.set_color("#00DD00")
          self.long_status_msg.set_text("The database server is started and ready for client connections. To shut the Server down, use the \"Stop Server\" button")
        self.short_status_msg.set_text(server_status)
        self.start_stop_btn.set_text("Stop Server")
      elif server_status in ("stopped", "stopping"):
        if server_status == "stopping":
          self.long_status_msg.set_text("The database server is stopping...")
          self.start_stop_btn.set_enabled(False)
          self.short_status_msg.set_color("#DDCC00")
        else:
          self.start_stop_btn.set_enabled(True)
          self.short_status_msg.set_color("#DD0000")
          self.long_status_msg.set_text("The database server is stopped. To start the Server, use the \"Start Server\" button")
        self.short_status_msg.set_text(server_status)
        self.start_stop_btn.set_text("Start Server")
      else:
        self.long_status_msg.set_text("The state of the database server could not be determined, please verify server profile settings.")
        self.short_status_msg.set_text("unknown")
        self.short_status_msg.set_color("#FF0000")
        self.start_stop_btn.set_text("Start Server")
        self.start_stop_btn.set_enabled(False)

      dprint_ex(3, "Leave")
    

    #---------------------------------------------------------------------------
    def start_error_log_tracking(self):
        if self.ctrl_be.server_profile.error_log_file_path:
            try:
                self.error_log_reader = ErrorLogFileReader(self.ctrl_be, self.server_profile.error_log_file_path)
            except:
                pass
                
    #---------------------------------------------------------------------------
    def print_new_error_log_entries(self):
        if hasattr(self, 'error_log_reader'):
            end = self.error_log_reader.file_size
            self.error_log_reader.refresh()
            self.error_log_reader.chunk_start = end
            self.error_log_reader.chunk_end = self.error_log_reader.file_size
            records = self.error_log_reader.current()
            if records:
                self.startup_msgs_log.append_text_with_encoding('\nFROM %s:\n' % self.server_profile.error_log_file_path,
                                                                self.ctrl_be.server_helper.cmd_output_encoding)
                self.startup_msgs_log.append_text_with_encoding('\n'.join( [4*' ' + timestamp + '  ' + details.strip() for timestamp, details in records]) + '\n',
                                                                self.ctrl_be.server_helper.cmd_output_encoding)
                    
 
    #---------------------------------------------------------------------------
    def start_stop_clicked(self):
        self.start_error_log_tracking()
        status = self.ctrl_be.is_server_running(verbose=1)
        # Check if server was started/stoped from outside
        if self.is_server_running_prev_check == status:
            if status == "running":
                self.start_stop_btn.set_enabled(False)
                self.refresh_button.set_enabled(False)

                try:
                    if self.server_control and not self.server_control.stop_async(self.async_stop_callback):
                        self.start_stop_btn.set_enabled(True)
                        self.refresh_button.set_enabled(True)
                        return
                except Exception, exc:
                    self.start_stop_btn.set_enabled(True)
                    self.refresh_button.set_enabled(True)
                    Utilities.show_error("Stop Server",
                              "An error occurred while attempting to stop the server.%s %s\n" % (type(exc).__name__, exc),
                              "OK", "", "")
                    return
            elif status == "stopped":
                self.start_stop_btn.set_enabled(False)
                self.refresh_button.set_enabled(False)

                try:
                    if self.server_control and not self.server_control.start_async(self.async_start_callback):
                        self.start_stop_btn.set_enabled(True)
                        self.refresh_button.set_enabled(True)
                        return
                except Exception, exc:
                    self.start_stop_btn.set_enabled(True)
                    self.refresh_button.set_enabled(True)
                    Utilities.show_error("Stop Server",
                              "An error occurred while attempting to stop the server.%s %s\n" % (type(exc).__name__, exc),
                              "OK", "", "")
                    return

            elif status == "stopping":
                self.print_output("Server is stopping, please wait...")
 def start_error_log_tracking(self):
     if self.ctrl_be.server_profile.error_log_file_path:
         try:
             self.error_log_reader = ErrorLogFileReader(self.ctrl_be, self.server_profile.error_log_file_path)
         except:
             pass
class WbAdminConfigurationStartup(WbAdminTabBase):
    def __init__(self, ctrl_be, instance_info, main_view):
        WbAdminTabBase.__init__(self, ctrl_be, instance_info, main_view)

        self.add_validation(WbAdminValidationRemoteAccess(instance_info))
        self.set_standard_header("title_startup.png", self._instance_info.name,
                                 "Startup / Shutdown MySQL Server")
        self.long_status_msg = None
        self.short_status_msg = None
        self.start_stop_btn = None
        self.offline_mode_btn = None
        self.startup_msgs_log = None
        self.is_server_running_prev_check = None
        self.copy_to_clipboard_button = None
        self.clear_messages_button = None
        self.error_log_reader = None

        if self.server_control:
            self.server_control.set_output_handler(self.print_output_cb)

        button_box = newBox(True)
        self.refresh_button = newButton()
        self.refresh_button.set_size(150, -1)
        self.refresh_button.set_text("Refresh Status")
        self.refresh_button.add_clicked_callback(lambda: self.refresh(True))
        button_box.add(self.refresh_button, False, True)

        self.copy_to_clipboard_button = newButton()
        self.copy_to_clipboard_button.set_size(150, -1)
        self.copy_to_clipboard_button.set_text("Copy to Clipboard")
        self.copy_to_clipboard_button.add_clicked_callback(
            self.copy_to_clipboard)
        button_box.add_end(self.copy_to_clipboard_button, False, True)

        self.clear_messages_button = newButton()
        self.clear_messages_button.set_size(150, -1)
        self.clear_messages_button.set_text("Clear Messages")
        self.clear_messages_button.add_clicked_callback(self.clear_messages)
        button_box.add_end(self.clear_messages_button, False, True)

        self.set_footer(button_box)

    @classmethod
    def wba_register(cls, admin_context):
        admin_context.register_page(cls, "Instance", "Startup / Shutdown",
                                    "Startup and Shutdown", True)

    @classmethod
    def identifier(cls):
        return "admin_start_stop"

    #---------------------------------------------------------------------------
    def print_output_cb(self, text):
        self._ctrl_be.uitask(self.print_output, text)

    #---------------------------------------------------------------------------
    def print_output(self, text):
        ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S - ")
        if self.startup_msgs_log:
            first = to_encodedString(ts + text + "\n")
            second = to_encodedString(
                self._ctrl_be.server_helper.cmd_output_encoding)
            self.startup_msgs_log.append_text_with_encoding(
                first, second, True)

    #---------------------------------------------------------------------------
    @property
    def server_profile(self):
        return self._ctrl_be.server_profile

    #---------------------------------------------------------------------------
    @property
    def server_control(self):
        return self._ctrl_be.server_control

    #---------------------------------------------------------------------------
    def create_ui(self):
        ui_box = mforms.newBox(False)

        ui_box.add(newLabel(" "), False, True)

        self.long_status_msg = newLabel("The database server is stopped")
        self.long_status_msg.set_style(mforms.SmallStyle)

        status_message_part = newLabel("The database server instance is ")
        self.short_status_msg = newLabel("...")
        self.short_status_msg.set_name("Short Status")
        self.short_status_msg.set_color("#DD0000")

        self.start_stop_btn = newButton()
        self.start_stop_btn.set_text("Start server")
        self.start_stop_btn.set_name("Start Stop Server")
        self.start_stop_btn.add_clicked_callback(self.start_stop_clicked)

        self.offline_mode_btn = newButton()
        self.offline_mode_btn.set_text("Bring Offline")
        self.offline_mode_btn.add_clicked_callback(self.offline_mode_clicked)

        start_stop_hbox = newBox(True)
        start_stop_hbox.add(status_message_part, False, True)
        start_stop_hbox.add(self.short_status_msg, False, True)
        start_stop_hbox.add(self.start_stop_btn, False, True)
        start_stop_hbox.add(self.offline_mode_btn, False, True)

        if self._ctrl_be.target_version and self._ctrl_be.target_version.is_supported_mysql_version_at_least(
                5, 7, 5):
            self.offline_mode_btn.show(True)
        else:
            self.offline_mode_btn.show(False)

        ui_box.add(self.long_status_msg, False, True)
        ui_box.add(start_stop_hbox, False, True)

        description = newLabel(
            "If you stop the server, neither you nor your applications can use the database and all current connections will be closed.\n"
        )
        description.set_style(mforms.SmallStyle)
        ui_box.add(description, False, True)

        auto_start_checkbox = newCheckBox()
        auto_start_checkbox.set_text(
            "Automatically Start Database Server on Startup")
        auto_start_checkbox.set_active(True)

        description = newLabel(
            "You may select to have the database server start automatically whenever the computer starts up."
        )
        description.set_style(mforms.SmallStyle)
        description.set_wrap_text(True)

        # Right pane (log).
        heading = newLabel("\nStartup Message Log")
        heading.set_style(mforms.BoldStyle)
        ui_box.add(heading, False, True)

        self.startup_msgs_log = newTextBox(mforms.BothScrollBars)
        self.startup_msgs_log.set_name('Startup Messages Log')
        self.startup_msgs_log.set_read_only(True)
        ui_box.add(self.startup_msgs_log, True, True)

        self._ctrl_be.add_me_for_event("server_started", self)
        self._ctrl_be.add_me_for_event("server_offline", self)
        self._ctrl_be.add_me_for_event("server_stopped", self)

        self.update_ui()

        return ui_box

    def update_ui(self):
        if self.is_server_running_prev_check is None:
            self.is_server_running_prev_check = self.ctrl_be.is_server_running(
            )
            self.real_update_ui(self.is_server_running_prev_check)
            self.print_new_error_log_entries()
        else:
            self.ctrl_be.query_server_info()
            self.real_update_ui(self.ctrl_be.is_server_running())

    #---------------------------------------------------------------------------
    def server_started_event(self):
        dprint_ex(2, "Handling server start event in start/stop page")
        self.real_update_ui("running")

    #---------------------------------------------------------------------------
    def server_offline_event(self):
        dprint_ex(2, "Handling server offline event in start/stop page")
        self.real_update_ui("offline")

    #---------------------------------------------------------------------------
    def server_stopped_event(self):
        dprint_ex(2, "Handling server stop event in start/stop page")
        self.real_update_ui("stopped")

    #---------------------------------------------------------------------------
    def real_update_ui(self, server_status):
        dprint_ex(3, "server_status on enter is %s" % str(server_status))

        if not self.server_profile.admin_enabled:
            return

        self.is_server_running_prev_check = server_status
        if self._ctrl_be.target_version and self._ctrl_be.target_version.is_supported_mysql_version_at_least(
                5, 7, 5):
            self.offline_mode_btn.show(True)
        else:
            self.offline_mode_btn.show(False)

        if server_status in ("running", "starting", "offline"):
            if server_status == "starting":
                self.long_status_msg.set_text(
                    "The database server is starting...")
                self.start_stop_btn.set_enabled(False)
                self.short_status_msg.set_color("#DDCC00")
                self.offline_mode_btn.set_text("Bring Offline")
                self.offline_mode_btn.set_enabled(False)
            elif server_status == "offline":
                self.offline_mode_btn.set_text("Bring Online")
                self.offline_mode_btn.set_enabled(True)
                server_status = "offline"
                self.short_status_msg.set_color("#0000B0")
                self.long_status_msg.set_text(
                    "The database server is in offline mode. To put it back into online mode, use the \"Online mode\" button"
                )
            else:
                self.offline_mode_btn.set_enabled(True)
                self.offline_mode_btn.set_text("Bring Offline")
                self.start_stop_btn.set_enabled(True)
                self.short_status_msg.set_color("#00B000")
                self.long_status_msg.set_text(
                    "The database server is started and ready for client connections. To shut the server down, use the \"Stop Server\" button"
                )
            self.short_status_msg.set_text(server_status)
            self.start_stop_btn.set_text("Stop Server")
        elif server_status in ("stopped", "stopping"):
            if server_status == "stopping":
                self.long_status_msg.set_text(
                    "The database server is stopping...")
                self.start_stop_btn.set_enabled(False)
                self.offline_mode_btn.set_enabled(False)
                self.short_status_msg.set_color("#DDCC00")
            else:
                self.start_stop_btn.set_enabled(True)
                self.offline_mode_btn.set_enabled(False)
                self.short_status_msg.set_color("#B00000")
                self.long_status_msg.set_text(
                    "The database server is stopped. To start the Server, use the \"Start Server\" button"
                )
            self.short_status_msg.set_text(server_status)
            self.start_stop_btn.set_text("Start Server")
        else:
            self.long_status_msg.set_text(
                "The state of the database server could not be determined. Please verify server profile settings."
            )
            self.short_status_msg.set_text("unknown")
            self.short_status_msg.set_color("#FF0000")
            self.start_stop_btn.set_text("Start Server")
            self.start_stop_btn.set_enabled(False)

        self.relayout()
        dprint_ex(3, "Leave")

    #---------------------------------------------------------------------------
    def start_error_log_tracking(self):
        if self._ctrl_be.server_profile.error_log_file_path:
            try:
                self.error_log_reader = ErrorLogFileReader(
                    self._ctrl_be, self.server_profile.error_log_file_path)
                self.error_log_position = self.error_log_reader.file_size
            except OperationCancelledError as e:
                self.startup_msgs_log.append_text_with_encoding(
                    "Cancelled password input to open error log file: %s\n" %
                    e, self._ctrl_be.server_helper.cmd_output_encoding, True)
                raise
            except Exception as e:
                self.startup_msgs_log.append_text_with_encoding(
                    "Could not open error log file: %s\n" % e,
                    self._ctrl_be.server_helper.cmd_output_encoding, True)

    #---------------------------------------------------------------------------
    def print_new_error_log_entries(self):
        if self.error_log_reader:
            self.error_log_reader.refresh()
            if self.error_log_position != self.error_log_reader.file_size:
                self.error_log_reader.chunk_start = self.error_log_position
                self.error_log_reader.chunk_end = self.error_log_reader.file_size
                self.error_log_position = self.error_log_reader.file_size
                records = self.error_log_reader.current()
                if records:
                    self.startup_msgs_log.append_text_with_encoding(
                        '\nFROM %s:\n' %
                        self.server_profile.error_log_file_path,
                        self._ctrl_be.server_helper.cmd_output_encoding, True)

                    log_lines = []
                    for line in records:
                        record_string = "  ".join(
                            to_unicode(log_piece) for log_piece in line)
                        log_lines.append(record_string)
                    log_output = "\n    ".join(log_lines)
                    self.startup_msgs_log.append_text_with_encoding(
                        '    ' + log_output + '\n',
                        self._ctrl_be.server_helper.cmd_output_encoding, True)

    #---------------------------------------------------------------------------
    def start_stop_clicked(self):
        try:
            self.start_error_log_tracking()
        except OperationCancelledError:
            # we could abort everything if we knew that start/stop server also needs sudo password
            # to avoid user having to cancel that twice, but since we're not sure if the start/stop will
            # indeed require the sudo password, we can't give up yet
            pass
        status = self._ctrl_be.is_server_running(verbose=1)
        # Check if server was started/stoped from outside
        if self.is_server_running_prev_check == status:
            if status == "running" or status == "offline":
                if status == "offline":
                    self.print_output("Server is in offline mode.")
                self.start_stop_btn.set_enabled(False)
                self.refresh_button.set_enabled(False)

                try:
                    if self.server_control and not self.server_control.stop_async(
                            self.async_stop_callback, True):
                        if self._ctrl_be.target_version and self._ctrl_be.target_version.is_supported_mysql_version_at_least(
                                5, 7, 5):
                            self.offline_mode_btn.show(True)

                        self.start_stop_btn.set_enabled(True)
                        self.refresh_button.set_enabled(True)
                        return
                except Exception as exc:
                    if self._ctrl_be.target_version and self._ctrl_be.target_version.is_supported_mysql_version_at_least(
                            5, 7, 5):
                        self.offline_mode_btn.show(True)

                    self.start_stop_btn.set_enabled(True)
                    self.refresh_button.set_enabled(True)
                    Utilities.show_error(
                        "Stop Server",
                        "An error occurred while attempting to stop the server.%s %s\n"
                        % (type(exc).__name__, exc), "OK", "", "")
                    return
            elif status == "stopped":
                self.start_stop_btn.set_enabled(False)
                self.refresh_button.set_enabled(False)
                self.offline_mode_btn.set_enabled(False)

                try:
                    if self.server_control and not self.server_control.start_async(
                            self.async_start_callback, True):
                        self.start_stop_btn.set_enabled(True)
                        self.refresh_button.set_enabled(True)
                        return
                except Exception as exc:
                    self.start_stop_btn.set_enabled(True)
                    self.refresh_button.set_enabled(True)
                    Utilities.show_error(
                        "Start Server",
                        "An error occurred while attempting to start the server.%s %s\n"
                        % (type(exc).__name__, exc), "OK", "", "")
                    return

            elif status == "stopping":
                self.print_output("Server is stopping; please wait...")
            elif status == "starting":
                self.print_output("Server is starting; please wait...")
            else:
                self.print_output("Unable to detect server status.")
            self.refresh()

            if self._ctrl_be.target_version and self._ctrl_be.target_version.is_supported_mysql_version_at_least(
                    5, 7, 5):
                self.offline_mode_btn.show(True)

    def offline_mode_clicked(self):
        info = {
            "state": -1,
            "connection": self._ctrl_be.server_profile.db_connection_params
        }
        if self._ctrl_be.is_server_running() == "offline":
            self._ctrl_be.exec_query("SET GLOBAL offline_mode = off")
            self._ctrl_be.event_from_main("server_started")
            info['state'] = 1
        else:
            self._ctrl_be.exec_query("SET GLOBAL offline_mode = on")
            self._ctrl_be.event_from_main("server_offline")
            info['state'] = -1

        #we need to send notification that server state has changed,
        nc.send("GRNServerStateChanged", self._ctrl_be.editor, info)

    #---------------------------------------------------------------------------
    def async_stop_callback(self, status):
        self._ctrl_be.uitask(self.async_stop_finished, status)

    #---------------------------------------------------------------------------
    def async_stop_finished(
            self, status
    ):  # status can be one of success, bad_password or error message
        if status == "success":
            self.print_output("Server stop done.")
        elif status == "bad_password":
            r = Utilities.show_error(
                "Stop Server",
                "A permission error occurred while attempting to stop the server.\n"
                "Administrator password was possibly wrong.", "Retry",
                "Cancel", "")
            if r == mforms.ResultOk:
                if self.server_control.stop_async(self.async_stop_callback):
                    return
            else:
                self.print_output("Could not stop server. Permission denied")
        elif status == "need_password":
            if self.server_control.stop_async(self.async_stop_callback, False):
                return
        else:
            self.print_output("Could not stop server: %s" %
                              (status or "unknown error"))
            Utilities.show_error("Could not stop server", str(status), "OK",
                                 "", "")
        self.refresh()
        self.refresh_button.set_enabled(True)
        self.start_stop_btn.set_enabled(True)
        self.print_new_error_log_entries()
        #self.error_log_reader = None

    #---------------------------------------------------------------------------
    def async_start_callback(self, status):
        self._ctrl_be.uitask(self.async_start_finished, status)

    #---------------------------------------------------------------------------
    def async_start_finished(self, status):
        if status == "success":
            self._ctrl_be.event_from_main("server_started")
            self.print_output("Server start done.")
        elif status == "bad_password":
            r = Utilities.show_error(
                "Start Server",
                "A permission error occurred while attempting to start the server.\n"
                "Administrator password was possibly wrong.", "Retry",
                "Cancel", "")
            if r == mforms.ResultOk:
                self.server_control.start_async(self.async_start_callback)
                return
            else:
                self.print_output("Could not stop server. Permission denied")
        elif status == "need_password":
            self.server_control.start_async(self.async_start_callback, False)
            return
        else:
            self.print_output("Could not start server: %s" %
                              (status or "unknown error"))
            Utilities.show_error("Could not start server", str(status), "OK",
                                 "", "")
        self.refresh()
        self.refresh_button.set_enabled(True)
        self.start_stop_btn.set_enabled(True)
        self.print_new_error_log_entries()
        #self.error_log_reader = None

    #---------------------------------------------------------------------------
    def refresh(self, verbose=False):
        new_state = self._ctrl_be.force_check_server_state(verbose=verbose)
        if new_state:
            self.is_server_running_prev_check = new_state
            self.real_update_ui(self.is_server_running_prev_check)
            self.print_new_error_log_entries()

    #---------------------------------------------------------------------------
    def copy_to_clipboard(self):
        Utilities.set_clipboard_text(self.startup_msgs_log.get_string_value())

    #---------------------------------------------------------------------------
    def clear_messages(self):
        self.startup_msgs_log.clear()