GNU/Linux → LAMP індикатор для панелі Unity

Нещодавно почав переводити свою роботу з стаціонарного ПК на ноутбук, тому, що так зручніше в плані єдиного мобільного робочого місця. На стацінарці досі стоїть Ubuntu 10.10 з класичним Gnome 2. Оскільки прогрес не стоїть на місці, та й підтримка 10.10 скоро закінчиться, на ноут вирішив ставити 12.04 beta 1, до релізу якої залишилося не так вже й багато часу.

Одразу відмічу, що unity мені не надто подобається.. за тиждень я трохи до неї звик, але багато чого працює якось не логічно. Тому все ж пробуватиму альтернативи.

Після того як налаштував LAMP, задумався, а навіщо постійно тримати запущеним сервер Apache та MySQL? Тому першим ділом прибрав їх з автозавантаження.

Для apache:

# update-rc.d -f apache2 remove

Для mysql правимо файл /etc/init/mysql.conf, закоментуємо рядок:

start on runlevel [2345]

Аби щоразу не морочитися з запуском цих служб вручну, вирішив написати невеликий аплет індикатор:

web_server_indicator

При написанні користувався статтею Create Indicator Applet for Ubuntu Unity (with Python!).

Сам код:

#!/usr/bin/env python
# web_server_indicator_applet

import sys
import gtk
import appindicator

import imaplib
import re
import os

class WebServer:
    icon_path = "/home/my_user"
    script = "/home/my_user/scripts/bin/web_server_manage.sh"
    icon = {
        "none": "web_server.png",
        "run": "web_server_run.png",
        "stop": "web_server_stop.png"
    }
    pids = {
        "apache2": "/var/run/apache2.pid",
        "mysql": "/var/run/mysqld/mysqld.pid"
    }

    ping_frequency = 1
    ping_counter = 0

    def __init__(self):
        self.ind = appindicator.Indicator("debian-doc-menu",
            os.path.join(self.icon_path, self.icon["none"]),
            appindicator.CATEGORY_APPLICATION_STATUS)
        self.ind.set_status(appindicator.STATUS_ACTIVE)

        self.menu_setup()
        self.ind.set_menu(self.menu)

    def menu_setup(self):
        self.menu = gtk.Menu()

        self.strat_stop_item = gtk.MenuItem("Start/Stop")
        self.strat_stop_item.connect("activate", self.start_stop)
        self.strat_stop_item.show()
        self.menu.append(self.strat_stop_item)

        self.quit_item = gtk.MenuItem("Quit")
        self.quit_item.connect("activate", self.quit)
        self.quit_item.show()
        self.menu.append(self.quit_item)

    def main(self):
        self.get_status()
        gtk.main()

    def start_stop(self, widget):
        if self.run == 0:
            action = "start"
        else:
            action = "stop"

        for srv, pid in self.pids.iteritems():
            os.popen("sudo " + self.script + " " + srv + " " + action)

        self.ping_frequency = 1
        self.ping_counter = 0
        self.get_status()

    def get_status(self):
        status = self.check_pids()

        if self.ping_counter > 30:
            self.ping_frequency = 60
            self.ping_counter = 0
        self.ping_counter += 1

        if status == "run":
            self.strat_stop_item.get_child().set_text('Stop servers')
            self.ind.set_icon(os.path.join(self.icon_path, self.icon["run"]))
        elif status == "stop":
            self.strat_stop_item.get_child().set_text('Start servers')
            self.ind.set_icon(os.path.join(self.icon_path, self.icon["stop"]))
        else:
            self.strat_stop_item.get_child().set_text('Stop servers')
            self.ind.set_icon(os.path.join(self.icon_path, self.icon["none"]))

        gtk.timeout_add(self.ping_frequency * 1000, self.get_status)

    def check_pids(self):
        self.run = 0
        for srv, pid in self.pids.iteritems():
            if os.path.exists(pid):
                self.run += 1

        if self.run == 0:
            return "stop"
        elif self.run == len(self.pids):
            return "run"
        else:
            return "none"

    def quit(self, widget):
        sys.exit(0)

if __name__ == '__main__':
    indicator = WebServer()
    indicator.main()

І web_server_manage.sh:

#!/bin/bash

if [ "$2" == "start" ]
then
	case "$1" in

	"apache2")   /etc/init.d/apache2 start >>/dev/null
	;;
	"mysql")     service mysql start >>/dev/null
    ;;
	esac
fi

if [ "$2" == "stop" ]
then
	case "$1" in

	"apache2")   /etc/init.d/apache2 stop >>/dev/null
	;;
	"mysql")     service mysql stop >>/dev/null
    ;;
	esac
fi

Далі дозволив своєму користувачу виконувати останній скріпт від імені root без запиту пароля:

# visudo
my_user ALL=NOPASSWD: /home/my_user/scripts/bin/web_server_manage.sh

Усе, індикатор успішно працює й сумлінно виконує свою функцію.

P.S.
Момент який мене бісить в unity, індикатори на панелі неможливо посортувати так, як тобі хочеться. Є містичний файл ordering-override.keyfile в якому прописаний порядок індикаторів, але там вони не всі! Так само не знаю, як призначити своєму індикатору унікальний ідентифікатор.. тому його теж не вдасться посортувати.

16.03.2012 16:41 Автор: Strange_V Хіти: 729

Коментарів 5

Напишіть відгук