mservice.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #!/bin/python3
  2. import gi
  3. gi.require_version('Gtk', '3.0')
  4. import os, subprocess, locale
  5. from mlocale import translate
  6. from gi.repository import Gtk, GdkPixbuf
  7. class MService(Gtk.Window):
  8. def __init__(self):
  9. Gtk.Window.__init__(self)
  10. self.set_title("Servis Yöneticisi")
  11. self.set_default_size(360,500)
  12. box = Gtk.VBox()
  13. self.add(box)
  14. self.services_black_list = ["halt","initbase","random","rc","reboot","sendsignals"]
  15. self.icon_dir = "./icons"
  16. if not os.path.exists(self.icon_dir):
  17. self.icon_dir = "/usr/share/mservice/icons"
  18. self.set_icon(GdkPixbuf.Pixbuf.new_from_file("/usr/share/icons/hicolor/scalable/apps/mservice.svg"))
  19. else:
  20. self.set_icon(GdkPixbuf.Pixbuf.new_from_file("{}/mservice.svg".format(self.icon_dir)))
  21. self.search_widget = Gtk.SearchEntry()
  22. self.search_widget.connect("search-changed",self.search_change)
  23. box.pack_start(self.search_widget,False,False,5)
  24. self.services_store = Gtk.ListStore(GdkPixbuf.Pixbuf(),str)
  25. self.services_tree = Gtk.TreeView(model=self.services_store)
  26. self.services_tree.set_activate_on_single_click(True)
  27. self.services_tree.connect("button-release-event",self.click_tree)
  28. tree_icon = Gtk.CellRendererPixbuf()
  29. tree_icon.set_fixed_size(32,32)
  30. icon = Gtk.TreeViewColumn(_[1],tree_icon,gicon = 0)
  31. self.services_tree.append_column(icon)
  32. tree_text = Gtk.CellRendererText()
  33. text = Gtk.TreeViewColumn(_[2],tree_text, text = 1)
  34. self.services_tree.append_column(text)
  35. scroll = Gtk.ScrolledWindow()
  36. scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
  37. scroll.add(self.services_tree)
  38. box.pack_start(scroll,True, True, 5)
  39. self.get_services()
  40. self.append_tree(self.services)
  41. def click_tree(self,widget,event):
  42. selected = self.services_tree.get_selection()
  43. tree_model, tree_iter = selected.get_selected()
  44. select = tree_model[tree_iter][1]
  45. status = self.services[select]
  46. if event.button == 1:
  47. if status:
  48. text = _[3].format(select)
  49. else:
  50. text = _[4].format(select)
  51. question = Gtk.MessageDialog(self,0,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL,_[5])
  52. question.set_title(_[5])
  53. question.format_secondary_text(text)
  54. get = question.run()
  55. if get == Gtk.ResponseType.OK:
  56. if status:
  57. get = subprocess.Popen(["/usr/aylinux/bin/service","stop",select], stdout = subprocess.PIPE)
  58. else:
  59. get = subprocess.Popen(["/usr/aylinux/bin/service","start",select], stdout = subprocess.PIPE)
  60. get.wait()
  61. return_text, err = get.communicate()
  62. if " FAIL " in str(return_text):
  63. error_msg = Gtk.MessageDialog(self,0,Gtk.MessageType.INFO, Gtk.ButtonsType.OK,_[11])
  64. error_msg.set_title(_[11])
  65. if status:
  66. error_text = _[13].format(select)
  67. else:
  68. error_text = _[14].format(select)
  69. error_msg.format_secondary_text(error_text)
  70. get = error_msg.run()
  71. error_msg.destroy()
  72. self.get_services()
  73. self.search_widget.set_text("")
  74. self.append_tree(self.services)
  75. question.destroy()
  76. elif event.button == 3:
  77. menu = Gtk.Menu()
  78. enable = Gtk.MenuItem(_[6])
  79. enable.connect("activate",self.enable_service,select)
  80. menu.add(enable)
  81. disable = Gtk.MenuItem(_[7])
  82. disable.connect("activate",self.disable_service,select)
  83. menu.add(disable)
  84. menu.show_all()
  85. menu.popup_at_pointer()
  86. print(select)
  87. def subprocess_parse(self,get):
  88. get = get.communicate()[0]
  89. get = get.decode("utf-8","strict")
  90. return get
  91. def enable_service(self,widget,service):
  92. get = subprocess.Popen(["/usr/aylinux/bin/service","enable",service], stdout = subprocess.PIPE)
  93. get.wait()
  94. get = self.subprocess_parse(get)
  95. info = Gtk.MessageDialog(self,0,Gtk.MessageType.INFO, Gtk.ButtonsType.OK,_[8].format(service))
  96. info.set_title(_[8].format(service))
  97. info.format_secondary_text(get)
  98. info.run()
  99. info.destroy()
  100. def disable_service(self,widget,service):
  101. get = subprocess.Popen(["/usr/aylinux/bin/service","disable",service], stdout = subprocess.PIPE)
  102. get.wait()
  103. get = self.subprocess_parse(get)
  104. info = Gtk.MessageDialog(self,0,Gtk.MessageType.INFO, Gtk.ButtonsType.OK,_[9].format(service))
  105. info.set_title(_[9].format(service))
  106. info.format_secondary_text(get)
  107. info.run()
  108. info.destroy()
  109. def get_services(self):
  110. self.services = {}
  111. service_dir = "/etc/init.d"
  112. if os.path.exists(service_dir):
  113. services = os.listdir(service_dir)
  114. for service in services:
  115. if service not in self.services_black_list:
  116. self.services[service] = self.get_service_status(service)
  117. else:
  118. dialog = Gtk.MessageDialog(None,0, Gtk.MessageType.ERROR,
  119. Gtk.ButtonsType.OK, "Hata")
  120. dialog.format_secondary_text(_[10].format(service_dir))
  121. dialog.run()
  122. self.destroy()
  123. def get_service_status(self,service):
  124. get = subprocess.Popen(["/usr/aylinux/bin/service","status",service], stdout = subprocess.PIPE)
  125. get.wait()
  126. get = self.subprocess_parse(get)
  127. get = get.split("\n")[0]
  128. get = get.split(" ")
  129. if "çalışıyor" in get:
  130. return True
  131. else:
  132. return False
  133. def search_change(self,search_widget):
  134. search_text = search_widget.get_text()
  135. s = {}
  136. for service in self.services.keys():
  137. if search_text in service:
  138. s[service] = self.services[service]
  139. self.append_tree(s)
  140. def append_tree(self,services):
  141. self.services_store.clear()
  142. keys_list = list(services.keys())
  143. keys_list.sort()
  144. for service in keys_list:
  145. service_state = services[service]
  146. if service_state:
  147. icon = GdkPixbuf.Pixbuf.new_from_file("{}/2.svg".format(self.icon_dir))
  148. else:
  149. icon = GdkPixbuf.Pixbuf.new_from_file("{}/1.svg".format(self.icon_dir))
  150. self.services_store.append([icon,service])
  151. if __name__ == "__main__":
  152. l = locale.getdefaultlocale()
  153. l = l[0].split("_")[0]
  154. locales = list(translate.translate.keys())
  155. if l not in locales:
  156. l = "en"
  157. _ = translate.translate[l]
  158. if os.getuid() != 0:
  159. dialog = Gtk.MessageDialog(None,0, Gtk.MessageType.ERROR,
  160. Gtk.ButtonsType.OK, _[11])
  161. dialog.format_secondary_text(_[12])
  162. dialog.run()
  163. else:
  164. pen = MService()
  165. pen.connect("destroy", Gtk.main_quit)
  166. pen.show_all()
  167. Gtk.main()