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