2015-04-14 13:28:18 +02:00
Ext . ns ( 'PVE' ) ;
2016-02-17 14:53:57 +01:00
// avoid errors related to Accessible Rich Internet Applications
// (access for people with disabilities)
2016-04-15 15:26:29 +02:00
// TODO reenable after all components are upgraded
2016-02-17 14:53:57 +01:00
Ext . enableAria = false ;
Ext . enableAriaButtons = false ;
Ext . enableAriaPanels = false ;
2015-04-14 13:28:18 +02:00
// avoid errors when running without development tools
2016-04-15 15:26:29 +02:00
if ( ! Ext . isDefined ( Ext . global . console ) ) {
var console = {
log : function ( ) { }
2015-04-14 13:28:18 +02:00
} ;
}
2016-04-15 15:26:29 +02:00
console . log ( "Starting PVE Manager" ) ;
2015-04-14 13:28:18 +02:00
Ext . Ajax . defaultHeaders = {
'Accept' : 'application/json'
} ;
2016-10-18 12:13:55 +02:00
Ext . define ( 'PVE.Utils' , { utilities : {
2015-04-14 13:28:18 +02:00
2016-10-18 12:13:55 +02:00
// this singleton contains miscellaneous utilities
2015-04-14 13:28:18 +02:00
2016-04-15 15:26:29 +02:00
toolkit : undefined , // (extjs|touch), set inside Toolkit.js
2015-04-14 13:28:18 +02:00
2016-10-06 11:01:25 +02:00
bus _match : /^(ide|sata|virtio|scsi)\d+$/ ,
2015-04-14 13:28:18 +02:00
log _severity _hash : {
0 : "panic" ,
1 : "alert" ,
2 : "critical" ,
3 : "error" ,
4 : "warning" ,
5 : "notice" ,
6 : "info" ,
7 : "debug"
} ,
support _level _hash : {
'c' : gettext ( 'Community' ) ,
'b' : gettext ( 'Basic' ) ,
's' : gettext ( 'Standard' ) ,
'p' : gettext ( 'Premium' )
} ,
noSubKeyHtml : 'You do not have a valid subscription for this server. Please visit <a target="_blank" href="http://www.proxmox.com/products/proxmox-ve/subscription-service-plans">www.proxmox.com</a> to get a list of available options.' ,
kvm _ostypes : {
2017-09-22 14:20:23 +02:00
'Linux' : [
{ desc : '4.X/3.X/2.6 Kernel' , val : 'l26' } ,
{ desc : '2.4 Kernel' , val : 'l24' }
] ,
'Microsoft Windows' : [
{ desc : '10/2016' , val : 'win10' } ,
{ desc : '8.x/2012/2012r2' , val : 'win8' } ,
{ desc : '7/2008r2' , val : 'win7' } ,
{ desc : 'Vista/2008' , val : 'w2k8' } ,
{ desc : 'XP/2003' , val : 'wxp' } ,
{ desc : '2000' , val : 'w2k' }
] ,
'Solaris Kernel' : [
{ desc : '-' , val : 'solaris' }
] ,
'Other' : [
{ desc : '-' , val : 'other' }
]
2015-04-14 13:28:18 +02:00
} ,
2016-11-22 12:32:10 +01:00
get _health _icon : function ( state , circle ) {
if ( circle === undefined ) {
circle = false ;
}
if ( state === undefined ) {
state = 'uknown' ;
}
var icon = 'faded fa-question' ;
switch ( state ) {
case 'good' :
icon = 'good fa-check' ;
break ;
case 'warning' :
icon = 'warning fa-exclamation' ;
break ;
case 'critical' :
icon = 'critical fa-times' ;
break ;
default : break ;
}
if ( circle ) {
icon += '-circle' ;
}
return icon ;
} ,
2016-11-22 12:32:11 +01:00
map _ceph _health : {
'HEALTH_OK' : 'good' ,
'HEALTH_WARN' : 'warning' ,
'HEALTH_ERR' : 'critical'
} ,
2017-07-20 16:16:11 +02:00
render _ceph _health : function ( healthObj ) {
2016-11-22 12:32:11 +01:00
var state = {
iconCls : PVE . Utils . get _health _icon ( ) ,
text : ''
} ;
2017-07-20 16:16:11 +02:00
if ( ! healthObj || ! healthObj . status ) {
2016-11-22 12:32:11 +01:00
return state ;
}
2017-07-20 16:16:11 +02:00
var health = PVE . Utils . map _ceph _health [ healthObj . status ] ;
2016-11-22 12:32:11 +01:00
state . iconCls = PVE . Utils . get _health _icon ( health , true ) ;
2017-07-20 16:16:11 +02:00
state . text = healthObj . status ;
2016-11-22 12:32:11 +01:00
return state ;
} ,
2017-09-22 14:20:23 +02:00
get _kvm _osinfo : function ( value ) {
var info = { base : 'Other' } ; // default
if ( value ) {
Ext . each ( Object . keys ( PVE . Utils . kvm _ostypes ) , function ( k ) {
Ext . each ( PVE . Utils . kvm _ostypes [ k ] , function ( e ) {
if ( e . val === value ) {
info = { desc : e . desc , base : k } ;
}
} ) ;
} ) ;
2015-04-14 13:28:18 +02:00
}
2017-09-22 14:20:23 +02:00
return info ;
} ,
render _kvm _ostype : function ( value ) {
var osinfo = PVE . Utils . get _kvm _osinfo ( value ) ;
if ( osinfo . desc && osinfo . desc !== '-' ) {
return osinfo . base + ' ' + osinfo . desc ;
} else {
return osinfo . base ;
2015-04-14 13:28:18 +02:00
}
} ,
render _hotplug _features : function ( value ) {
2016-03-31 11:13:50 +02:00
var fa = [ ] ;
2015-04-14 13:28:18 +02:00
if ( ! value || ( value === '0' ) ) {
2017-01-18 09:46:03 +01:00
return gettext ( 'Disabled' ) ;
2015-04-14 13:28:18 +02:00
}
2016-05-11 11:40:31 +02:00
if ( value === '1' ) {
value = 'disk,network,usb' ;
}
2015-04-14 13:28:18 +02:00
Ext . each ( value . split ( ',' ) , function ( el ) {
if ( el === 'disk' ) {
fa . push ( gettext ( 'Disk' ) ) ;
} else if ( el === 'network' ) {
fa . push ( gettext ( 'Network' ) ) ;
} else if ( el === 'usb' ) {
2017-03-01 11:34:07 +01:00
fa . push ( 'USB' ) ;
2015-04-14 13:28:18 +02:00
} else if ( el === 'memory' ) {
fa . push ( gettext ( 'Memory' ) ) ;
} else if ( el === 'cpu' ) {
fa . push ( gettext ( 'CPU' ) ) ;
} else {
fa . push ( el ) ;
}
} ) ;
return fa . join ( ', ' ) ;
} ,
2016-03-21 10:53:09 +01:00
render _qemu _bios : function ( value ) {
if ( ! value ) {
2018-01-15 15:18:09 +01:00
return Proxmox . Utils . defaultText + ' (SeaBIOS)' ;
2016-03-21 10:53:09 +01:00
} else if ( value === 'seabios' ) {
return "SeaBIOS" ;
} else if ( value === 'ovmf' ) {
return "OVMF (UEFI)" ;
} else {
return value ;
}
} ,
2015-04-14 13:28:18 +02:00
render _scsihw : function ( value ) {
if ( ! value ) {
2018-01-15 15:18:09 +01:00
return Proxmox . Utils . defaultText + ' (LSI 53C895A)' ;
2015-04-14 13:28:18 +02:00
} else if ( value === 'lsi' ) {
return 'LSI 53C895A' ;
} else if ( value === 'lsi53c810' ) {
return 'LSI 53C810' ;
} else if ( value === 'megasas' ) {
return 'MegaRAID SAS 8708EM2' ;
} else if ( value === 'virtio-scsi-pci' ) {
2016-06-08 11:24:05 +02:00
return 'VirtIO SCSI' ;
} else if ( value === 'virtio-scsi-single' ) {
return 'VirtIO SCSI single' ;
2015-04-14 13:28:18 +02:00
} else if ( value === 'pvscsi' ) {
return 'VMware PVSCSI' ;
} else {
return value ;
}
} ,
// fixme: auto-generate this
// for now, please keep in sync with PVE::Tools::kvmkeymaps
kvm _keymaps : {
//ar: 'Arabic',
da : 'Danish' ,
2016-04-15 15:26:29 +02:00
de : 'German' ,
'de-ch' : 'German (Swiss)' ,
'en-gb' : 'English (UK)' ,
2015-07-27 16:00:13 +02:00
'en-us' : 'English (USA)' ,
2015-04-14 13:28:18 +02:00
es : 'Spanish' ,
//et: 'Estonia',
fi : 'Finnish' ,
2016-04-15 15:26:29 +02:00
//fo: 'Faroe Islands',
fr : 'French' ,
'fr-be' : 'French (Belgium)' ,
2015-04-14 13:28:18 +02:00
'fr-ca' : 'French (Canada)' ,
'fr-ch' : 'French (Swiss)' ,
//hr: 'Croatia',
hu : 'Hungarian' ,
is : 'Icelandic' ,
2016-04-15 15:26:29 +02:00
it : 'Italian' ,
2015-04-14 13:28:18 +02:00
ja : 'Japanese' ,
lt : 'Lithuanian' ,
//lv: 'Latvian',
2016-04-15 15:26:29 +02:00
mk : 'Macedonian' ,
2015-04-14 13:28:18 +02:00
nl : 'Dutch' ,
//'nl-be': 'Dutch (Belgium)',
2016-04-15 15:26:29 +02:00
no : 'Norwegian' ,
2015-04-14 13:28:18 +02:00
pl : 'Polish' ,
pt : 'Portuguese' ,
'pt-br' : 'Portuguese (Brazil)' ,
//ru: 'Russian',
sl : 'Slovenian' ,
sv : 'Swedish' ,
//th: 'Thai',
tr : 'Turkish'
} ,
kvm _vga _drivers : {
std : gettext ( 'Standard VGA' ) ,
2016-06-08 11:22:13 +02:00
vmware : gettext ( 'VMware compatible' ) ,
2015-04-14 13:28:18 +02:00
qxl : 'SPICE' ,
qxl2 : 'SPICE dual monitor' ,
qxl3 : 'SPICE three monitors' ,
qxl4 : 'SPICE four monitors' ,
serial0 : gettext ( 'Serial terminal' ) + ' 0' ,
serial1 : gettext ( 'Serial terminal' ) + ' 1' ,
serial2 : gettext ( 'Serial terminal' ) + ' 2' ,
serial3 : gettext ( 'Serial terminal' ) + ' 3'
} ,
render _kvm _language : function ( value ) {
2018-01-15 15:18:09 +01:00
if ( ! value || value === '__default__' ) {
return Proxmox . Utils . defaultText ;
2015-04-14 13:28:18 +02:00
}
var text = PVE . Utils . kvm _keymaps [ value ] ;
if ( text ) {
return text + ' (' + value + ')' ;
}
return value ;
} ,
kvm _keymap _array : function ( ) {
2016-02-29 12:54:47 +01:00
var data = [ [ '__default__' , PVE . Utils . render _kvm _language ( '' ) ] ] ;
2015-04-14 13:28:18 +02:00
Ext . Object . each ( PVE . Utils . kvm _keymaps , function ( key , value ) {
data . push ( [ key , PVE . Utils . render _kvm _language ( value ) ] ) ;
} ) ;
return data ;
} ,
2018-04-20 15:37:47 +02:00
console _map : {
'__default__' : Proxmox . Utils . defaultText + ' (HTML5)' ,
'vv' : 'SPICE (remote-viewer)' ,
'html5' : 'HTML5 (noVNC)' ,
2018-04-25 11:37:49 +02:00
'xtermjs' : 'xterm.js'
2018-04-20 15:37:47 +02:00
} ,
2015-04-14 13:28:18 +02:00
render _console _viewer : function ( value ) {
2018-04-20 15:37:47 +02:00
value = value || '__default__' ;
if ( PVE . Utils . console _map [ value ] ) {
return PVE . Utils . console _map [ value ] ;
2015-04-14 13:28:18 +02:00
}
2018-04-20 15:37:47 +02:00
return value ;
2015-04-14 13:28:18 +02:00
} ,
2017-12-06 15:09:23 +01:00
console _viewer _array : function ( ) {
2018-04-20 15:37:47 +02:00
return Ext . Array . map ( Object . keys ( PVE . Utils . console _map ) , function ( v ) {
2017-12-06 15:09:23 +01:00
return [ v , PVE . Utils . render _console _viewer ( v ) ] ;
} ) ;
} ,
2015-04-14 13:28:18 +02:00
render _kvm _vga _driver : function ( value ) {
if ( ! value ) {
2018-01-15 15:18:09 +01:00
return Proxmox . Utils . defaultText ;
2015-04-14 13:28:18 +02:00
}
var text = PVE . Utils . kvm _vga _drivers [ value ] ;
2016-04-15 15:26:29 +02:00
if ( text ) {
2015-04-14 13:28:18 +02:00
return text + ' (' + value + ')' ;
}
return value ;
} ,
kvm _vga _driver _array : function ( ) {
2016-02-29 12:54:47 +01:00
var data = [ [ '__default__' , PVE . Utils . render _kvm _vga _driver ( '' ) ] ] ;
2015-04-14 13:28:18 +02:00
Ext . Object . each ( PVE . Utils . kvm _vga _drivers , function ( key , value ) {
data . push ( [ key , PVE . Utils . render _kvm _vga _driver ( value ) ] ) ;
} ) ;
return data ;
} ,
render _kvm _startup : function ( value ) {
var startup = PVE . Parser . parseStartup ( value ) ;
var res = 'order=' ;
if ( startup . order === undefined ) {
res += 'any' ;
} else {
res += startup . order ;
}
if ( startup . up !== undefined ) {
res += ',up=' + startup . up ;
}
if ( startup . down !== undefined ) {
res += ',down=' + startup . down ;
}
return res ;
} ,
extractFormActionError : function ( action ) {
var msg ;
switch ( action . failureType ) {
case Ext . form . action . Action . CLIENT _INVALID :
msg = gettext ( 'Form fields may not be submitted with invalid values' ) ;
break ;
case Ext . form . action . Action . CONNECT _FAILURE :
msg = gettext ( 'Connection error' ) ;
var resp = action . response ;
if ( resp . status && resp . statusText ) {
msg += " " + resp . status + ": " + resp . statusText ;
}
break ;
case Ext . form . action . Action . LOAD _FAILURE :
case Ext . form . action . Action . SERVER _INVALID :
2018-01-15 15:18:09 +01:00
msg = Proxmox . Utils . extractRequestError ( action . result , true ) ;
2015-04-14 13:28:18 +02:00
break ;
}
return msg ;
} ,
format _duration _short : function ( ut ) {
2016-04-15 15:26:29 +02:00
2015-04-14 13:28:18 +02:00
if ( ut < 60 ) {
2017-06-19 16:25:48 +02:00
return ut . toFixed ( 1 ) + 's' ;
2015-04-14 13:28:18 +02:00
}
if ( ut < 3600 ) {
var mins = ut / 60 ;
2017-06-19 16:25:48 +02:00
return mins . toFixed ( 1 ) + 'm' ;
2015-04-14 13:28:18 +02:00
}
if ( ut < 86400 ) {
var hours = ut / 3600 ;
2017-06-19 16:25:48 +02:00
return hours . toFixed ( 1 ) + 'h' ;
2015-04-14 13:28:18 +02:00
}
var days = ut / 86400 ;
2017-06-19 16:25:48 +02:00
return days . toFixed ( 1 ) + 'd' ;
2015-04-14 13:28:18 +02:00
} ,
imagesText : gettext ( 'Disk image' ) ,
backupFileText : gettext ( 'VZDump backup file' ) ,
2015-05-01 11:37:13 +02:00
vztmplText : gettext ( 'Container template' ) ,
2015-04-14 13:28:18 +02:00
isoImageText : gettext ( 'ISO image' ) ,
2015-05-01 11:37:13 +02:00
containersText : gettext ( 'Container' ) ,
2015-04-14 13:28:18 +02:00
2018-03-27 14:19:44 +02:00
storageSchema : {
dir : {
name : Proxmox . Utils . directoryText ,
ipanel : 'DirInputPanel' ,
faIcon : 'folder'
} ,
lvm : {
name : 'LVM' ,
ipanel : 'LVMInputPanel' ,
faIcon : 'folder'
} ,
lvmthin : {
name : 'LVM-Thin' ,
ipanel : 'LvmThinInputPanel' ,
faIcon : 'folder'
} ,
nfs : {
name : 'NFS' ,
ipanel : 'NFSInputPanel' ,
faIcon : 'building'
} ,
cifs : {
name : 'CIFS' ,
ipanel : 'CIFSInputPanel' ,
faIcon : 'building'
} ,
glusterfs : {
name : 'GlusterFS' ,
ipanel : 'GlusterFsInputPanel' ,
faIcon : 'building'
} ,
iscsi : {
name : 'iSCSI' ,
ipanel : 'IScsiInputPanel' ,
faIcon : 'building'
} ,
sheepdog : {
name : 'Sheepdog' ,
ipanel : 'SheepdogInputPanel' ,
hideAdd : true ,
faIcon : 'building'
} ,
rbd : {
name : 'RBD' ,
ipanel : 'RBDInputPanel' ,
hideAdd : true ,
faIcon : 'building'
} ,
rbd _ext : {
name : 'RBD (external)' ,
ipanel : 'RBDInputPanel' ,
faIcon : 'building'
} ,
pveceph : {
name : 'RBD (PVE)' ,
ipanel : 'PVERBDInputPanel' ,
faIcon : 'building'
} ,
zfs : {
name : 'ZFS over iSCSI' ,
ipanel : 'ZFSInputPanel' ,
faIcon : 'building'
} ,
zfspool : {
name : 'ZFS' ,
ipanel : 'ZFSPoolInputPanel' ,
faIcon : 'folder'
} ,
drbd : {
name : 'DRBD' ,
hideAdd : true
}
} ,
2017-09-05 16:23:48 +02:00
format _storage _type : function ( value , md , record ) {
2017-09-07 12:48:28 +02:00
if ( value === 'rbd' && record ) {
value = ( record . get ( 'monhost' ) ? 'rbd_ext' : 'pveceph' ) ;
2017-09-05 16:23:48 +02:00
}
2018-03-27 14:19:44 +02:00
var schema = PVE . Utils . storageSchema [ value ] ;
if ( schema ) {
return schema . name ;
2015-04-14 13:28:18 +02:00
}
2018-03-27 14:19:44 +02:00
return Proxmox . Utils . unknownText ;
2017-01-23 15:24:32 +01:00
} ,
2016-04-18 14:52:04 +02:00
format _ha : function ( value ) {
2018-01-15 15:18:09 +01:00
var text = Proxmox . Utils . noneText ;
2016-04-18 14:52:04 +02:00
if ( value . managed ) {
2018-01-15 15:18:09 +01:00
text = value . state || Proxmox . Utils . noneText ;
2016-04-18 14:52:04 +02:00
2018-01-15 15:18:09 +01:00
text += ', ' + Proxmox . Utils . groupText + ': ' ;
text += value . group || Proxmox . Utils . noneText ;
2016-04-18 14:52:04 +02:00
}
return text ;
} ,
2015-04-14 13:28:18 +02:00
format _content _types : function ( value ) {
var cta = [ ] ;
Ext . each ( value . split ( ',' ) . sort ( ) , function ( ct ) {
if ( ct === 'images' ) {
cta . push ( PVE . Utils . imagesText ) ;
} else if ( ct === 'backup' ) {
cta . push ( PVE . Utils . backupFileText ) ;
} else if ( ct === 'vztmpl' ) {
cta . push ( PVE . Utils . vztmplText ) ;
} else if ( ct === 'iso' ) {
cta . push ( PVE . Utils . isoImageText ) ;
} else if ( ct === 'rootdir' ) {
cta . push ( PVE . Utils . containersText ) ;
}
} ) ;
return cta . join ( ', ' ) ;
} ,
render _storage _content : function ( value , metaData , record ) {
var data = record . data ;
if ( Ext . isNumber ( data . channel ) &&
Ext . isNumber ( data . id ) &&
Ext . isNumber ( data . lun ) ) {
2016-04-15 15:26:29 +02:00
return "CH " +
Ext . String . leftPad ( data . channel , 2 , '0' ) +
2015-04-14 13:28:18 +02:00
" ID " + data . id + " LUN " + data . lun ;
}
return data . volid . replace ( /^.*:(.*\/)?/ , '' ) ;
} ,
render _serverity : function ( value ) {
return PVE . Utils . log _severity _hash [ value ] || value ;
} ,
render _cpu : function ( value , metaData , record , rowIndex , colIndex , store ) {
if ( ! ( record . data . uptime && Ext . isNumeric ( value ) ) ) {
return '' ;
}
var maxcpu = record . data . maxcpu || 1 ;
if ( ! Ext . isNumeric ( maxcpu ) && ( maxcpu >= 1 ) ) {
return '' ;
}
2016-04-15 15:26:29 +02:00
2015-04-14 13:28:18 +02:00
var per = value * 100 ;
return per . toFixed ( 1 ) + '% of ' + maxcpu . toString ( ) + ( maxcpu > 1 ? 'CPUs' : 'CPU' ) ;
} ,
render _size : function ( value , metaData , record , rowIndex , colIndex , store ) {
/*jslint confusion: true */
if ( ! Ext . isNumeric ( value ) ) {
return '' ;
}
2018-01-15 15:18:09 +01:00
return Proxmox . Utils . format _size ( value ) ;
2015-04-14 13:28:18 +02:00
} ,
2016-11-22 12:32:14 +01:00
render _bandwidth : function ( value ) {
if ( ! Ext . isNumeric ( value ) ) {
return '' ;
}
2018-01-15 15:18:09 +01:00
return Proxmox . Utils . format _size ( value ) + '/s' ;
2015-04-14 13:28:18 +02:00
} ,
2017-01-31 16:48:49 +01:00
render _timestamp _human _readable : function ( value ) {
return Ext . Date . format ( new Date ( value * 1000 ) , 'l d F Y H:i:s' ) ;
} ,
2017-06-13 14:56:01 +02:00
render _duration : function ( value ) {
if ( value === undefined ) {
return '-' ;
}
return PVE . Utils . format _duration _short ( value ) ;
} ,
2016-04-15 15:26:27 +02:00
calculate _mem _usage : function ( data ) {
if ( ! Ext . isNumeric ( data . mem ) ||
data . maxmem === 0 ||
data . uptime < 1 ) {
return - 1 ;
}
return ( data . mem / data . maxmem ) ;
} ,
render _mem _usage _percent : function ( value , metaData , record , rowIndex , colIndex , store ) {
if ( ! Ext . isNumeric ( value ) || value === - 1 ) {
return '' ;
}
if ( value > 1 ) {
// we got no percentage but bytes
var mem = value ;
var maxmem = record . data . maxmem ;
if ( ! record . data . uptime ||
maxmem === 0 ||
! Ext . isNumeric ( mem ) ) {
return '' ;
}
return ( ( mem * 100 ) / maxmem ) . toFixed ( 1 ) + " %" ;
}
return ( value * 100 ) . toFixed ( 1 ) + " %" ;
} ,
2015-04-14 13:28:18 +02:00
render _mem _usage : function ( value , metaData , record , rowIndex , colIndex , store ) {
var mem = value ;
var maxmem = record . data . maxmem ;
2016-04-15 15:26:29 +02:00
2015-04-14 13:28:18 +02:00
if ( ! record . data . uptime ) {
return '' ;
}
if ( ! ( Ext . isNumeric ( mem ) && maxmem ) ) {
return '' ;
}
2016-04-15 15:26:28 +02:00
return PVE . Utils . render _size ( value ) ;
2015-04-14 13:28:18 +02:00
} ,
2016-04-15 15:26:27 +02:00
calculate _disk _usage : function ( data ) {
if ( ! Ext . isNumeric ( data . disk ) ||
data . type === 'qemu' ||
( data . type === 'lxc' && data . uptime === 0 ) ||
data . maxdisk === 0 ) {
return - 1 ;
}
return ( data . disk / data . maxdisk ) ;
} ,
render _disk _usage _percent : function ( value , metaData , record , rowIndex , colIndex , store ) {
if ( ! Ext . isNumeric ( value ) || value === - 1 ) {
return '' ;
}
return ( value * 100 ) . toFixed ( 1 ) + " %" ;
} ,
2015-04-14 13:28:18 +02:00
render _disk _usage : function ( value , metaData , record , rowIndex , colIndex , store ) {
var disk = value ;
var maxdisk = record . data . maxdisk ;
2016-04-15 15:26:28 +02:00
var type = record . data . type ;
2015-04-14 13:28:18 +02:00
2016-04-15 15:26:28 +02:00
if ( ! Ext . isNumeric ( disk ) ||
type === 'qemu' ||
maxdisk === 0 ||
( type === 'lxc' && record . data . uptime === 0 ) ) {
2015-04-14 13:28:18 +02:00
return '' ;
}
2016-04-15 15:26:28 +02:00
return PVE . Utils . render _size ( value ) ;
2015-04-14 13:28:18 +02:00
} ,
2017-11-03 09:51:37 +01:00
get _object _icon _class : function ( type , record ) {
var status = '' ;
var objType = type ;
if ( type === 'type' ) {
// for folder view
objType = record . groupbyid ;
} else if ( record . template ) {
// templates
objType = 'template' ;
status = type ;
} else {
// everything else
status = record . status + ' ha-' + record . hastate ;
2016-04-11 10:19:02 +02:00
}
2017-11-03 09:51:37 +01:00
var defaults = PVE . tree . ResourceTree . typeDefaults [ objType ] ;
if ( defaults && defaults . iconCls ) {
var retVal = defaults . iconCls + ' ' + status ;
return retVal ;
2015-04-14 13:28:18 +02:00
}
2017-11-03 09:51:37 +01:00
return '' ;
} ,
render _resource _type : function ( value , metaData , record , rowIndex , colIndex , store ) {
var cls = PVE . Utils . get _object _icon _class ( value , record . data ) ;
2016-10-25 14:12:23 +02:00
2017-11-03 09:51:37 +01:00
var fa = '<i class="fa-fw x-grid-icon-custom ' + cls + '"></i> ' ;
2016-04-11 10:19:02 +02:00
return fa + value ;
2015-04-14 13:28:18 +02:00
} ,
render _support _level : function ( value , metaData , record ) {
return PVE . Utils . support _level _hash [ value ] || '-' ;
} ,
2016-04-15 15:26:29 +02:00
render _upid : function ( value , metaData , record ) {
2015-04-14 13:28:18 +02:00
var type = record . data . type ;
var id = record . data . id ;
2018-01-15 15:18:09 +01:00
return Proxmox . Utils . format _task _description ( type , id ) ;
2015-04-14 13:28:18 +02:00
} ,
2016-08-19 10:47:48 +02:00
/* render functions for new status panel */
render _usage : function ( val ) {
return ( val * 100 ) . toFixed ( 2 ) + '%' ;
} ,
render _cpu _usage : function ( val , max ) {
return Ext . String . format ( gettext ( '{0}% of {1}' ) +
' ' + gettext ( 'CPU(s)' ) , ( val * 100 ) . toFixed ( 2 ) , max ) ;
} ,
render _size _usage : function ( val , max ) {
2016-10-12 12:04:36 +02:00
if ( max === 0 ) {
return gettext ( 'N/A' ) ;
}
2016-08-19 10:47:48 +02:00
return ( val * 100 / max ) . toFixed ( 2 ) + '% ' + '(' +
Ext . String . format ( gettext ( '{0} of {1}' ) ,
PVE . Utils . render _size ( val ) , PVE . Utils . render _size ( max ) ) + ')' ;
} ,
/* this is different for nodes */
render _node _cpu _usage : function ( value , record ) {
return PVE . Utils . render _cpu _usage ( value , record . cpus ) ;
} ,
/* this is different for nodes */
render _node _size _usage : function ( record ) {
return PVE . Utils . render _size _usage ( record . used , record . total ) ;
} ,
2018-05-04 11:53:33 +02:00
render _optional _url : function ( value ) {
var match ;
if ( value && ( match = value . match ( /^https?:\/\// ) ) !== null ) {
2018-05-08 12:18:01 +02:00
return '<a target="_blank" href="' + value + '">' + value + '</a>' ;
2018-05-04 11:53:33 +02:00
}
return value ;
} ,
render _san : function ( value ) {
var names = [ ] ;
if ( Ext . isArray ( value ) ) {
value . forEach ( function ( val ) {
if ( ! Ext . isNumber ( val ) ) {
names . push ( val ) ;
}
} ) ;
return names . join ( '<br>' ) ;
}
return value ;
} ,
2015-05-26 16:09:38 +02:00
windowHostname : function ( ) {
2018-01-15 15:18:09 +01:00
return window . location . hostname . replace ( Proxmox . Utils . IP6 _bracket _match ,
2015-05-26 16:09:38 +02:00
function ( m , addr , offset , original ) { return addr ; } ) ;
} ,
2016-04-15 15:26:29 +02:00
2018-04-20 15:37:47 +02:00
openDefaultConsoleWindow : function ( consoles , vmtype , vmid , nodename , vmname ) {
var dv = PVE . Utils . defaultViewer ( consoles ) ;
2015-04-14 13:28:18 +02:00
PVE . Utils . openConsoleWindow ( dv , vmtype , vmid , nodename , vmname ) ;
} ,
openConsoleWindow : function ( viewer , vmtype , vmid , nodename , vmname ) {
2015-04-18 09:47:58 +02:00
// kvm, lxc, shell, upgrade
2015-04-14 13:28:18 +02:00
2015-04-18 09:47:58 +02:00
if ( vmid == undefined && ( vmtype === 'kvm' || vmtype === 'lxc' ) ) {
2015-04-14 13:28:18 +02:00
throw "missing vmid" ;
}
if ( ! nodename ) {
throw "no nodename specified" ;
}
2016-02-26 15:33:44 +01:00
if ( viewer === 'html5' ) {
PVE . Utils . openVNCViewer ( vmtype , vmid , nodename , vmname ) ;
2017-12-11 14:55:28 +01:00
} else if ( viewer === 'xtermjs' ) {
2018-01-15 15:18:09 +01:00
Proxmox . Utils . openXtermJsViewer ( vmtype , vmid , nodename , vmname ) ;
2015-04-14 13:28:18 +02:00
} else if ( viewer === 'vv' ) {
var url ;
2015-05-26 16:09:38 +02:00
var params = { proxy : PVE . Utils . windowHostname ( ) } ;
2015-04-14 13:28:18 +02:00
if ( vmtype === 'kvm' ) {
url = '/nodes/' + nodename + '/qemu/' + vmid . toString ( ) + '/spiceproxy' ;
PVE . Utils . openSpiceViewer ( url , params ) ;
2015-04-18 09:47:58 +02:00
} else if ( vmtype === 'lxc' ) {
url = '/nodes/' + nodename + '/lxc/' + vmid . toString ( ) + '/spiceproxy' ;
2015-04-14 13:28:18 +02:00
PVE . Utils . openSpiceViewer ( url , params ) ;
} else if ( vmtype === 'shell' ) {
url = '/nodes/' + nodename + '/spiceshell' ;
PVE . Utils . openSpiceViewer ( url , params ) ;
} else if ( vmtype === 'upgrade' ) {
url = '/nodes/' + nodename + '/spiceshell' ;
params . upgrade = 1 ;
PVE . Utils . openSpiceViewer ( url , params ) ;
}
} else {
throw "unknown viewer type" ;
}
} ,
2018-04-20 15:37:47 +02:00
defaultViewer : function ( consoles ) {
var allowSpice , allowXtermjs ;
if ( consoles === true ) {
allowSpice = true ;
allowXtermjs = true ;
} else if ( typeof consoles === 'object' ) {
allowSpice = consoles . spice ;
2018-04-25 11:37:49 +02:00
allowXtermjs = ! ! consoles . xtermjs ;
2018-04-20 15:37:47 +02:00
}
2015-04-14 13:28:18 +02:00
var vncdefault = 'html5' ;
var dv = PVE . VersionInfo . console || vncdefault ;
2018-04-20 15:37:47 +02:00
if ( ( dv === 'vv' && ! allowSpice ) || ( dv === 'xtermjs' && ! allowXtermjs ) ) {
2015-04-14 13:28:18 +02:00
dv = vncdefault ;
}
return dv ;
} ,
2016-02-26 15:33:44 +01:00
openVNCViewer : function ( vmtype , vmid , nodename , vmname ) {
2015-04-14 13:28:18 +02:00
var url = Ext . urlEncode ( {
2015-04-18 09:47:58 +02:00
console : vmtype , // kvm, lxc, upgrade or shell
2016-02-26 15:33:44 +01:00
novnc : 1 ,
2015-04-14 13:28:18 +02:00
vmid : vmid ,
vmname : vmname ,
node : nodename
} ) ;
var nw = window . open ( "?" + url , '_blank' , "innerWidth=745,innerheight=427" ) ;
nw . focus ( ) ;
} ,
openSpiceViewer : function ( url , params ) {
var downloadWithName = function ( uri , name ) {
var link = Ext . DomHelper . append ( document . body , {
tag : 'a' ,
href : uri ,
css : 'display:none;visibility:hidden;height:0px;'
} ) ;
// Note: we need to tell android the correct file name extension
// but we do not set 'download' tag for other environments, because
// It can have strange side effects (additional user prompt on firefox)
var andriod = navigator . userAgent . match ( /Android/i ) ? true : false ;
if ( andriod ) {
link . download = name ;
}
if ( link . fireEvent ) {
link . fireEvent ( 'onclick' ) ;
} else {
var evt = document . createEvent ( "MouseEvents" ) ;
evt . initMouseEvent ( 'click' , true , true , window , 1 , 0 , 0 , 0 , 0 , false , false , false , false , 0 , null ) ;
link . dispatchEvent ( evt ) ;
}
} ;
2018-01-15 15:18:09 +01:00
Proxmox . Utils . API2Request ( {
2015-04-14 13:28:18 +02:00
url : url ,
params : params ,
method : 'POST' ,
failure : function ( response , opts ) {
Ext . Msg . alert ( 'Error' , response . htmlStatus ) ;
} ,
success : function ( response , opts ) {
var raw = "[virt-viewer]\n" ;
Ext . Object . each ( response . result . data , function ( k , v ) {
raw += k + "=" + v + "\n" ;
} ) ;
var url = 'data:application/x-virt-viewer;charset=UTF-8,' +
encodeURIComponent ( raw ) ;
2016-04-15 15:26:29 +02:00
2015-04-14 13:28:18 +02:00
downloadWithName ( url , "pve-spice.vv" ) ;
}
} ) ;
} ,
2016-07-21 11:45:12 +02:00
openTreeConsole : function ( tree , record , item , index , e ) {
e . stopEvent ( ) ;
var nodename = record . data . node ;
var vmid = record . data . vmid ;
var vmname = record . data . name ;
if ( record . data . type === 'qemu' && ! record . data . template ) {
2018-01-15 15:18:09 +01:00
Proxmox . Utils . API2Request ( {
2016-07-21 11:45:12 +02:00
url : '/nodes/' + nodename + '/qemu/' + vmid + '/status/current' ,
failure : function ( response , opts ) {
Ext . Msg . alert ( 'Error' , response . htmlStatus ) ;
} ,
success : function ( response , opts ) {
var allowSpice = response . result . data . spice ;
PVE . Utils . openDefaultConsoleWindow ( allowSpice , 'kvm' , vmid , nodename , vmname ) ;
}
} ) ;
} else if ( record . data . type === 'lxc' && ! record . data . template ) {
PVE . Utils . openDefaultConsoleWindow ( true , 'lxc' , vmid , nodename , vmname ) ;
}
} ,
2016-11-12 12:45:21 +01:00
// test automation helper
call _menu _handler : function ( menu , text ) {
var list = menu . query ( 'menuitem' ) ;
Ext . Array . each ( list , function ( item ) {
if ( item . text === text ) {
if ( item . handler ) {
item . handler ( ) ;
return 1 ;
} else {
return undefined ;
}
}
} ) ;
} ,
2016-05-19 14:27:05 +02:00
createCmdMenu : function ( v , record , item , index , event ) {
event . stopEvent ( ) ;
2016-05-27 10:27:15 +02:00
if ( ! ( v instanceof Ext . tree . View ) ) {
v . select ( record ) ;
}
2016-05-19 14:27:05 +02:00
var menu ;
2018-03-21 15:12:17 +01:00
var template = ! ! record . data . template ;
var type = record . data . type ;
2016-05-19 14:27:05 +02:00
2018-03-21 15:12:17 +01:00
if ( template ) {
if ( type === 'qemu' || type == 'lxc' ) {
menu = Ext . create ( 'PVE.menu.TemplateMenu' , {
pveSelNode : record
} ) ;
}
} else if ( type === 'qemu' ||
type === 'lxc' ||
type === 'node' ) {
menu = Ext . create ( 'PVE.' + type + '.CmdMenu' , {
pveSelNode : record ,
2017-04-14 10:09:23 +02:00
nodename : record . data . node
} ) ;
2016-05-19 14:27:05 +02:00
} else {
return ;
}
menu . showAt ( event . getXY ( ) ) ;
2018-01-15 15:18:09 +01:00
} ,
2016-10-18 12:13:55 +02:00
2016-11-02 10:31:19 +01:00
// helper for deleting field which are set to there default values
delete _if _default : function ( values , fieldname , default _val , create ) {
if ( values [ fieldname ] === '' || values [ fieldname ] === default _val ) {
if ( ! create ) {
if ( values [ 'delete' ] ) {
values [ 'delete' ] += ',' + fieldname ;
} else {
values [ 'delete' ] = fieldname ;
}
}
delete values [ fieldname ] ;
}
2018-02-22 14:17:37 +01:00
} ,
loadSSHKeyFromFile : function ( file , callback ) {
// ssh-keygen produces 740 bytes for an average 4096 bit rsa key, with
// a user@host comment, 1420 for 8192 bits; current max is 16kbit
// assume: 740*8 for max. 32kbit (5920 byte file)
// round upwards to nearest nice number => 8192 bytes, leaves lots of comment space
if ( file . size > 8192 ) {
Ext . Msg . alert ( gettext ( 'Error' ) , gettext ( "Invalid file size: " ) + file . size ) ;
return ;
}
/ * g l o b a l
FileReader
* /
var reader = new FileReader ( ) ;
reader . onload = function ( evt ) {
callback ( evt . target . result ) ;
} ;
reader . readAsText ( file ) ;
2018-03-15 16:21:32 +01:00
} ,
bus _counts : { ide : 4 , sata : 6 , scsi : 16 , virtio : 16 } ,
// types is either undefined (all busses), an array of busses, or a single bus
forEachBus : function ( types , func ) {
var busses = Object . keys ( PVE . Utils . bus _counts ) ;
var i , j , count , cont ;
if ( Ext . isArray ( types ) ) {
busses = types ;
} else if ( Ext . isDefined ( types ) ) {
busses = [ types ] ;
}
// check if we only have valid busses
for ( i = 0 ; i < busses . length ; i ++ ) {
if ( ! PVE . Utils . bus _counts [ busses [ i ] ] ) {
throw "invalid bus: '" + busses [ i ] + "'" ;
}
}
for ( i = 0 ; i < busses . length ; i ++ ) {
count = PVE . Utils . bus _counts [ busses [ i ] ] ;
for ( j = 0 ; j < count ; j ++ ) {
cont = func ( busses [ i ] , j ) ;
if ( ! cont && cont !== undefined ) {
return ;
}
}
}
2018-04-05 16:03:55 +02:00
} ,
mp _counts : { mps : 10 , unused : 10 } ,
forEachMP : function ( func , includeUnused ) {
var i , cont ;
for ( i = 0 ; i < PVE . Utils . mp _counts . mps ; i ++ ) {
cont = func ( 'mp' , i ) ;
if ( ! cont && cont !== undefined ) {
return ;
}
}
if ( ! includeUnused ) {
return ;
}
for ( i = 0 ; i < PVE . Utils . mp _counts . unused ; i ++ ) {
cont = func ( 'unused' , i ) ;
if ( ! cont && cont !== undefined ) {
return ;
}
}
2018-01-15 15:18:09 +01:00
}
} ,
2016-11-02 10:31:19 +01:00
2016-10-18 12:13:55 +02:00
singleton : true ,
constructor : function ( ) {
var me = this ;
Ext . apply ( me , me . utilities ) ;
2016-05-19 14:27:05 +02:00
}
2018-01-15 15:18:09 +01:00
2016-10-18 12:13:55 +02:00
} ) ;
2015-04-14 13:28:18 +02:00