throw "Proxmox library not initialized";
}
-// avoid errors related to Accessible Rich Internet Applications
-// (access for people with disabilities)
-// TODO reenable after all components are upgraded
-Ext.enableAria = false;
-Ext.enableAriaButtons = false;
-Ext.enableAriaPanels = false;
-
// avoid errors when running without development tools
if (!Ext.isDefined(Ext.global.console)) {
let console = {
language_map: {
ar: 'Arabic',
ca: 'Catalan',
+ zh_CN: 'Chinese (Simplified)',
+ zh_TW: 'Chinese (Traditional)',
da: 'Danish',
- de: 'German',
+ nl: 'Dutch',
en: 'English',
- es: 'Spanish',
eu: 'Euskera (Basque)',
- fa: 'Persian (Farsi)',
fr: 'French',
+ de: 'German',
he: 'Hebrew',
it: 'Italian',
ja: 'Japanese',
+ kr: 'Korean',
nb: 'Norwegian (Bokmal)',
nn: 'Norwegian (Nynorsk)',
+ fa: 'Persian (Farsi)',
pl: 'Polish',
pt_BR: 'Portuguese (Brazil)',
ru: 'Russian',
sl: 'Slovenian',
+ es: 'Spanish',
sv: 'Swedish',
tr: 'Turkish',
- zh_CN: 'Chinese (Simplified)',
- zh_TW: 'Chinese (Traditional)',
},
render_language: function(value) {
success: function(response, opts) {
let res = response.result;
if (res === null || res === undefined || !res || res
- .data.status !== 'Active') {
+ .data.status.toLowerCase() !== 'active') {
Ext.Msg.show({
title: gettext('No valid subscription'),
icon: Ext.Msg.WARNING,
},
task_desc_table: {
- acmenewcert: ['SRV', gettext('Order Certificate')],
- acmeregister: ['ACME Account', gettext('Register')],
- acmedeactivate: ['ACME Account', gettext('Deactivate')],
- acmeupdate: ['ACME Account', gettext('Update')],
- acmerefresh: ['ACME Account', gettext('Refresh')],
- acmerenew: ['SRV', gettext('Renew Certificate')],
- acmerevoke: ['SRV', gettext('Revoke Certificate')],
- 'auth-realm-sync': [gettext('Realm'), gettext('Sync')],
- 'auth-realm-sync-test': [gettext('Realm'), gettext('Sync Preview')],
- 'move_volume': ['CT', gettext('Move Volume')],
- clustercreate: ['', gettext('Create Cluster')],
- clusterjoin: ['', gettext('Join Cluster')],
+ aptupdate: ['', gettext('Update package database')],
diskinit: ['Disk', gettext('Initialize Disk with GPT')],
- vncproxy: ['VM/CT', gettext('Console')],
- spiceproxy: ['VM/CT', gettext('Console') + ' (Spice)'],
- vncshell: ['', gettext('Shell')],
spiceshell: ['', gettext('Shell') + ' (Spice)'],
- qmsnapshot: ['VM', gettext('Snapshot')],
- qmrollback: ['VM', gettext('Rollback')],
- qmdelsnapshot: ['VM', gettext('Delete Snapshot')],
- qmcreate: ['VM', gettext('Create')],
- qmrestore: ['VM', gettext('Restore')],
- qmdestroy: ['VM', gettext('Destroy')],
- qmigrate: ['VM', gettext('Migrate')],
- qmclone: ['VM', gettext('Clone')],
- qmmove: ['VM', gettext('Move disk')],
- qmtemplate: ['VM', gettext('Convert to template')],
- qmstart: ['VM', gettext('Start')],
- qmstop: ['VM', gettext('Stop')],
- qmreset: ['VM', gettext('Reset')],
- qmshutdown: ['VM', gettext('Shutdown')],
- qmreboot: ['VM', gettext('Reboot')],
- qmsuspend: ['VM', gettext('Hibernate')],
- qmpause: ['VM', gettext('Pause')],
- qmresume: ['VM', gettext('Resume')],
- qmconfig: ['VM', gettext('Configure')],
- vzsnapshot: ['CT', gettext('Snapshot')],
- vzrollback: ['CT', gettext('Rollback')],
- vzdelsnapshot: ['CT', gettext('Delete Snapshot')],
- vzcreate: ['CT', gettext('Create')],
- vzrestore: ['CT', gettext('Restore')],
- vzdestroy: ['CT', gettext('Destroy')],
- vzmigrate: ['CT', gettext('Migrate')],
- vzclone: ['CT', gettext('Clone')],
- vztemplate: ['CT', gettext('Convert to template')],
- vzstart: ['CT', gettext('Start')],
- vzstop: ['CT', gettext('Stop')],
- vzmount: ['CT', gettext('Mount')],
- vzumount: ['CT', gettext('Unmount')],
- vzshutdown: ['CT', gettext('Shutdown')],
- vzreboot: ['CT', gettext('Reboot')],
- vzsuspend: ['CT', gettext('Suspend')],
- vzresume: ['CT', gettext('Resume')],
- push_file: ['CT', gettext('Push file')],
- pull_file: ['CT', gettext('Pull file')],
- hamigrate: ['HA', gettext('Migrate')],
- hastart: ['HA', gettext('Start')],
- hastop: ['HA', gettext('Stop')],
- hashutdown: ['HA', gettext('Shutdown')],
+ srvreload: ['SRV', gettext('Reload')],
+ srvrestart: ['SRV', gettext('Restart')],
srvstart: ['SRV', gettext('Start')],
srvstop: ['SRV', gettext('Stop')],
- srvrestart: ['SRV', gettext('Restart')],
- srvreload: ['SRV', gettext('Reload')],
- cephcreatemgr: ['Ceph Manager', gettext('Create')],
- cephdestroymgr: ['Ceph Manager', gettext('Destroy')],
- cephcreatemon: ['Ceph Monitor', gettext('Create')],
- cephdestroymon: ['Ceph Monitor', gettext('Destroy')],
- cephcreateosd: ['Ceph OSD', gettext('Create')],
- cephdestroyosd: ['Ceph OSD', gettext('Destroy')],
- cephcreatepool: ['Ceph Pool', gettext('Create')],
- cephdestroypool: ['Ceph Pool', gettext('Destroy')],
- cephfscreate: ['CephFS', gettext('Create')],
- cephcreatemds: ['Ceph Metadata Server', gettext('Create')],
- cephdestroymds: ['Ceph Metadata Server', gettext('Destroy')],
- imgcopy: ['', gettext('Copy data')],
- imgdel: ['', gettext('Erase data')],
- unknownimgdel: ['', gettext('Destroy image from unknown guest')],
- download: ['', gettext('Download')],
- vzdump: (type, id) => id ? `VM/CT ${id} - ${gettext('Backup')}` : gettext('Backup Job'),
- aptupdate: ['', gettext('Update package database')],
- startall: ['', gettext('Start all VMs and Containers')],
- stopall: ['', gettext('Stop all VMs and Containers')],
- migrateall: ['', gettext('Migrate all VMs and Containers')],
- dircreate: [gettext('Directory Storage'), gettext('Create')],
- lvmcreate: [gettext('LVM Storage'), gettext('Create')],
- lvmthincreate: [gettext('LVM-Thin Storage'), gettext('Create')],
- zfscreate: [gettext('ZFS Storage'), gettext('Create')],
+ termproxy: ['', gettext('Console') + ' (xterm.js)'],
+ vncshell: ['', gettext('Shell')],
},
// to add or change existing for product specific ones
return Proxmox.Utils.format_duration_long(uptime);
},
+ systemd_unescape: function(string_value) {
+ const charcode_0 = '0'.charCodeAt(0);
+ const charcode_9 = '9'.charCodeAt(0);
+ const charcode_A = 'A'.charCodeAt(0);
+ const charcode_F = 'F'.charCodeAt(0);
+ const charcode_a = 'a'.charCodeAt(0);
+ const charcode_f = 'f'.charCodeAt(0);
+ const charcode_x = 'x'.charCodeAt(0);
+ const charcode_minus = '-'.charCodeAt(0);
+ const charcode_slash = '/'.charCodeAt(0);
+ const charcode_backslash = '\\'.charCodeAt(0);
+
+ let parse_hex_digit = function(d) {
+ if (d >= charcode_0 && d <= charcode_9) {
+ return d - charcode_0;
+ }
+ if (d >= charcode_A && d <= charcode_F) {
+ return d - charcode_A + 10;
+ }
+ if (d >= charcode_a && d <= charcode_f) {
+ return d - charcode_a + 10;
+ }
+ throw "got invalid hex digit";
+ };
+
+ let value = new TextEncoder().encode(string_value);
+ let result = new Uint8Array(value.length);
+
+ let i = 0;
+ let result_len = 0;
+
+ while (i < value.length) {
+ let c0 = value[i];
+ if (c0 === charcode_minus) {
+ result.set([charcode_slash], result_len);
+ result_len += 1;
+ i += 1;
+ continue;
+ }
+ if ((i + 4) < value.length) {
+ let c1 = value[i+1];
+ if (c0 === charcode_backslash && c1 === charcode_x) {
+ let h1 = parse_hex_digit(value[i+2]);
+ let h0 = parse_hex_digit(value[i+3]);
+ let ord = h1*16+h0;
+ result.set([ord], result_len);
+ result_len += 1;
+ i += 4;
+ continue;
+ }
+ }
+ result.set([c0], result_len);
+ result_len += 1;
+ i += 1;
+ }
+
+ return new TextDecoder().decode(result.slice(0, result.len));
+ },
+
parse_task_upid: function(upid) {
let task = {};
}
task.starttime = parseInt(res[6], 16);
task.type = res[7];
- task.id = res[8];
+ task.id = Proxmox.Utils.systemd_unescape(res[8]);
task.user = res[9];
task.desc = Proxmox.Utils.format_task_description(task.type, task.id);
}
// try to normalize - and _ separators, to support asciidoc and sphinx
// references at the same time.
- let section_minus_normalized = section.replace(/_/, '-');
+ let section_minus_normalized = section.replace(/_/g, '-');
if (helpMap[section_minus_normalized]) {
return helpMap[section_minus_normalized];
}
- let section_underscore_normalized = section.replace(/-/, '_');
+ let section_underscore_normalized = section.replace(/-/g, '_');
return helpMap[section_underscore_normalized];
},
me.IP64_match = new RegExp("^(?:" + IPV6_REGEXP + "|" + IPV4_REGEXP + ")$");
me.IP64_cidr_match = new RegExp("^(?:" + IPV6_REGEXP + "/" + IPV6_CIDR_MASK + ")|(?:" + IPV4_REGEXP + "/" + IPV4_CIDR_MASK + ")$");
- let DnsName_REGEXP = "(?:(([a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*([A-Za-z0-9]([A-Za-z0-9\\-]*[A-Za-z0-9])?))";
+ let DnsName_REGEXP = "(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*(?:[A-Za-z0-9](?:[A-Za-z0-9\\-]*[A-Za-z0-9])?))";
me.DnsName_match = new RegExp("^" + DnsName_REGEXP + "$");
- me.HostPort_match = new RegExp("^(" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")(:\\d+)?$");
- me.HostPortBrackets_match = new RegExp("^\\[(?:" + IPV6_REGEXP + "|" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")\\](:\\d+)?$");
- me.IP6_dotnotation_match = new RegExp("^" + IPV6_REGEXP + "(\\.\\d+)?$");
- me.Vlan_match = /^vlan(\\d+)/;
- me.VlanInterface_match = /(\\w+)\\.(\\d+)/;
+ me.HostPort_match = new RegExp("^(" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")(?::(\\d+))?$");
+ me.HostPortBrackets_match = new RegExp("^\\[(" + IPV6_REGEXP + "|" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")\\](?::(\\d+))?$");
+ me.IP6_dotnotation_match = new RegExp("^(" + IPV6_REGEXP + ")(?:\\.(\\d+))?$");
+ me.Vlan_match = /^vlan(\d+)/;
+ me.VlanInterface_match = /(\w+)\.(\d+)/;
},
});