]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - Utils.js
2 Ext
. ns ( 'Proxmox.Setup' );
4 if (! Ext
. isDefined ( Proxmox
. Setup
. auth_cookie_name
)) {
5 throw "Proxmox library not initialized" ;
8 // avoid errors related to Accessible Rich Internet Applications
9 // (access for people with disabilities)
10 // TODO reenable after all components are upgraded
11 Ext
. enableAria
= false ;
12 Ext
. enableAriaButtons
= false ;
13 Ext
. enableAriaPanels
= false ;
15 // avoid errors when running without development tools
16 if (! Ext
. isDefined ( Ext
. global
. console
)) {
23 Ext
. Ajax
. defaultHeaders
= {
24 'Accept' : 'application/json'
27 Ext
. Ajax
. on ( 'beforerequest' , function ( conn
, options
) {
28 if ( Proxmox
. CSRFPreventionToken
) {
29 if (! options
. headers
) {
32 options
. headers
. CSRFPreventionToken
= Proxmox
. CSRFPreventionToken
;
36 Ext
. define ( 'Proxmox.Utils' , { utilities
: {
38 // this singleton contains miscellaneous utilities
40 yesText
: gettext ( 'Yes' ),
41 noText
: gettext ( 'No' ),
42 enabledText
: gettext ( 'Enabled' ),
43 disabledText
: gettext ( 'Disabled' ),
44 noneText
: gettext ( 'none' ),
45 NoneText
: gettext ( 'None' ),
46 errorText
: gettext ( 'Error' ),
47 unknownText
: gettext ( 'Unknown' ),
48 defaultText
: gettext ( 'Default' ),
49 daysText
: gettext ( 'days' ),
50 dayText
: gettext ( 'day' ),
51 runningText
: gettext ( 'running' ),
52 stoppedText
: gettext ( 'stopped' ),
53 neverText
: gettext ( 'never' ),
54 totalText
: gettext ( 'Total' ),
55 usedText
: gettext ( 'Used' ),
56 directoryText
: gettext ( 'Directory' ),
57 stateText
: gettext ( 'State' ),
58 groupText
: gettext ( 'Group' ),
67 eu
: 'Euskera (Basque)' ,
68 fa
: 'Persian (Farsi)' ,
73 nb
: 'Norwegian (Bokmal)' ,
74 nn
: 'Norwegian (Nynorsk)' ,
76 pt_BR
: 'Portuguese (Brazil)' ,
81 zh_CN
: 'Chinese (Simplified)' ,
82 zh_TW
: 'Chinese (Traditional)' ,
85 render_language : function ( value
) {
87 return Proxmox
. Utils
. defaultText
+ ' (English)' ;
89 var text
= Proxmox
. Utils
. language_map
[ value
];
91 return text
+ ' (' + value
+ ')' ;
96 language_array : function () {
97 var data
= [[ '__default__' , Proxmox
. Utils
. render_language ( '' )]];
98 Ext
. Object
. each ( Proxmox
. Utils
. language_map
, function ( key
, value
) {
99 data
. push ([ key
, Proxmox
. Utils
. render_language ( value
)]);
105 bond_mode_gettext_map
: {
106 '802.3ad' : 'LACP (802.3ad)' ,
107 'lacp-balance-slb' : 'LACP (balance-slb)' ,
108 'lacp-balance-tcp' : 'LACP (balance-tcp)' ,
111 render_bond_mode
: value
=> Proxmox
. Utils
. bond_mode_gettext_map
[ value
] || value
|| '' ,
113 bond_mode_array : function ( modes
) {
114 return modes
. map ( mode
=> [ mode
, Proxmox
. Utils
. render_bond_mode ( mode
)]);
117 getNoSubKeyHtml : function ( url
) {
118 // url http://www.proxmox.com/products/proxmox-ve/subscription-service-plans
119 return Ext
. String
. format ( 'You do not have a valid subscription for this server. Please visit <a target="_blank" href="{0}">www.proxmox.com</a> to get a list of available options.' , url
|| 'https://www.proxmox.com' );
122 format_boolean_with_default : function ( value
) {
123 if ( Ext
. isDefined ( value
) && value
!== '__default__' ) {
124 return value
? Proxmox
. Utils
. yesText
: Proxmox
. Utils
. noText
;
126 return Proxmox
. Utils
. defaultText
;
129 format_boolean : function ( value
) {
130 return value
? Proxmox
. Utils
. yesText
: Proxmox
. Utils
. noText
;
133 format_neg_boolean : function ( value
) {
134 return ! value
? Proxmox
. Utils
. yesText
: Proxmox
. Utils
. noText
;
137 format_enabled_toggle : function ( value
) {
138 return value
? Proxmox
. Utils
. enabledText
: Proxmox
. Utils
. disabledText
;
141 format_expire : function ( date
) {
143 return Proxmox
. Utils
. neverText
;
145 return Ext
. Date
. format ( date
, "Y-m-d" );
148 format_duration_long : function ( ut
) {
150 var days
= Math
. floor ( ut
/ 86400 );
152 var hours
= Math
. floor ( ut
/ 3600 );
154 var mins
= Math
. floor ( ut
/ 60 );
157 var hours_str
= '00' + hours
. toString ();
158 hours_str
= hours_str
. substr ( hours_str
. length
- 2 );
159 var mins_str
= "00" + mins
. toString ();
160 mins_str
= mins_str
. substr ( mins_str
. length
- 2 );
161 var ut_str
= "00" + ut
. toString ();
162 ut_str
= ut_str
. substr ( ut_str
. length
- 2 );
165 var ds
= days
> 1 ? Proxmox
. Utils
. daysText
: Proxmox
. Utils
. dayText
;
166 return days
. toString () + ' ' + ds
+ ' ' +
167 hours_str
+ ':' + mins_str
+ ':' + ut_str
;
169 return hours_str
+ ':' + mins_str
+ ':' + ut_str
;
173 format_subscription_level : function ( level
) {
176 } else if ( level
=== 'b' ) {
178 } else if ( level
=== 's' ) {
180 } else if ( level
=== 'p' ) {
183 return Proxmox
. Utils
. noneText
;
187 compute_min_label_width : function ( text
, width
) {
189 if ( width
=== undefined ) { width
= 100 ; }
191 var tm
= new Ext
. util
. TextMetrics ();
192 var min
= tm
. getWidth ( text
+ ':' );
194 return min
< width
? width
: min
;
197 setAuthData : function ( data
) {
198 Proxmox
. CSRFPreventionToken
= data
. CSRFPreventionToken
;
199 Proxmox
. UserName
= data
. username
;
200 Proxmox
. LoggedOut
= data
. LoggedOut
;
201 // creates a session cookie (expire = null)
202 // that way the cookie gets deleted after the browser window is closed
203 Ext
. util
. Cookies
. set ( Proxmox
. Setup
. auth_cookie_name
, data
. ticket
, null , '/' , null , true );
207 if ( Proxmox
. LoggedOut
) {
210 return ( Proxmox
. UserName
!== '' ) && Ext
. util
. Cookies
. get ( Proxmox
. Setup
. auth_cookie_name
);
213 authClear : function () {
214 if ( Proxmox
. LoggedOut
) {
217 Ext
. util
. Cookies
. clear ( Proxmox
. Setup
. auth_cookie_name
);
220 // comp.setLoading() is buggy in ExtJS 4.0.7, so we
221 // use el.mask() instead
222 setErrorMask : function ( comp
, msg
) {
231 el
. mask ( gettext ( "Loading..." ));
238 monStoreErrors : function ( me
, store
, clearMaskBeforeLoad
) {
239 if ( clearMaskBeforeLoad
) {
240 me
. mon ( store
, 'beforeload' , function ( s
, operation
, eOpts
) {
241 Proxmox
. Utils
. setErrorMask ( me
, false );
244 me
. mon ( store
, 'beforeload' , function ( s
, operation
, eOpts
) {
246 me
. loadCount
= 0 ; // make sure it is numeric
247 Proxmox
. Utils
. setErrorMask ( me
, true );
252 // only works with 'proxmox' proxy
253 me
. mon ( store
. proxy
, 'afterload' , function ( proxy
, request
, success
) {
257 Proxmox
. Utils
. setErrorMask ( me
, false );
262 /*jslint nomen: true */
263 var operation
= request
. _operation
;
264 var error
= operation
. getError ();
265 if ( error
. statusText
) {
266 msg
= error
. statusText
+ ' (' + error
. status
+ ')' ;
268 msg
= gettext ( 'Connection error' );
270 Proxmox
. Utils
. setErrorMask ( me
, msg
);
274 extractRequestError : function ( result
, verbose
) {
275 var msg
= gettext ( 'Successful' );
277 if (! result
. success
) {
278 msg
= gettext ( "Unknown error" );
279 if ( result
. message
) {
280 msg
= result
. message
;
282 msg
+= ' (' + result
. status
+ ')' ;
285 if ( verbose
&& Ext
. isObject ( result
. errors
)) {
287 Ext
. Object
. each ( result
. errors
, function ( prop
, desc
) {
288 msg
+= "<br><b>" + Ext
. htmlEncode ( prop
) + "</b>: " +
289 Ext
. htmlEncode ( desc
);
298 API2Request : function ( reqOpts
) {
300 var newopts
= Ext
. apply ({
301 waitMsg
: gettext ( 'Please wait...' )
304 if (! newopts
. url
. match ( /^\/api2/ )) {
305 newopts
. url
= '/api2/extjs' + newopts
. url
;
307 delete newopts
. callback
;
309 var createWrapper = function ( successFn
, callbackFn
, failureFn
) {
311 success : function ( response
, options
) {
312 if ( options
. waitMsgTarget
) {
313 if ( Proxmox
. Utils
. toolkit
=== 'touch' ) {
314 options
. waitMsgTarget
. setMasked ( false );
316 options
. waitMsgTarget
. setLoading ( false );
319 var result
= Ext
. decode ( response
. responseText
);
320 response
. result
= result
;
321 if (! result
. success
) {
322 response
. htmlStatus
= Proxmox
. Utils
. extractRequestError ( result
, true );
323 Ext
. callback ( callbackFn
, options
. scope
, [ options
, false , response
]);
324 Ext
. callback ( failureFn
, options
. scope
, [ response
, options
]);
327 Ext
. callback ( callbackFn
, options
. scope
, [ options
, true , response
]);
328 Ext
. callback ( successFn
, options
. scope
, [ response
, options
]);
330 failure : function ( response
, options
) {
331 if ( options
. waitMsgTarget
) {
332 if ( Proxmox
. Utils
. toolkit
=== 'touch' ) {
333 options
. waitMsgTarget
. setMasked ( false );
335 options
. waitMsgTarget
. setLoading ( false );
338 response
. result
= {};
340 response
. result
= Ext
. decode ( response
. responseText
);
342 var msg
= gettext ( 'Connection error' ) + ' - server offline?' ;
343 if ( response
. aborted
) {
344 msg
= gettext ( 'Connection error' ) + ' - aborted.' ;
345 } else if ( response
. timedout
) {
346 msg
= gettext ( 'Connection error' ) + ' - Timeout.' ;
347 } else if ( response
. status
&& response
. statusText
) {
348 msg
= gettext ( 'Connection error' ) + ' ' + response
. status
+ ': ' + response
. statusText
;
350 response
. htmlStatus
= msg
;
351 Ext
. callback ( callbackFn
, options
. scope
, [ options
, false , response
]);
352 Ext
. callback ( failureFn
, options
. scope
, [ response
, options
]);
357 createWrapper ( reqOpts
. success
, reqOpts
. callback
, reqOpts
. failure
);
359 var target
= newopts
. waitMsgTarget
;
361 if ( Proxmox
. Utils
. toolkit
=== 'touch' ) {
362 target
. setMasked ({ xtype
: 'loadmask' , message
: newopts
. waitMsg
} );
364 // Note: ExtJS bug - this does not work when component is not rendered
365 target
. setLoading ( newopts
. waitMsg
);
368 Ext
. Ajax
. request ( newopts
);
371 checked_command : function ( orig_cmd
) {
372 Proxmox
. Utils
. API2Request ({
373 url
: '/nodes/localhost/subscription' ,
376 failure : function ( response
, opts
) {
377 Ext
. Msg
. alert ( gettext ( 'Error' ), response
. htmlStatus
);
379 success : function ( response
, opts
) {
380 var data
= response
. result
. data
;
382 if ( data
. status
!== 'Active' ) {
384 title
: gettext ( 'No valid subscription' ),
385 icon
: Ext
. Msg
. WARNING
,
386 message
: Proxmox
. Utils
. getNoSubKeyHtml ( data
. url
),
388 callback : function ( btn
) {
402 assemble_field_data : function ( values
, data
) {
403 if ( Ext
. isObject ( data
)) {
404 Ext
. Object
. each ( data
, function ( name
, val
) {
405 if ( values
. hasOwnProperty ( name
)) {
406 var bucket
= values
[ name
];
407 if (! Ext
. isArray ( bucket
)) {
408 bucket
= values
[ name
] = [ bucket
];
410 if ( Ext
. isArray ( val
)) {
411 values
[ name
] = bucket
. concat ( val
);
422 dialog_title : function ( subject
, create
, isAdd
) {
425 return gettext ( 'Add' ) + ': ' + subject
;
427 return gettext ( 'Create' ) + ': ' + subject
;
430 return gettext ( 'Edit' ) + ': ' + subject
;
434 network_iface_types
: {
435 eth
: gettext ( "Network Device" ),
436 bridge
: 'Linux Bridge' ,
439 OVSBridge
: 'OVS Bridge' ,
442 OVSIntPort
: 'OVS IntPort'
445 render_network_iface_type : function ( value
) {
446 return Proxmox
. Utils
. network_iface_types
[ value
] ||
447 Proxmox
. Utils
. unknownText
;
451 acmenewcert
: [ 'SRV' , gettext ( 'Order Certificate' ) ],
452 acmeregister
: [ 'ACME Account' , gettext ( 'Register' ) ],
453 acmedeactivate
: [ 'ACME Account' , gettext ( 'Deactivate' ) ],
454 acmeupdate
: [ 'ACME Account' , gettext ( 'Update' ) ],
455 acmerefresh
: [ 'ACME Account' , gettext ( 'Refresh' ) ],
456 acmerenew
: [ 'SRV' , gettext ( 'Renew Certificate' ) ],
457 acmerevoke
: [ 'SRV' , gettext ( 'Revoke Certificate' ) ],
458 'auth-realm-sync' : [ gettext ( 'Realm' ), gettext ( 'Sync' ) ],
459 'move_volume' : [ 'CT' , gettext ( 'Move Volume' ) ],
460 clustercreate
: [ '' , gettext ( 'Create Cluster' ) ],
461 clusterjoin
: [ '' , gettext ( 'Join Cluster' ) ],
462 diskinit
: [ 'Disk' , gettext ( 'Initialize Disk with GPT' ) ],
463 vncproxy
: [ 'VM/CT' , gettext ( 'Console' ) ],
464 spiceproxy
: [ 'VM/CT' , gettext ( 'Console' ) + ' (Spice)' ],
465 vncshell
: [ '' , gettext ( 'Shell' ) ],
466 spiceshell
: [ '' , gettext ( 'Shell' ) + ' (Spice)' ],
467 qmsnapshot
: [ 'VM' , gettext ( 'Snapshot' ) ],
468 qmrollback
: [ 'VM' , gettext ( 'Rollback' ) ],
469 qmdelsnapshot
: [ 'VM' , gettext ( 'Delete Snapshot' ) ],
470 qmcreate
: [ 'VM' , gettext ( 'Create' ) ],
471 qmrestore
: [ 'VM' , gettext ( 'Restore' ) ],
472 qmdestroy
: [ 'VM' , gettext ( 'Destroy' ) ],
473 qmigrate
: [ 'VM' , gettext ( 'Migrate' ) ],
474 qmclone
: [ 'VM' , gettext ( 'Clone' ) ],
475 qmmove
: [ 'VM' , gettext ( 'Move disk' ) ],
476 qmtemplate
: [ 'VM' , gettext ( 'Convert to template' ) ],
477 qmstart
: [ 'VM' , gettext ( 'Start' ) ],
478 qmstop
: [ 'VM' , gettext ( 'Stop' ) ],
479 qmreset
: [ 'VM' , gettext ( 'Reset' ) ],
480 qmshutdown
: [ 'VM' , gettext ( 'Shutdown' ) ],
481 qmreboot
: [ 'VM' , gettext ( 'Reboot' ) ],
482 qmsuspend
: [ 'VM' , gettext ( 'Hibernate' ) ],
483 qmpause
: [ 'VM' , gettext ( 'Pause' ) ],
484 qmresume
: [ 'VM' , gettext ( 'Resume' ) ],
485 qmconfig
: [ 'VM' , gettext ( 'Configure' ) ],
486 vzsnapshot
: [ 'CT' , gettext ( 'Snapshot' ) ],
487 vzrollback
: [ 'CT' , gettext ( 'Rollback' ) ],
488 vzdelsnapshot
: [ 'CT' , gettext ( 'Delete Snapshot' ) ],
489 vzcreate
: [ 'CT' , gettext ( 'Create' ) ],
490 vzrestore
: [ 'CT' , gettext ( 'Restore' ) ],
491 vzdestroy
: [ 'CT' , gettext ( 'Destroy' ) ],
492 vzmigrate
: [ 'CT' , gettext ( 'Migrate' ) ],
493 vzclone
: [ 'CT' , gettext ( 'Clone' ) ],
494 vztemplate
: [ 'CT' , gettext ( 'Convert to template' ) ],
495 vzstart
: [ 'CT' , gettext ( 'Start' ) ],
496 vzstop
: [ 'CT' , gettext ( 'Stop' ) ],
497 vzmount
: [ 'CT' , gettext ( 'Mount' ) ],
498 vzumount
: [ 'CT' , gettext ( 'Unmount' ) ],
499 vzshutdown
: [ 'CT' , gettext ( 'Shutdown' ) ],
500 vzreboot
: [ 'CT' , gettext ( 'Reboot' ) ],
501 vzsuspend
: [ 'CT' , gettext ( 'Suspend' ) ],
502 vzresume
: [ 'CT' , gettext ( 'Resume' ) ],
503 push_file
: [ 'CT' , gettext ( 'Push file' )],
504 pull_file
: [ 'CT' , gettext ( 'Pull file' )],
505 hamigrate
: [ 'HA' , gettext ( 'Migrate' ) ],
506 hastart
: [ 'HA' , gettext ( 'Start' ) ],
507 hastop
: [ 'HA' , gettext ( 'Stop' ) ],
508 hashutdown
: [ 'HA' , gettext ( 'Shutdown' ) ],
509 srvstart
: [ 'SRV' , gettext ( 'Start' ) ],
510 srvstop
: [ 'SRV' , gettext ( 'Stop' ) ],
511 srvrestart
: [ 'SRV' , gettext ( 'Restart' ) ],
512 srvreload
: [ 'SRV' , gettext ( 'Reload' ) ],
513 cephcreatemgr
: [ 'Ceph Manager' , gettext ( 'Create' ) ],
514 cephdestroymgr
: [ 'Ceph Manager' , gettext ( 'Destroy' ) ],
515 cephcreatemon
: [ 'Ceph Monitor' , gettext ( 'Create' ) ],
516 cephdestroymon
: [ 'Ceph Monitor' , gettext ( 'Destroy' ) ],
517 cephcreateosd
: [ 'Ceph OSD' , gettext ( 'Create' ) ],
518 cephdestroyosd
: [ 'Ceph OSD' , gettext ( 'Destroy' ) ],
519 cephcreatepool
: [ 'Ceph Pool' , gettext ( 'Create' ) ],
520 cephdestroypool
: [ 'Ceph Pool' , gettext ( 'Destroy' ) ],
521 cephfscreate
: [ 'CephFS' , gettext ( 'Create' ) ],
522 cephcreatemds
: [ 'Ceph Metadata Server' , gettext ( 'Create' ) ],
523 cephdestroymds
: [ 'Ceph Metadata Server' , gettext ( 'Destroy' ) ],
524 imgcopy
: [ '' , gettext ( 'Copy data' ) ],
525 imgdel
: [ '' , gettext ( 'Erase data' ) ],
526 unknownimgdel
: [ '' , gettext ( 'Destroy image from unknown guest' ) ],
527 download
: [ '' , gettext ( 'Download' ) ],
528 vzdump
: [ 'VM/CT' , gettext ( 'Backup' ) ],
529 aptupdate
: [ '' , gettext ( 'Update package database' ) ],
530 startall
: [ '' , gettext ( 'Start all VMs and Containers' ) ],
531 stopall
: [ '' , gettext ( 'Stop all VMs and Containers' ) ],
532 migrateall
: [ '' , gettext ( 'Migrate all VMs and Containers' ) ],
533 dircreate
: [ gettext ( 'Directory Storage' ), gettext ( 'Create' ) ],
534 lvmcreate
: [ gettext ( 'LVM Storage' ), gettext ( 'Create' ) ],
535 lvmthincreate
: [ gettext ( 'LVM-Thin Storage' ), gettext ( 'Create' ) ],
536 zfscreate
: [ gettext ( 'ZFS Storage' ), gettext ( 'Create' ) ]
539 format_task_description : function ( type
, id
) {
540 var farray
= Proxmox
. Utils
. task_desc_table
[ type
];
549 var prefix
= farray
[ 0 ];
552 return prefix
+ ' ' + id
+ ' - ' + text
;
557 format_size : function ( size
) {
558 /*jslint confusion: true */
560 var units
= [ '' , 'Ki' , 'Mi' , 'Gi' , 'Ti' , 'Pi' , 'Ei' , 'Zi' , 'Yi' ];
563 while ( size
>= 1024 && (( num
++)+ 1 ) < units
. length
) {
567 return size
. toFixed (( num
> 0 )? 2 : 0 ) + " " + units
[ num
] + "B" ;
570 render_upid : function ( value
, metaData
, record
) {
571 var type
= record
. data
. type
;
572 var id
= record
. data
. id
;
574 return Proxmox
. Utils
. format_task_description ( type
, id
);
577 render_uptime : function ( value
) {
581 if ( uptime
=== undefined ) {
589 return Proxmox
. Utils
. format_duration_long ( uptime
);
592 parse_task_upid : function ( upid
) {
595 var res
= upid
. match ( /^UPID:([^\s:]+):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8,9}):(([0-9A-Fa-f]{8,16}):)?([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/ );
597 throw "unable to parse upid '" + upid
+ "'" ;
600 task
. pid
= parseInt ( res
[ 2 ], 16 );
601 task
. pstart
= parseInt ( res
[ 3 ], 16 );
602 if ( res
[ 5 ] !== undefined ) {
603 task
. task_id
= parseInt ( res
[ 5 ], 16 );
605 task
. starttime
= parseInt ( res
[ 6 ], 16 );
610 task
. desc
= Proxmox
. Utils
. format_task_description ( task
. type
, task
. id
);
615 render_timestamp : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
616 var servertime
= new Date ( value
* 1000 );
617 return Ext
. Date
. format ( servertime
, 'Y-m-d H:i:s' );
620 get_help_info : function ( section
) {
622 if ( typeof proxmoxOnlineHelpInfo
!== 'undefined' ) {
623 helpMap
= proxmoxOnlineHelpInfo
;
624 } else if ( typeof pveOnlineHelpInfo
!== 'undefined' ) {
625 // be backward compatible with older pve-doc-generators
626 helpMap
= pveOnlineHelpInfo
;
628 throw "no global OnlineHelpInfo map declared" ;
631 return helpMap
[ section
];
634 get_help_link : function ( section
) {
635 var info
= Proxmox
. Utils
. get_help_info ( section
);
640 return window
. location
. origin
+ info
. link
;
643 openXtermJsViewer : function ( vmtype
, vmid
, nodename
, vmname
, cmd
) {
644 var url
= Ext
. Object
. toQueryString ({
645 console
: vmtype
, // kvm, lxc, upgrade or shell
653 var nw
= window
. open ( "?" + url
, '_blank' , 'toolbar=no,location=no,status=no,menubar=no,resizable=yes,width=800,height=420' );
662 constructor : function () {
664 Ext
. apply ( me
, me
. utilities
);
666 var IPV4_OCTET
= "(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])" ;
667 var IPV4_REGEXP
= "(?:(?:" + IPV4_OCTET
+ " \\ .){3}" + IPV4_OCTET
+ ")" ;
668 var IPV6_H16
= "(?:[0-9a-fA-F]{1,4})" ;
669 var IPV6_LS32
= "(?:(?:" + IPV6_H16
+ ":" + IPV6_H16
+ ")|" + IPV4_REGEXP
+ ")" ;
670 var IPV4_CIDR_MASK
= "([0-9]{1,2})" ;
671 var IPV6_CIDR_MASK
= "([0-9]{1,3})" ;
674 me
. IP4_match
= new RegExp ( "^(?:" + IPV4_REGEXP
+ ")$" );
675 me
. IP4_cidr_match
= new RegExp ( "^(?:" + IPV4_REGEXP
+ ")\/" + IPV4_CIDR_MASK
+ "$" );
677 var IPV6_REGEXP
= "(?:" +
678 "(?:(?:" + "(?:" + IPV6_H16
+ ":){6})" + IPV6_LS32
+ ")|" +
679 "(?:(?:" + "::" + "(?:" + IPV6_H16
+ ":){5})" + IPV6_LS32
+ ")|" +
680 "(?:(?:(?:" + IPV6_H16
+ ")?::" + "(?:" + IPV6_H16
+ ":){4})" + IPV6_LS32
+ ")|" +
681 "(?:(?:(?:(?:" + IPV6_H16
+ ":){0,1}" + IPV6_H16
+ ")?::" + "(?:" + IPV6_H16
+ ":){3})" + IPV6_LS32
+ ")|" +
682 "(?:(?:(?:(?:" + IPV6_H16
+ ":){0,2}" + IPV6_H16
+ ")?::" + "(?:" + IPV6_H16
+ ":){2})" + IPV6_LS32
+ ")|" +
683 "(?:(?:(?:(?:" + IPV6_H16
+ ":){0,3}" + IPV6_H16
+ ")?::" + "(?:" + IPV6_H16
+ ":){1})" + IPV6_LS32
+ ")|" +
684 "(?:(?:(?:(?:" + IPV6_H16
+ ":){0,4}" + IPV6_H16
+ ")?::" + ")" + IPV6_LS32
+ ")|" +
685 "(?:(?:(?:(?:" + IPV6_H16
+ ":){0,5}" + IPV6_H16
+ ")?::" + ")" + IPV6_H16
+ ")|" +
686 "(?:(?:(?:(?:" + IPV6_H16
+ ":){0,7}" + IPV6_H16
+ ")?::" + ")" + ")" +
689 me
. IP6_match
= new RegExp ( "^(?:" + IPV6_REGEXP
+ ")$" );
690 me
. IP6_cidr_match
= new RegExp ( "^(?:" + IPV6_REGEXP
+ ")\/" + IPV6_CIDR_MASK
+ "$" );
691 me
. IP6_bracket_match
= new RegExp ( "^ \\ [(" + IPV6_REGEXP
+ ") \\ ]" );
693 me
. IP64_match
= new RegExp ( "^(?:" + IPV6_REGEXP
+ "|" + IPV4_REGEXP
+ ")$" );
694 me
. IP64_cidr_match
= new RegExp ( "^(?:" + IPV6_REGEXP
+ "\/" + IPV6_CIDR_MASK
+ ")|(?:" + IPV4_REGEXP
+ "\/" + IPV4_CIDR_MASK
+ ")$" );
696 var 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])?))" ;
697 me
. DnsName_match
= new RegExp ( "^" + DnsName_REGEXP
+ "$" );
699 me
. HostPort_match
= new RegExp ( "^(" + IPV4_REGEXP
+ "|" + DnsName_REGEXP
+ ")(: \\ d+)?$" );
700 me
. HostPortBrackets_match
= new RegExp ( "^ \\ [(?:" + IPV6_REGEXP
+ "|" + IPV4_REGEXP
+ "|" + DnsName_REGEXP
+ ") \\ ](: \\ d+)?$" );
701 me
. IP6_dotnotation_match
= new RegExp ( "^" + IPV6_REGEXP
+ "( \\ . \\ d+)?$" );
702 me
. Vlan_match
= new RegExp ( '^vlan( \\ d+)' );
703 me
. VlanInterface_match
= new RegExp ( '( \\ w+) \\ .( \\ d+)' );