Show More
@@ -75,6 +75,9 b' def admin_routes(config):' | |||||
75 | config.add_route( |
|
75 | config.add_route( | |
76 | name='admin_settings_process_management_signal', |
|
76 | name='admin_settings_process_management_signal', | |
77 | pattern='/settings/process_management/signal') |
|
77 | pattern='/settings/process_management/signal') | |
|
78 | config.add_route( | |||
|
79 | name='admin_settings_process_management_master_signal', | |||
|
80 | pattern='/settings/process_management/master_signal') | |||
78 |
|
81 | |||
79 | # default settings |
|
82 | # default settings | |
80 | config.add_route( |
|
83 | config.add_route( |
@@ -21,6 +21,7 b'' | |||||
21 | import logging |
|
21 | import logging | |
22 |
|
22 | |||
23 | import psutil |
|
23 | import psutil | |
|
24 | import signal | |||
24 | from pyramid.view import view_config |
|
25 | from pyramid.view import view_config | |
25 |
|
26 | |||
26 | from rhodecode.apps._base import BaseAppView |
|
27 | from rhodecode.apps._base import BaseAppView | |
@@ -101,3 +102,32 b' class AdminProcessManagementView(BaseApp' | |||||
101 | p.kill() |
|
102 | p.kill() | |
102 |
|
103 | |||
103 | return {'result': result} |
|
104 | return {'result': result} | |
|
105 | ||||
|
106 | @LoginRequired() | |||
|
107 | @HasPermissionAllDecorator('hg.admin') | |||
|
108 | @CSRFRequired() | |||
|
109 | @view_config( | |||
|
110 | route_name='admin_settings_process_management_master_signal', | |||
|
111 | request_method='POST', renderer='json_ext') | |||
|
112 | def process_management_master_signal(self): | |||
|
113 | pid_data = self.request.json.get('pid_data', {}) | |||
|
114 | pid = safe_int(pid_data['pid']) | |||
|
115 | action = pid_data['action'] | |||
|
116 | if pid: | |||
|
117 | try: | |||
|
118 | proc = psutil.Process(pid) | |||
|
119 | except psutil.NoSuchProcess: | |||
|
120 | return {'result': 'failure_no_such_process'} | |||
|
121 | ||||
|
122 | children = proc.children(recursive=True) | |||
|
123 | if children: | |||
|
124 | # master process | |||
|
125 | if action == '+' and len(children) <= 20: | |||
|
126 | proc.send_signal(signal.SIGTTIN) | |||
|
127 | elif action == '-' and len(children) >= 2: | |||
|
128 | proc.send_signal(signal.SIGTTOU) | |||
|
129 | else: | |||
|
130 | return {'result': 'failure_wrong_action'} | |||
|
131 | return {'result': 'success'} | |||
|
132 | ||||
|
133 | return {'result': 'failure_not_master'} |
@@ -50,6 +50,7 b' function registerRCRoutes() {' | |||||
50 | pyroutes.register('admin_settings_process_management', '/_admin/settings/process_management', []); |
|
50 | pyroutes.register('admin_settings_process_management', '/_admin/settings/process_management', []); | |
51 | pyroutes.register('admin_settings_process_management_data', '/_admin/settings/process_management/data', []); |
|
51 | pyroutes.register('admin_settings_process_management_data', '/_admin/settings/process_management/data', []); | |
52 | pyroutes.register('admin_settings_process_management_signal', '/_admin/settings/process_management/signal', []); |
|
52 | pyroutes.register('admin_settings_process_management_signal', '/_admin/settings/process_management/signal', []); | |
|
53 | pyroutes.register('admin_settings_process_management_master_signal', '/_admin/settings/process_management/master_signal', []); | |||
53 | pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []); |
|
54 | pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []); | |
54 | pyroutes.register('admin_defaults_repositories_update', '/_admin/defaults/repositories/update', []); |
|
55 | pyroutes.register('admin_defaults_repositories_update', '/_admin/defaults/repositories/update', []); | |
55 | pyroutes.register('admin_settings', '/_admin/settings', []); |
|
56 | pyroutes.register('admin_settings', '/_admin/settings', []); |
@@ -105,5 +105,34 b' disableAutoRefresh = function() {' | |||||
105 | autoRefresh(false) |
|
105 | autoRefresh(false) | |
106 | }; |
|
106 | }; | |
107 |
|
107 | |||
|
108 | masterAction = function(pid, action) { | |||
|
109 | $.ajax({ | |||
|
110 | url: pyroutes.url('admin_settings_process_management_master_signal'), | |||
|
111 | headers: { | |||
|
112 | "X-CSRF-Token": CSRF_TOKEN, | |||
|
113 | }, | |||
|
114 | data: JSON.stringify({'pid_data': {'pid': pid, 'action': action}}), | |||
|
115 | dataType: 'json', | |||
|
116 | type: 'POST', | |||
|
117 | contentType: "application/json; charset=utf-8", | |||
|
118 | success: function (data) { | |||
|
119 | ||||
|
120 | }, | |||
|
121 | failure: function (data) { | |||
|
122 | ||||
|
123 | }, | |||
|
124 | error: function (data) { | |||
|
125 | ||||
|
126 | } | |||
|
127 | }) | |||
|
128 | }; | |||
|
129 | ||||
|
130 | addWorker = function(pid) { | |||
|
131 | masterAction(pid, '+'); | |||
|
132 | }; | |||
|
133 | ||||
|
134 | removeWorker = function(pid) { | |||
|
135 | masterAction(pid, '-'); | |||
|
136 | }; | |||
108 |
|
137 | |||
109 | </script> |
|
138 | </script> |
@@ -43,6 +43,9 b'' | |||||
43 | </td> |
|
43 | </td> | |
44 | <td> |
|
44 | <td> | |
45 | MASTER |
|
45 | MASTER | |
|
46 | % if request.GET.get('dev'): | |||
|
47 | | <a href="#addWorker" onclick="addWorker(${proc.pid}); return false">ADD</a> | <a href="#removeWorker" onclick="removeWorker(${proc.pid}); return false">REMOVE</a> | |||
|
48 | % endif | |||
46 | </td> |
|
49 | </td> | |
47 | </tr> |
|
50 | </tr> | |
48 | <% mem_sum = 0 %> |
|
51 | <% mem_sum = 0 %> | |
@@ -87,7 +90,6 b'' | |||||
87 | <td></td> |
|
90 | <td></td> | |
88 | </tr> |
|
91 | </tr> | |
89 | <tr><td> <code> -- </code> </td></tr> |
|
92 | <tr><td> <code> -- </code> </td></tr> | |
90 |
|
||||
91 | % endif |
|
93 | % endif | |
92 | % endfor |
|
94 | % endfor | |
93 | </table> |
|
95 | </table> |
General Comments 0
You need to be logged in to leave comments.
Login now