]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/ServiceView.js
351ab0987e9bbae8a1947e50817f9e257d6703a7
[proxmox-widget-toolkit.git] / src / node / ServiceView.js
1 Ext.define('proxmox-services', {
2 extend: 'Ext.data.Model',
3 fields: ['service', 'name', 'desc', '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 storeid: 'proxmox-services' + me.nodename,
26 model: 'proxmox-services',
27 proxy: {
28 type: 'proxmox',
29 url: "/api2/json/nodes/" + me.nodename + "/services",
30 },
31 });
32
33 let store = Ext.create('Proxmox.data.DiffStore', {
34 rstore: rstore,
35 sortAfterUpdate: true,
36 sorters: [
37 {
38 property: 'name',
39 direction: 'ASC',
40 },
41 ],
42 });
43
44 let view_service_log = function() {
45 let sm = me.getSelectionModel();
46 let rec = sm.getSelection()[0];
47 let win = Ext.create('Ext.window.Window', {
48 title: gettext('Syslog') + ': ' + rec.data.service,
49 modal: true,
50 width: 800,
51 height: 400,
52 layout: 'fit',
53 items: {
54 xtype: 'proxmoxLogView',
55 url: "/api2/extjs/nodes/" + me.nodename + "/syslog?service=" +
56 rec.data.service,
57 log_select_timespan: 1,
58 },
59 });
60 win.show();
61 };
62
63 let service_cmd = function(cmd) {
64 let rec = me.getSelectionModel().getSelection()[0];
65 let service = rec.data.service;
66 Proxmox.Utils.API2Request({
67 url: `/nodes/${me.nodename}/services/${service}/${cmd}`,
68 method: 'POST',
69 failure: function(response, opts) {
70 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
71 me.loading = true;
72 },
73 success: function(response, opts) {
74 rstore.startUpdate();
75 let upid = response.result.data;
76
77 let win = Ext.create('Proxmox.window.TaskProgress', {
78 upid: upid,
79 });
80 win.show();
81 },
82 });
83 };
84
85 let start_btn = new Ext.Button({
86 text: gettext('Start'),
87 disabled: true,
88 handler: function() {
89 service_cmd("start");
90 },
91 });
92
93 let stop_btn = new Ext.Button({
94 text: gettext('Stop'),
95 disabled: true,
96 handler: function() {
97 service_cmd("stop");
98 },
99 });
100
101 let restart_btn = new Ext.Button({
102 text: gettext('Restart'),
103 disabled: true,
104 handler: function() {
105 service_cmd(me.restartCommand || "restart");
106 },
107 });
108
109 let syslog_btn = new Ext.Button({
110 text: gettext('Syslog'),
111 disabled: true,
112 handler: view_service_log,
113 });
114
115 let set_button_status = function() {
116 let sm = me.getSelectionModel();
117 let rec = sm.getSelection()[0];
118
119 if (!rec) {
120 start_btn.disable();
121 stop_btn.disable();
122 restart_btn.disable();
123 syslog_btn.disable();
124 return;
125 }
126 let service = rec.data.service;
127 let state = rec.data.state;
128
129 syslog_btn.enable();
130
131 if (state === 'running') {
132 start_btn.disable();
133 restart_btn.enable();
134 } else {
135 start_btn.enable();
136 restart_btn.disable();
137 }
138 if (!me.startOnlyServices[service]) {
139 if (state === 'running') {
140 stop_btn.enable();
141 } else {
142 stop_btn.disable();
143 }
144 }
145 };
146
147 me.mon(store, 'refresh', set_button_status);
148
149 Proxmox.Utils.monStoreErrors(me, rstore);
150
151 Ext.apply(me, {
152 store: store,
153 stateful: false,
154 tbar: [start_btn, stop_btn, restart_btn, syslog_btn],
155 columns: [
156 {
157 header: gettext('Name'),
158 flex: 1,
159 sortable: true,
160 dataIndex: 'name',
161 },
162 {
163 header: gettext('Status'),
164 width: 100,
165 sortable: true,
166 dataIndex: 'state',
167 },
168 {
169 header: gettext('Description'),
170 renderer: Ext.String.htmlEncode,
171 dataIndex: 'desc',
172 flex: 2,
173 },
174 ],
175 listeners: {
176 selectionchange: set_button_status,
177 itemdblclick: view_service_log,
178 activate: rstore.startUpdate,
179 destroy: rstore.stopUpdate,
180 },
181 });
182
183 me.callParent();
184 },
185 });