]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/ServiceView.js
4344c63ddd34ea5dd40da14dabde2325c89a7495
[proxmox-widget-toolkit.git] / src / node / ServiceView.js
1 Ext.define('proxmox-services', {
2 extend: 'Ext.data.Model',
3 fields: ['service', 'name', 'desc', 'state', 'unit-state', 'active-state'],
4 idProperty: 'service',
5 });
6
7 Ext.define('Proxmox.node.ServiceView', {
8 extend: 'Ext.grid.GridPanel',
9
10 alias: ['widget.proxmoxNodeServiceView'],
11
12 startOnlyServices: {},
13
14 restartCommand: "restart", // TODO: default to reload once everywhere supported
15
16 initComponent: function() {
17 let me = this;
18
19 if (!me.nodename) {
20 throw "no node name specified";
21 }
22
23 let rstore = Ext.create('Proxmox.data.UpdateStore', {
24 interval: 1000,
25 model: 'proxmox-services',
26 proxy: {
27 type: 'proxmox',
28 url: `/api2/json/nodes/${me.nodename}/services`,
29 },
30 });
31
32 let store = Ext.create('Proxmox.data.DiffStore', {
33 rstore: rstore,
34 sortAfterUpdate: true,
35 sorters: [
36 {
37 property: 'name',
38 direction: 'ASC',
39 },
40 ],
41 });
42
43 let view_service_log = function() {
44 let { data: { service } } = me.getSelectionModel().getSelection()[0];
45 Ext.create('Ext.window.Window', {
46 title: gettext('Syslog') + ': ' + service,
47 modal: true,
48 width: 800,
49 height: 400,
50 layout: 'fit',
51 items: {
52 xtype: 'proxmoxLogView',
53 url: `/api2/extjs/nodes/${me.nodename}/syslog?service=${service}`,
54 log_select_timespan: 1,
55 },
56 autoShow: true,
57 });
58 };
59
60 let service_cmd = function(cmd) {
61 let { data: { service } } = me.getSelectionModel().getSelection()[0];
62 Proxmox.Utils.API2Request({
63 url: `/nodes/${me.nodename}/services/${service}/${cmd}`,
64 method: 'POST',
65 failure: function(response, opts) {
66 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
67 me.loading = true;
68 },
69 success: function(response, opts) {
70 rstore.startUpdate();
71 Ext.create('Proxmox.window.TaskProgress', {
72 upid: response.result.data,
73 autoShow: true,
74 });
75 },
76 });
77 };
78
79 let start_btn = new Ext.Button({
80 text: gettext('Start'),
81 disabled: true,
82 handler: function() {
83 service_cmd("start");
84 },
85 });
86
87 let stop_btn = new Ext.Button({
88 text: gettext('Stop'),
89 disabled: true,
90 handler: function() {
91 service_cmd("stop");
92 },
93 });
94
95 let restart_btn = new Ext.Button({
96 text: gettext('Restart'),
97 disabled: true,
98 handler: function() {
99 service_cmd(me.restartCommand || "restart");
100 },
101 });
102
103 let syslog_btn = new Ext.Button({
104 text: gettext('Syslog'),
105 disabled: true,
106 handler: view_service_log,
107 });
108
109 let set_button_status = function() {
110 let sm = me.getSelectionModel();
111 let rec = sm.getSelection()[0];
112
113 if (!rec) {
114 start_btn.disable();
115 stop_btn.disable();
116 restart_btn.disable();
117 syslog_btn.disable();
118 return;
119 }
120 let service = rec.data.service;
121 let state = rec.data.state;
122 let unit = rec.data['unit-state'];
123
124 syslog_btn.enable();
125
126 if (state === 'running') {
127 start_btn.disable();
128 restart_btn.enable();
129 } else if (unit !== undefined && (unit === 'masked' || unit === 'unknown')) {
130 start_btn.disable();
131 restart_btn.disable();
132 } else {
133 start_btn.enable();
134 restart_btn.disable();
135 }
136 if (!me.startOnlyServices[service]) {
137 if (state === 'running') {
138 stop_btn.enable();
139 } else {
140 stop_btn.disable();
141 }
142 }
143 };
144
145 me.mon(store, 'refresh', set_button_status);
146
147 Proxmox.Utils.monStoreErrors(me, rstore);
148
149 Ext.apply(me, {
150 viewConfig: {
151 trackOver: false,
152 stripeRows: false, // does not work with getRowClass()
153 getRowClass: function(record, index) {
154 let unitState = record.get('unit-state');
155 if (!unitState) {
156 return '';
157 }
158 if (unitState === 'masked') {
159 return "proxmox-disabled-row";
160 } else if (unitState === 'unknown') {
161 if (record.get('name') === 'syslog') {
162 return "proxmox-disabled-row"; // replaced by journal on most hosts
163 }
164 return "proxmox-warning-row";
165 }
166 return '';
167 },
168 },
169 store: store,
170 stateful: false,
171 tbar: [start_btn, stop_btn, restart_btn, syslog_btn],
172 columns: [
173 {
174 header: gettext('Name'),
175 flex: 1,
176 sortable: true,
177 dataIndex: 'name',
178 },
179 {
180 header: gettext('Status'),
181 width: 100,
182 sortable: true,
183 dataIndex: 'state',
184 renderer: (v, meta, rec) => rec.get('unit-state') === 'masked'
185 ? gettext('disabled')
186 : v,
187 },
188 {
189 header: gettext('Active'),
190 width: 100,
191 sortable: true,
192 hidden: true,
193 dataIndex: 'active-state',
194 },
195 {
196 header: gettext('Unit'),
197 width: 120,
198 sortable: true,
199 hidden: Proxmox?.Setup?.auth_cookie_name !== 'PVEAuthCookie', // FIXME currently only PVE supports it
200 dataIndex: 'unit-state',
201 },
202 {
203 header: gettext('Description'),
204 renderer: Ext.String.htmlEncode,
205 dataIndex: 'desc',
206 flex: 2,
207 },
208 ],
209 listeners: {
210 selectionchange: set_button_status,
211 itemdblclick: view_service_log,
212 activate: rstore.startUpdate,
213 destroy: rstore.stopUpdate,
214 },
215 });
216
217 me.callParent();
218 },
219 });