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]
Аби щоразу не морочитися з запуском цих служб вручну, вирішив написати невеликий аплет індикатор:
При написанні користувався статтею 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 в якому прописаний порядок індикаторів, але там вони не всі! Так само не знаю, як призначити своєму індикатору унікальний ідентифікатор.. тому його теж не вдасться посортувати.
Коментарів 5
Напишіть відгук
Ви мусите увійти, щоби коментувати.
Вовка, ну ти голова!
Та ну, то нашвидкуруч, далеко не оптимально, а знавці пайтона певно ще б обматюкали))
ой, да ладно тобі))) всьо ти шариш, навіть на швидкоруч
Радий, що ти знайшов свою статтю корисною, сценарій виглядає добре!
Thanks for your feedback =)