2018-12-05 12:39:40 +01:00
Ext . ns ( 'PBS' ) ;
console . log ( "Starting Backup Server GUI" ) ;
Ext . define ( 'PBS.Utils' , {
singleton : true ,
2019-01-30 15:14:20 +01:00
updateLoginData : function ( data ) {
2020-05-29 16:22:14 +02:00
Proxmox . Utils . setAuthData ( data ) ;
2019-01-30 15:14:20 +01:00
} ,
2020-05-20 12:15:38 +02:00
dataStorePrefix : 'DataStore-' ,
2020-07-08 13:32:20 +02:00
cryptmap : [
'none' ,
'mixed' ,
'sign-only' ,
'encrypt' ,
] ,
cryptText : [
Proxmox . Utils . noText ,
gettext ( 'Mixed' ) ,
gettext ( 'Signed' ) ,
gettext ( 'Encrypted' ) ,
] ,
cryptIconCls : [
'' ,
'' ,
2020-07-23 13:03:49 +02:00
'lock faded' ,
'lock good' ,
2020-07-08 13:32:20 +02:00
] ,
2020-07-09 16:50:24 +02:00
calculateCryptMode : function ( data ) {
let mixed = data . mixed ;
let encrypted = data . encrypt ;
let signed = data [ 'sign-only' ] ;
let files = data . count ;
if ( mixed > 0 ) {
return PBS . Utils . cryptmap . indexOf ( 'mixed' ) ;
2020-09-09 16:18:11 +02:00
} else if ( files === encrypted && encrypted > 0 ) {
2020-07-08 13:32:20 +02:00
return PBS . Utils . cryptmap . indexOf ( 'encrypt' ) ;
2020-09-09 16:18:11 +02:00
} else if ( files === signed && signed > 0 ) {
2020-07-08 13:32:20 +02:00
return PBS . Utils . cryptmap . indexOf ( 'sign-only' ) ;
} else if ( ( signed + encrypted ) === 0 ) {
return PBS . Utils . cryptmap . indexOf ( 'none' ) ;
} else {
return PBS . Utils . cryptmap . indexOf ( 'mixed' ) ;
}
} ,
2020-11-10 08:07:49 +01:00
noSubKeyHtml : 'You do not have a valid subscription for this server. Please visit <a target="_blank" href="https://www.proxmox.com/proxmox-backup-server/pricing">www.proxmox.com</a> to get a list of available options.' ,
2020-05-20 12:15:38 +02:00
getDataStoreFromPath : function ( path ) {
return path . slice ( PBS . Utils . dataStorePrefix . length ) ;
} ,
isDataStorePath : function ( path ) {
return path . indexOf ( PBS . Utils . dataStorePrefix ) === 0 ;
} ,
2020-11-06 17:49:42 +01:00
parsePropertyString : function ( value , defaultKey ) {
var res = { } ,
error ;
if ( typeof value !== 'string' || value === '' ) {
return res ;
}
Ext . Array . each ( value . split ( ',' ) , function ( p ) {
var kv = p . split ( '=' , 2 ) ;
if ( Ext . isDefined ( kv [ 1 ] ) ) {
res [ kv [ 0 ] ] = kv [ 1 ] ;
} else if ( Ext . isDefined ( defaultKey ) ) {
if ( Ext . isDefined ( res [ defaultKey ] ) ) {
error = 'defaultKey may be only defined once in propertyString' ;
return false ; // break
}
res [ defaultKey ] = kv [ 0 ] ;
} else {
error = 'invalid propertyString, not a key=value pair and no defaultKey defined' ;
return false ; // break
}
return true ;
} ) ;
if ( error !== undefined ) {
console . error ( error ) ;
return null ;
}
return res ;
} ,
printPropertyString : function ( data , defaultKey ) {
var stringparts = [ ] ,
gotDefaultKeyVal = false ,
defaultKeyVal ;
Ext . Object . each ( data , function ( key , value ) {
if ( defaultKey !== undefined && key === defaultKey ) {
gotDefaultKeyVal = true ;
defaultKeyVal = value ;
} else if ( value !== '' && value !== undefined ) {
stringparts . push ( key + '=' + value ) ;
}
} ) ;
stringparts = stringparts . sort ( ) ;
if ( gotDefaultKeyVal ) {
stringparts . unshift ( defaultKeyVal ) ;
}
return stringparts . join ( ',' ) ;
} ,
// 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 ) {
if ( Ext . isArray ( values . delete ) ) {
values . delete . push ( fieldname ) ;
} else {
values . delete += ',' + fieldname ;
}
} else {
values . delete = [ fieldname ] ;
}
}
delete values [ fieldname ] ;
}
} ,
2020-05-26 18:16:38 +02:00
render _datetime _utc : function ( datetime ) {
let pad = ( number ) => number < 10 ? '0' + number : number ;
return datetime . getUTCFullYear ( ) +
'-' + pad ( datetime . getUTCMonth ( ) + 1 ) +
'-' + pad ( datetime . getUTCDate ( ) ) +
'T' + pad ( datetime . getUTCHours ( ) ) +
':' + pad ( datetime . getUTCMinutes ( ) ) +
':' + pad ( datetime . getUTCSeconds ( ) ) +
'Z' ;
} ,
2020-05-26 13:37:57 +02:00
render _datastore _worker _id : function ( id , what ) {
2020-06-30 13:11:22 +02:00
const res = id . match ( /^(\S+?)_(\S+?)_(\S+?)(_(.+))?$/ ) ;
2020-05-26 18:17:01 +02:00
if ( res ) {
2020-09-25 18:40:03 +02:00
let datastore = res [ 1 ] , backupGroup = ` ${ res [ 2 ] } / ${ res [ 3 ] } ` ;
2020-06-30 13:11:22 +02:00
if ( res [ 4 ] !== undefined ) {
let datetime = Ext . Date . parse ( parseInt ( res [ 5 ] , 16 ) , 'U' ) ;
let utctime = PBS . Utils . render _datetime _utc ( datetime ) ;
2020-09-25 18:40:03 +02:00
return ` Datastore ${ datastore } ${ what } ${ backupGroup } / ${ utctime } ` ;
2020-06-30 13:11:22 +02:00
} else {
2020-09-25 18:40:03 +02:00
return ` Datastore ${ datastore } ${ what } ${ backupGroup } ` ;
2020-06-30 13:11:22 +02:00
}
2020-05-26 18:17:01 +02:00
}
2020-06-30 13:11:22 +02:00
return ` Datastore ${ what } ${ id } ` ;
2020-05-26 18:17:01 +02:00
} ,
2020-05-26 13:37:57 +02:00
2020-11-09 16:01:24 +01:00
parse _datastore _worker _id : function ( type , id ) {
let result ;
let res ;
if ( type . startsWith ( 'verif' ) ) {
res = PBS . Utils . VERIFICATION _JOB _ID _RE . exec ( id ) ;
if ( res ) {
result = res [ 1 ] ;
}
} else if ( type . startsWith ( 'sync' ) ) {
res = PBS . Utils . SYNC _JOB _ID _RE . exec ( id ) ;
if ( res ) {
result = res [ 3 ] ;
}
} else if ( type === 'backup' ) {
res = PBS . Utils . BACKUP _JOB _ID _RE . exec ( id ) ;
if ( res ) {
result = res [ 1 ] ;
}
} else if ( type === 'garbage_collection' ) {
return id ;
} else if ( type === 'prune' ) {
return id ;
}
return result ;
} ,
2020-10-22 11:40:43 +02:00
extractTokenUser : function ( tokenid ) {
return tokenid . match ( /^(.+)!([^!]+)$/ ) [ 1 ] ;
} ,
extractTokenName : function ( tokenid ) {
return tokenid . match ( /^(.+)!([^!]+)$/ ) [ 2 ] ;
} ,
2020-11-09 16:01:22 +01:00
render _estimate : function ( value ) {
if ( ! value ) {
return gettext ( 'Not enough data' ) ;
}
let now = new Date ( ) ;
let estimate = new Date ( value * 1000 ) ;
let timespan = ( estimate - now ) / 1000 ;
if ( Number ( estimate ) <= Number ( now ) || isNaN ( timespan ) ) {
return gettext ( 'Never' ) ;
}
let duration = Proxmox . Utils . format _duration _human ( timespan ) ;
return Ext . String . format ( gettext ( "in {0}" ) , duration ) ;
} ,
2020-11-09 16:01:23 +01:00
render _size _usage : function ( val , max ) {
if ( max === 0 ) {
return gettext ( 'N/A' ) ;
}
return ( val * 100 / max ) . toFixed ( 2 ) + '% (' +
Ext . String . format ( gettext ( '{0} of {1}' ) ,
Proxmox . Utils . format _size ( val ) , Proxmox . Utils . format _size ( max ) ) + ')' ;
} ,
2018-12-05 12:39:40 +01:00
constructor : function ( ) {
var me = this ;
2020-11-09 16:01:24 +01:00
let PROXMOX _SAFE _ID _REGEX = "([A-Za-z0-9_][A-Za-z0-9._-]*)" ;
// only anchored at beginning
// only parses datastore for now
me . VERIFICATION _JOB _ID _RE = new RegExp ( "^" + PROXMOX _SAFE _ID _REGEX + ':?' ) ;
me . SYNC _JOB _ID _RE = new RegExp ( "^" + PROXMOX _SAFE _ID _REGEX + ':' +
PROXMOX _SAFE _ID _REGEX + ':' + PROXMOX _SAFE _ID _REGEX + ':' ) ;
me . BACKUP _JOB _ID _RE = new RegExp ( "^" + PROXMOX _SAFE _ID _REGEX + ':' ) ;
2018-12-05 12:39:40 +01:00
// do whatever you want here
2020-05-25 19:06:47 +02:00
Proxmox . Utils . override _task _descriptions ( {
2020-10-30 14:02:58 +01:00
backup : ( type , id ) => PBS . Utils . render _datastore _worker _id ( id , gettext ( 'Backup' ) ) ,
dircreate : [ gettext ( 'Directory Storage' ) , gettext ( 'Create' ) ] ,
dirremove : [ gettext ( 'Directory' ) , gettext ( 'Remove' ) ] ,
2020-09-25 18:40:03 +02:00
garbage _collection : [ 'Datastore' , gettext ( 'Garbage collect' ) ] ,
2020-11-04 14:20:44 +01:00
logrotate : [ null , gettext ( 'Log Rotation' ) ] ,
2020-10-30 14:02:58 +01:00
prune : ( type , id ) => PBS . Utils . render _datastore _worker _id ( id , gettext ( 'Prune' ) ) ,
reader : ( type , id ) => PBS . Utils . render _datastore _worker _id ( id , gettext ( 'Read objects' ) ) ,
2020-09-25 18:40:03 +02:00
sync : [ 'Datastore' , gettext ( 'Remote Sync' ) ] ,
2020-10-30 14:02:58 +01:00
syncjob : [ gettext ( 'Sync Job' ) , gettext ( 'Remote Sync' ) ] ,
2020-10-20 11:10:10 +02:00
verify : [ 'Datastore' , gettext ( 'Verification' ) ] ,
verify _group : [ 'Group' , gettext ( 'Verification' ) ] ,
verify _snapshot : [ 'Snapshot' , gettext ( 'Verification' ) ] ,
2020-11-02 10:03:36 +01:00
verificationjob : [ gettext ( 'Verify Job' ) , gettext ( 'Scheduled Verification' ) ] ,
2020-10-30 14:02:58 +01:00
zfscreate : [ gettext ( 'ZFS Storage' ) , gettext ( 'Create' ) ] ,
2020-05-25 19:06:47 +02:00
} ) ;
2020-09-25 18:40:03 +02:00
} ,
2018-12-05 12:39:40 +01:00
} ) ;