home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Shareware / Comunicatii / jyte / jyte.exe / ControlService.py < prev    next >
Text File  |  1999-09-02  |  12KB  |  256 lines

  1. # ControlService.py
  2. #
  3. # A simple app which duplicates some of the functionality in the
  4. # Services applet of the control panel.
  5. #
  6. # Suggested enhancements (in no particular order):
  7. #
  8. # 1. When changing the service status, continue to query the status
  9. # of the service until the status change is complete.  Use this
  10. # information to put up some kind of a progress dialog like the CP
  11. # applet does.  Unlike the CP, allow canceling out in the event that
  12. # the status change hangs.
  13. # 2. When starting or stopping a service with dependencies, alert
  14. # the user about the dependent services, then start (or stop) all
  15. # dependent services as appropriate.
  16. # 3. Allow toggling between service view and device view
  17. # 4. Allow configuration of other service parameters such as startup
  18. # name and password.
  19. # 5. Allow connection to remote SCMs.  This is just a matter of
  20. # reconnecting to the SCM on the remote machine; the rest of the
  21. # code should still work the same.
  22. # 6. Either implement the startup parameters or get rid of the editbox.
  23. # 7. Either implement or get rid of "H/W Profiles".
  24. # 8. Either implement or get rid of "Help".
  25. # 9. Improve error handling.  Ideally, this would also include falling
  26. # back to lower levels of functionality for users with less rights.
  27. # Right now, we always try to get all the rights and fail when we can't
  28.  
  29.  
  30. from pywin.mfc import dialog
  31. import win32ui
  32. import win32con
  33. import win32service
  34.  
  35. class StartupDlg(dialog.Dialog):
  36.  
  37.     IDC_LABEL = 127
  38.     IDC_DEVICE = 128
  39.     IDC_BOOT = 129
  40.     IDC_SYSTEM = 130
  41.     IDC_AUTOMATIC = 131
  42.     IDC_MANUAL = 132
  43.     IDC_DISABLED = 133
  44.  
  45.     def __init__(self, displayname, service):
  46.         dialog.Dialog.__init__(self, self.GetResource())
  47.         self.name = displayname
  48.         self.service = service
  49.  
  50.     def __del__(self):
  51.         win32service.CloseServiceHandle(self.service)
  52.  
  53.     def OnInitDialog(self):
  54.         cfg = win32service.QueryServiceConfig(self.service)
  55.         self.GetDlgItem(self.IDC_BOOT + cfg[1]).SetCheck(1)
  56.  
  57.         status = win32service.QueryServiceStatus(self.service)
  58.         if ((status[0] & win32service.SERVICE_KERNEL_DRIVER) or
  59.                 (status[0] & win32service.SERVICE_FILE_SYSTEM_DRIVER)):
  60.             # driver
  61.             self.GetDlgItem(self.IDC_LABEL).SetWindowText('Device:')
  62.         else:
  63.             # service
  64.             self.GetDlgItem(self.IDC_LABEL).SetWindowText('Service:')
  65.             self.GetDlgItem(self.IDC_BOOT).EnableWindow(0)
  66.             self.GetDlgItem(self.IDC_SYSTEM).EnableWindow(0)
  67.         self.GetDlgItem(self.IDC_DEVICE).SetWindowText(str(self.name))
  68.  
  69.         return dialog.Dialog.OnInitDialog(self)
  70.  
  71.     def OnOK(self):
  72.         self.BeginWaitCursor()
  73.         starttype = self.GetCheckedRadioButton(self.IDC_BOOT, self.IDC_DISABLED) - self.IDC_BOOT
  74.         try:
  75.             win32service.ChangeServiceConfig(self.service, win32service.SERVICE_NO_CHANGE, starttype,
  76.                 win32service.SERVICE_NO_CHANGE, None, None, 0, None, None, None, None)
  77.         except:
  78.             self.MessageBox('Unable to change startup configuration', None,
  79.                 win32con.MB_ICONEXCLAMATION)
  80.         self.EndWaitCursor()
  81.         return dialog.Dialog.OnOK(self)
  82.  
  83.     def GetResource(self):
  84.         style = win32con.WS_POPUP | win32con.DS_SETFONT | win32con.WS_SYSMENU | win32con.WS_CAPTION | win32con.WS_VISIBLE | win32con.DS_MODALFRAME
  85.         exstyle = None
  86.         t = [["Service Startup", (6, 18, 188, 107), style, exstyle, (8, 'MS Shell Dlg')], ]
  87.         t.append([130, "Device:", self.IDC_LABEL, (6, 7, 40, 8), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_LEFT])
  88.         t.append([130, "", self.IDC_DEVICE, (48, 7, 134, 8), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_LEFT])
  89.         t.append([128, "Startup Type", -1, (6, 21, 130, 80), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_GROUP | win32con.BS_GROUPBOX])
  90.         t.append([128, "&Boot", self.IDC_BOOT, (12, 33, 39, 10), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_AUTORADIOBUTTON])
  91.         t.append([128, "&System", self.IDC_SYSTEM, (12, 46, 39, 10), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_AUTORADIOBUTTON])
  92.         t.append([128, "&Automatic", self.IDC_AUTOMATIC, (12, 59, 118, 10), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_AUTORADIOBUTTON])
  93.         t.append([128, "&Manual", self.IDC_MANUAL, (12, 72, 118, 10), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_AUTORADIOBUTTON])
  94.         t.append([128, "&Disabled", self.IDC_DISABLED, (12, 85, 118, 10), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_AUTORADIOBUTTON])
  95.         t.append([128, "OK", win32con.IDOK, (142, 25, 40, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.WS_GROUP | win32con.BS_DEFPUSHBUTTON])
  96.         t.append([128, "Cancel", win32con.IDCANCEL, (142, 43, 40, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  97.         t.append([128, "&Help", win32con.IDHELP, (142, 61, 40, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  98.         return t
  99.  
  100. class ServiceDlg(dialog.Dialog):
  101.  
  102.     IDC_LIST = 128
  103.     IDC_START = 129
  104.     IDC_STOP = 130
  105.     IDC_PAUSE = 131
  106.     IDC_CONTINUE = 132
  107.     IDC_STARTUP = 133
  108.     IDC_PROFILES = 134
  109.     IDC_PARAMS = 135
  110.  
  111.     def __init__(self, machineName = ''):
  112.         dialog.Dialog.__init__(self, self.GetResource())
  113.         self.HookCommand(self.OnListEvent, self.IDC_LIST)
  114.         self.HookCommand(self.OnStartCmd, self.IDC_START)
  115.         self.HookCommand(self.OnStopCmd, self.IDC_STOP)
  116.         self.HookCommand(self.OnPauseCmd, self.IDC_PAUSE)
  117.         self.HookCommand(self.OnContinueCmd, self.IDC_CONTINUE)
  118.         self.HookCommand(self.OnStartupCmd, self.IDC_STARTUP)
  119.         self.machineName = machineName
  120.         self.scm = win32service.OpenSCManager(self.machineName, None, win32service.SC_MANAGER_ALL_ACCESS)
  121.  
  122.     def __del__(self):
  123.         win32service.CloseServiceHandle(self.scm)
  124.  
  125.     def OnInitDialog(self):
  126.         self.listCtrl = self.GetDlgItem(self.IDC_LIST)
  127.         self.listCtrl.SetTabStops([158, 200])
  128.         if self.machineName:
  129.             self.SetWindowText("Services on %s" % self.machineName)
  130.         self.ReloadData()
  131.         return dialog.Dialog.OnInitDialog(self)
  132.  
  133.     def ReloadData(self):
  134.         service = self.GetSelService()
  135.         self.listCtrl.SetRedraw(0)
  136.         self.listCtrl.ResetContent()
  137.         svcs = win32service.EnumServicesStatus(self.scm)
  138.         i = 0
  139.         self.data = []
  140.         for svc in svcs:
  141.             try:
  142.                 status = ('Unknown', 'Stopped', 'Starting', 'Stopping', 'Running',
  143.                     'Continuing', 'Pausing', 'Paused')[svc[2][1]]
  144.             except:
  145.                 status = 'Unknown'
  146.             s = win32service.OpenService(self.scm, svc[0], win32service.SERVICE_ALL_ACCESS)
  147.             cfg = win32service.QueryServiceConfig(s)
  148.             try:
  149.                 startup = ('Boot', 'System', 'Automatic', 'Manual', 'Disabled')[cfg[1]]
  150.             except:
  151.                 startup = 'Unknown'
  152.             win32service.CloseServiceHandle(s)
  153.  
  154.             # svc[2][2] control buttons
  155.             pos = self.listCtrl.AddString(str(svc[1]) + '\t' + status + '\t' + startup)
  156.             self.listCtrl.SetItemData(pos, i)
  157.             self.data.append(tuple(svc[2]) + (svc[1], svc[0], ))
  158.             i = i + 1
  159.  
  160.             if service and service[1] == svc[0]:
  161.                 self.listCtrl.SetCurSel(pos)
  162.         self.OnListEvent(self.IDC_LIST, win32con.LBN_SELCHANGE)
  163.         self.listCtrl.SetRedraw(1)
  164.  
  165.      def OnListEvent(self, id, code):
  166.         if code == win32con.LBN_SELCHANGE or code == win32con.LBN_SELCANCEL:
  167.             pos = self.listCtrl.GetCurSel()
  168.             if pos >= 0:
  169.                 data = self.data[self.listCtrl.GetItemData(pos)][2]
  170.                 canstart = (self.data[self.listCtrl.GetItemData(pos)][1] == win32service.SERVICE_STOPPED)
  171.             else:
  172.                 data = 0
  173.                 canstart = 0
  174.             self.GetDlgItem(self.IDC_START).EnableWindow(canstart)
  175.             self.GetDlgItem(self.IDC_STOP).EnableWindow(data & win32service.SERVICE_ACCEPT_STOP)
  176.             self.GetDlgItem(self.IDC_PAUSE).EnableWindow(data & win32service.SERVICE_ACCEPT_PAUSE_CONTINUE)
  177.             self.GetDlgItem(self.IDC_CONTINUE).EnableWindow(data & win32service.SERVICE_ACCEPT_PAUSE_CONTINUE)
  178.  
  179.     def GetSelService(self):
  180.         pos = self.listCtrl.GetCurSel()
  181.         if pos < 0:
  182.             return None
  183.         pos = self.listCtrl.GetItemData(pos)
  184.         return self.data[pos][-2:]
  185.  
  186.      def OnStartCmd(self, id, code):
  187.         service = self.GetSelService()
  188.         if not service:
  189.             return
  190.         s = win32service.OpenService(self.scm, service[1], win32service.SERVICE_ALL_ACCESS)
  191.         win32service.StartService(s, None)
  192.         win32service.CloseServiceHandle(s)
  193.         self.ReloadData()
  194.  
  195.      def OnStopCmd(self, id, code):
  196.         service = self.GetSelService()
  197.         if not service:
  198.             return
  199.         s = win32service.OpenService(self.scm, service[1], win32service.SERVICE_ALL_ACCESS)
  200.         win32service.ControlService(s, win32service.SERVICE_CONTROL_STOP)
  201.         win32service.CloseServiceHandle(s)
  202.         self.ReloadData()
  203.  
  204.      def OnPauseCmd(self, id, code):
  205.         service = self.GetSelService()
  206.         if not service:
  207.             return
  208.         s = win32service.OpenService(self.scm, service[1], win32service.SERVICE_ALL_ACCESS)
  209.         win32service.ControlService(s, win32service.SERVICE_CONTROL_PAUSE)
  210.         win32service.CloseServiceHandle(s)
  211.         self.ReloadData()
  212.  
  213.      def OnContinueCmd(self, id, code):
  214.         service = self.GetSelService()
  215.         if not service:
  216.             return
  217.         s = win32service.OpenService(self.scm, service[1], win32service.SERVICE_ALL_ACCESS)
  218.         win32service.ControlService(s, win32service.SERVICE_CONTROL_CONTINUE)
  219.         win32service.CloseServiceHandle(s)
  220.         self.ReloadData()
  221.  
  222.      def OnStartupCmd(self, id, code):
  223.         service = self.GetSelService()
  224.         if not service:
  225.             return
  226.         s = win32service.OpenService(self.scm, service[1], win32service.SERVICE_ALL_ACCESS)
  227.         if StartupDlg(service[0], s).DoModal() == win32con.IDOK:
  228.             self.ReloadData()
  229.  
  230.     def GetResource(self):
  231.         style = win32con.WS_POPUP | win32con.DS_SETFONT | win32con.WS_SYSMENU | win32con.WS_CAPTION | win32con.WS_VISIBLE | win32con.DS_MODALFRAME
  232.         exstyle = None
  233.         t = [["Services", (16, 16, 333, 157), style, exstyle, (8, 'MS Shell Dlg')], ]
  234.         t.append([130, "Ser&vice", -1, (6, 6, 70, 8), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_LEFT])
  235.         t.append([130, "Status", -1, (164, 6, 42, 8), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_LEFT])
  236.         t.append([130, "Startup", -1, (206, 6, 50, 8), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_LEFT])
  237.         t.append([131, "", self.IDC_LIST, (6, 16, 255, 106), win32con.LBS_USETABSTOPS | win32con.LBS_SORT | win32con.LBS_NOINTEGRALHEIGHT | win32con.WS_BORDER | win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.WS_TABSTOP | win32con.LBS_NOTIFY | win32con.WS_VSCROLL])
  238.         t.append([128, "Close", win32con.IDOK, (267, 6, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_GROUP | win32con.WS_TABSTOP | win32con.BS_DEFPUSHBUTTON])
  239.         t.append([128, "&Start", self.IDC_START, (267, 27, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  240.         t.append([128, "S&top", self.IDC_STOP, (267, 44, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  241.         t.append([128, "&Pause", self.IDC_PAUSE, (267, 61, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  242.         t.append([128, "&Continue", self.IDC_CONTINUE, (267, 78, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  243.         t.append([128, "Sta&rtup...", self.IDC_STARTUP, (267, 99, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  244.         t.append([128, "H&W Profiles...", self.IDC_PROFILES, (267, 116, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  245.         t.append([128, "&Help", win32con.IDHELP, (267, 137, 60, 14), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
  246.         t.append([130, "St&artup Parameters:", -1, (6, 128, 70, 8), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.SS_LEFT])
  247.         t.append([129, "", self.IDC_PARAMS, (6, 139, 247, 12), win32con.WS_VISIBLE | win32con.WS_CHILD | win32con.WS_GROUP | win32con.WS_BORDER | win32con.ES_AUTOHSCROLL])
  248.         return t
  249.  
  250. if __name__=='__main__':
  251.     import sys
  252.     machine = ''
  253.     if len(sys.argv)>1:
  254.         machine = sys.argv[1]
  255.     ServiceDlg(machine).DoModal()
  256.