]>
Commit | Line | Data |
---|---|---|
d6cae26a | 1 | Ext.define('PVE.lxc.Options', { |
9fd8d73e | 2 | extend: 'Proxmox.grid.PendingObjectGrid', |
d6cae26a DM |
3 | alias: ['widget.pveLxcOptions'], |
4 | ||
ba93a9c6 DC |
5 | onlineHelp: 'pct_options', |
6 | ||
8058410f | 7 | initComponent: function() { |
d6cae26a | 8 | var me = this; |
d6cae26a DM |
9 | |
10 | var nodename = me.pveSelNode.data.node; | |
11 | if (!nodename) { | |
12 | throw "no node name specified"; | |
13 | } | |
14 | ||
15 | var vmid = me.pveSelNode.data.vmid; | |
16 | if (!vmid) { | |
17 | throw "no VM ID specified"; | |
18 | } | |
19 | ||
20 | var caps = Ext.state.Manager.get('GuiCap'); | |
21 | ||
22 | var rows = { | |
23 | onboot: { | |
24 | header: gettext('Start at boot'), | |
25 | defaultValue: '', | |
e7ade592 | 26 | renderer: Proxmox.Utils.format_boolean, |
d6cae26a | 27 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 28 | xtype: 'proxmoxWindowEdit', |
d6cae26a DM |
29 | subject: gettext('Start at boot'), |
30 | items: { | |
896c0d50 | 31 | xtype: 'proxmoxcheckbox', |
d6cae26a DM |
32 | name: 'onboot', |
33 | uncheckedValue: 0, | |
34 | defaultValue: 0, | |
f6710aac TL |
35 | fieldLabel: gettext('Start at boot'), |
36 | }, | |
37 | } : undefined, | |
d6cae26a DM |
38 | }, |
39 | startup: { | |
40 | header: gettext('Start/Shutdown order'), | |
41 | defaultValue: '', | |
42 | renderer: PVE.Utils.render_kvm_startup, | |
8058410f TL |
43 | editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify'] |
44 | ? { | |
6eb2141a | 45 | xtype: 'pveWindowStartupEdit', |
f6710aac TL |
46 | onlineHelp: 'pct_startup_and_shutdown', |
47 | } : undefined, | |
d6cae26a DM |
48 | }, |
49 | ostype: { | |
50 | header: gettext('OS Type'), | |
f6710aac | 51 | defaultValue: Proxmox.Utils.unknownText, |
d6cae26a DM |
52 | }, |
53 | arch: { | |
54 | header: gettext('Architecture'), | |
f6710aac | 55 | defaultValue: Proxmox.Utils.unknownText, |
d6cae26a DM |
56 | }, |
57 | console: { | |
b9628aa5 | 58 | header: '/dev/console', |
d6cae26a | 59 | defaultValue: 1, |
e7ade592 | 60 | renderer: Proxmox.Utils.format_enabled_toggle, |
d6cae26a | 61 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 62 | xtype: 'proxmoxWindowEdit', |
0a3cf3d4 | 63 | subject: '/dev/console', |
d6cae26a | 64 | items: { |
896c0d50 | 65 | xtype: 'proxmoxcheckbox', |
d6cae26a DM |
66 | name: 'console', |
67 | uncheckedValue: 0, | |
68 | defaultValue: 1, | |
69 | deleteDefaultValue: true, | |
70 | checked: true, | |
f6710aac TL |
71 | fieldLabel: '/dev/console', |
72 | }, | |
73 | } : undefined, | |
d6cae26a DM |
74 | }, |
75 | tty: { | |
76 | header: gettext('TTY count'), | |
77 | defaultValue: 2, | |
78 | editor: caps.vms['VM.Config.Options'] ? { | |
9fccc702 | 79 | xtype: 'proxmoxWindowEdit', |
d6cae26a DM |
80 | subject: gettext('TTY count'), |
81 | items: { | |
bf96f60d | 82 | xtype: 'proxmoxintegerfield', |
d6cae26a | 83 | name: 'tty', |
d6cae26a DM |
84 | minValue: 0, |
85 | maxValue: 6, | |
86 | value: 2, | |
87 | fieldLabel: gettext('TTY count'), | |
bf96f60d | 88 | emptyText: gettext('Default'), |
f6710aac TL |
89 | deleteEmpty: true, |
90 | }, | |
91 | } : undefined, | |
d6cae26a DM |
92 | }, |
93 | cmode: { | |
94 | header: gettext('Console mode'), | |
95 | defaultValue: 'tty', | |
96 | editor: caps.vms['VM.Config.Options'] ? { | |
9fccc702 | 97 | xtype: 'proxmoxWindowEdit', |
d6cae26a DM |
98 | subject: gettext('Console mode'), |
99 | items: { | |
09cacce7 | 100 | xtype: 'proxmoxKVComboBox', |
d6cae26a DM |
101 | name: 'cmode', |
102 | deleteEmpty: true, | |
c9d05dc8 EK |
103 | value: '__default__', |
104 | comboItems: [ | |
e7ade592 | 105 | ['__default__', Proxmox.Utils.defaultText + " (tty)"], |
d6cae26a DM |
106 | ['tty', "/dev/tty[X]"], |
107 | ['console', "/dev/console"], | |
f6710aac | 108 | ['shell', "shell"], |
d6cae26a | 109 | ], |
f6710aac TL |
110 | fieldLabel: gettext('Console mode'), |
111 | }, | |
112 | } : undefined, | |
d6cae26a | 113 | }, |
a979c78d EK |
114 | protection: { |
115 | header: gettext('Protection'), | |
116 | defaultValue: false, | |
e7ade592 | 117 | renderer: Proxmox.Utils.format_boolean, |
a979c78d | 118 | editor: caps.vms['VM.Config.Options'] ? { |
9fccc702 | 119 | xtype: 'proxmoxWindowEdit', |
a979c78d EK |
120 | subject: gettext('Protection'), |
121 | items: { | |
896c0d50 | 122 | xtype: 'proxmoxcheckbox', |
a979c78d EK |
123 | name: 'protection', |
124 | uncheckedValue: 0, | |
125 | defaultValue: 0, | |
126 | deleteDefaultValue: true, | |
f6710aac TL |
127 | fieldLabel: gettext('Enabled'), |
128 | }, | |
129 | } : undefined, | |
a97bc800 EK |
130 | }, |
131 | unprivileged: { | |
132 | header: gettext('Unprivileged container'), | |
e7ade592 | 133 | renderer: Proxmox.Utils.format_boolean, |
f6710aac | 134 | defaultValue: 0, |
a88fcb7d DC |
135 | }, |
136 | features: { | |
137 | header: gettext('Features'), | |
138 | defaultValue: Proxmox.Utils.noneText, | |
2bc71fd9 | 139 | editor: 'PVE.lxc.FeaturesEdit', |
95f2a8a2 DC |
140 | }, |
141 | hookscript: { | |
f6710aac TL |
142 | header: gettext('Hookscript'), |
143 | }, | |
d6cae26a DM |
144 | }; |
145 | ||
146 | var baseurl = 'nodes/' + nodename + '/lxc/' + vmid + '/config'; | |
147 | ||
d6cae26a DM |
148 | var sm = Ext.create('Ext.selection.RowModel', {}); |
149 | ||
5720fafa | 150 | var edit_btn = new Proxmox.button.Button({ |
d6cae26a DM |
151 | text: gettext('Edit'), |
152 | disabled: true, | |
153 | selModel: sm, | |
154 | enableFn: function(rec) { | |
155 | var rowdef = rows[rec.data.key]; | |
156 | return !!rowdef.editor; | |
157 | }, | |
f6710aac | 158 | handler: function() { me.run_editor(); }, |
d6cae26a DM |
159 | }); |
160 | ||
417f904f | 161 | var revert_btn = new PVE.button.PendingRevert(); |
273b5ce3 OB |
162 | |
163 | var set_button_status = function() { | |
55ee6ba1 DJ |
164 | let button_sm = me.getSelectionModel(); |
165 | let rec = button_sm.getSelection()[0]; | |
273b5ce3 OB |
166 | |
167 | if (!rec) { | |
168 | edit_btn.disable(); | |
169 | return; | |
170 | } | |
171 | ||
172 | var key = rec.data.key; | |
399ffa76 | 173 | var pending = rec.data.delete || me.hasPendingChanges(key); |
273b5ce3 OB |
174 | var rowdef = rows[key]; |
175 | ||
2bc71fd9 FE |
176 | if (key === 'features') { |
177 | let unprivileged = me.getStore().getById('unprivileged').data.value; | |
178 | let root = Proxmox.UserName === 'root@pam'; | |
179 | let vmalloc = caps.vms['VM.Allocate']; | |
180 | edit_btn.setDisabled(!(root || (vmalloc && unprivileged))); | |
181 | } else { | |
182 | edit_btn.setDisabled(!rowdef.editor); | |
183 | } | |
184 | ||
273b5ce3 OB |
185 | revert_btn.setDisabled(!pending); |
186 | }; | |
187 | ||
188 | ||
f7993618 | 189 | Ext.apply(me, { |
9fd8d73e | 190 | url: "/api2/json/nodes/" + nodename + "/lxc/" + vmid + "/pending", |
d6cae26a | 191 | selModel: sm, |
04444337 | 192 | interval: 5000, |
8058410f | 193 | tbar: [edit_btn, revert_btn], |
d6cae26a | 194 | rows: rows, |
04444337 | 195 | editorConfig: { |
f6710aac | 196 | url: '/api2/extjs/' + baseurl, |
04444337 | 197 | }, |
d6cae26a | 198 | listeners: { |
273b5ce3 | 199 | itemdblclick: me.run_editor, |
f6710aac TL |
200 | selectionchange: set_button_status, |
201 | }, | |
d6cae26a DM |
202 | }); |
203 | ||
204 | me.callParent(); | |
04444337 TL |
205 | |
206 | me.on('activate', me.rstore.startUpdate); | |
207 | me.on('destroy', me.rstore.stopUpdate); | |
208 | me.on('deactivate', me.rstore.stopUpdate); | |
209 | ||
273b5ce3 OB |
210 | me.mon(me.getStore(), 'datachanged', function() { |
211 | set_button_status(); | |
212 | }); | |
f6710aac | 213 | }, |
d6cae26a DM |
214 | }); |
215 |