2019-08-20 13:31:35 +00:00
'use strict' ;
'require form' ;
'require network' ;
'require validation' ;
function isCIDR ( value ) {
return Array . isArray ( value ) || /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/(\d{1,2}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ . test ( value ) ;
}
function calculateBroadcast ( s , use _cfgvalue ) {
var readfn = use _cfgvalue ? 'cfgvalue' : 'formvalue' ,
addropt = s . children . filter ( function ( o ) { return o . option == 'ipaddr' } ) [ 0 ] ,
addrvals = addropt ? L . toArray ( addropt [ readfn ] ( s . section ) ) : [ ] ,
maskopt = s . children . filter ( function ( o ) { return o . option == 'netmask' } ) [ 0 ] ,
maskval = maskopt ? maskopt [ readfn ] ( s . section ) : null ,
firstsubnet = maskval ? addrvals [ 0 ] + '/' + maskval : addrvals . filter ( function ( a ) { return a . indexOf ( '/' ) > 0 } ) [ 0 ] ;
if ( firstsubnet == null )
return null ;
var addr _mask = firstsubnet . split ( '/' ) ,
addr = validation . parseIPv4 ( addr _mask [ 0 ] ) ,
mask = addr _mask [ 1 ] ;
if ( ! isNaN ( mask ) )
mask = validation . parseIPv4 ( network . prefixToMask ( + mask ) ) ;
else
mask = validation . parseIPv4 ( mask ) ;
var bc = [
addr [ 0 ] | ( ~ mask [ 0 ] >>> 0 & 255 ) ,
addr [ 1 ] | ( ~ mask [ 1 ] >>> 0 & 255 ) ,
addr [ 2 ] | ( ~ mask [ 2 ] >>> 0 & 255 ) ,
addr [ 3 ] | ( ~ mask [ 3 ] >>> 0 & 255 )
] ;
return bc . join ( '.' ) ;
}
function validateBroadcast ( section _id , value ) {
var opt = this . map . lookupOption ( 'broadcast' , section _id ) ,
node = opt ? this . map . findElement ( 'id' , opt [ 0 ] . cbid ( section _id ) ) : null ,
addr = node ? calculateBroadcast ( this . section , false ) : null ;
if ( node != null ) {
if ( addr != null )
node . querySelector ( 'input' ) . setAttribute ( 'placeholder' , addr ) ;
else
node . querySelector ( 'input' ) . removeAttribute ( 'placeholder' ) ;
}
return true ;
}
return network . registerProtocol ( 'static' , {
CBIIPValue : form . Value . extend ( {
handleSwitch : function ( section _id , option _index , ev ) {
var maskopt = this . map . lookupOption ( 'netmask' , section _id ) ;
if ( maskopt == null || ! this . isValid ( section _id ) )
return ;
var maskval = maskopt [ 0 ] . formvalue ( section _id ) ,
addrval = this . formvalue ( section _id ) ,
prefix = maskval ? network . maskToPrefix ( maskval ) : 32 ;
if ( prefix == null )
return ;
this . datatype = 'or(cidr4,ipmask4)' ;
var parent = L . dom . parent ( ev . target , '.cbi-value-field' ) ;
L . dom . content ( parent , form . DynamicList . prototype . renderWidget . apply ( this , [
section _id ,
option _index ,
addrval ? '%s/%d' . format ( addrval , prefix ) : ''
] ) ) ;
var masknode = this . map . findElement ( 'id' , maskopt [ 0 ] . cbid ( section _id ) ) ;
if ( masknode ) {
parent = L . dom . parent ( masknode , '.cbi-value' ) ;
parent . parentNode . removeChild ( parent ) ;
}
} ,
renderWidget : function ( section _id , option _index , cfgvalue ) {
var maskopt = this . map . lookupOption ( 'netmask' , section _id ) ,
widget = isCIDR ( cfgvalue ) ? 'DynamicList' : 'Value' ;
if ( widget == 'DynamicList' ) {
this . datatype = 'or(cidr4,ipmask4)' ;
this . placeholder = _ ( 'Add IPv4 address…' ) ;
}
else {
this . datatype = 'ip4addr("nomask")' ;
}
var node = form [ widget ] . prototype . renderWidget . apply ( this , [ section _id , option _index , cfgvalue ] ) ;
if ( widget == 'Value' )
L . dom . append ( node , E ( 'button' , {
'class' : 'cbi-button cbi-button-neutral' ,
'title' : _ ( 'Switch to CIDR list notation' ) ,
'aria-label' : _ ( 'Switch to CIDR list notation' ) ,
'click' : L . bind ( this . handleSwitch , this , section _id , option _index )
} , '…' ) ) ;
return node ;
} ,
validate : validateBroadcast
} ) ,
CBINetmaskValue : form . Value . extend ( {
render : function ( option _index , section _id , in _table ) {
var addropt = this . section . children . filter ( function ( o ) { return o . option == 'ipaddr' } ) [ 0 ] ,
addrval = addropt ? addropt . cfgvalue ( section _id ) : null ;
if ( addrval != null && isCIDR ( addrval ) )
return E ( [ ] ) ;
this . value ( '255.255.255.0' ) ;
this . value ( '255.255.0.0' ) ;
this . value ( '255.0.0.0' ) ;
return form . Value . prototype . render . apply ( this , [ option _index , section _id , in _table ] ) ;
} ,
validate : validateBroadcast
} ) ,
CBIGatewayValue : form . Value . extend ( {
datatype : 'ip4addr("nomask")' ,
render : function ( option _index , section _id , in _table ) {
return network . getWANNetworks ( ) . then ( L . bind ( function ( wans ) {
if ( wans . length == 1 ) {
var gwaddr = wans [ 0 ] . getGatewayAddr ( ) ;
this . placeholder = gwaddr ? '%s (%s)' . format ( gwaddr , wans [ 0 ] . getName ( ) ) : '' ;
}
return form . Value . prototype . render . apply ( this , [ option _index , section _id , in _table ] ) ;
} , this ) ) ;
} ,
validate : function ( section _id , value ) {
var addropt = this . section . children . filter ( function ( o ) { return o . option == 'ipaddr' } ) [ 0 ] ,
addrval = addropt ? L . toArray ( addropt . cfgvalue ( section _id ) ) : null ;
if ( addrval != null ) {
for ( var i = 0 ; i < addrval . length ; i ++ ) {
var addr = addrval [ i ] . split ( '/' ) [ 0 ] ;
if ( value == addr )
return _ ( 'The gateway address must not be a local IP address' ) ;
}
}
return true ;
}
} ) ,
CBIBroadcastValue : form . Value . extend ( {
datatype : 'ip4addr("nomask")' ,
render : function ( option _index , section _id , in _table ) {
this . placeholder = calculateBroadcast ( this . section , true ) ;
return form . Value . prototype . render . apply ( this , [ option _index , section _id , in _table ] ) ;
}
} ) ,
getI18n : function ( ) {
return _ ( 'Static address' ) ;
} ,
renderFormOptions : function ( s ) {
var dev = this . getL2Device ( ) || this . getDevice ( ) , o ;
s . taboption ( 'general' , this . CBIIPValue , 'ipaddr' , _ ( 'IPv4 address' ) ) ;
s . taboption ( 'general' , this . CBINetmaskValue , 'netmask' , _ ( 'IPv4 netmask' ) ) ;
s . taboption ( 'general' , this . CBIGatewayValue , 'gateway' , _ ( 'IPv4 gateway' ) ) ;
s . taboption ( 'general' , this . CBIBroadcastValue , 'broadcast' , _ ( 'IPv4 broadcast' ) ) ;
s . taboption ( 'general' , form . DynamicList , 'dns' , _ ( 'Use custom DNS servers' ) ) ;
o = s . taboption ( 'general' , form . Value , 'ip6assign' , _ ( 'IPv6 assignment length' ) , _ ( 'Assign a part of given length of every public IPv6-prefix to this interface' ) ) ;
o . value ( '' , _ ( 'disabled' ) ) ;
o . value ( '64' ) ;
o . datatype = 'max(64)' ;
o = s . taboption ( 'general' , form . Value , 'ip6hint' , _ ( 'IPv6 assignment hint' ) , _ ( 'Assign prefix parts using this hexadecimal subprefix ID for this interface.' ) ) ;
2019-09-13 10:57:08 +00:00
o . placeholder = '0' ;
o . validate = function ( section _id , value ) {
2019-10-15 07:14:36 +00:00
if ( value == null || value == '' )
return true ;
2019-09-13 10:57:08 +00:00
var n = parseInt ( value , 16 ) ;
if ( ! /^(0x)?[0-9a-fA-F]+$/ . test ( value ) || isNaN ( n ) || n >= 0xffffffff )
2019-12-17 10:41:00 +00:00
return _ ( 'Expecting a hexadecimal assignment hint' ) ;
2019-09-13 10:57:08 +00:00
return true ;
} ;
2019-08-20 13:31:35 +00:00
for ( var i = 33 ; i <= 64 ; i ++ )
2019-09-13 10:57:08 +00:00
o . depends ( 'ip6assign' , String ( i ) ) ;
2019-08-20 13:31:35 +00:00
o = s . taboption ( 'general' , form . DynamicList , 'ip6addr' , _ ( 'IPv6 address' ) ) ;
o . datatype = 'ip6addr' ;
o . placeholder = _ ( 'Add IPv6 address…' ) ;
o . depends ( 'ip6assign' , '' ) ;
o = s . taboption ( 'general' , form . Value , 'ip6gw' , _ ( 'IPv6 gateway' ) ) ;
o . datatype = 'ip6addr("nomask")' ;
o . depends ( 'ip6assign' , '' ) ;
o = s . taboption ( 'general' , form . Value , 'ip6prefix' , _ ( 'IPv6 routed prefix' ) , _ ( 'Public prefix routed to this device for distribution to clients.' ) ) ;
o . datatype = 'ip6addr' ;
o . depends ( 'ip6assign' , '' ) ;
o = s . taboption ( 'general' , form . Value , 'ip6ifaceid' , _ ( 'IPv6 suffix' ) , _ ( "Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or '::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') for the interface." ) ) ;
o . datatype = 'ip6hostid' ;
o . placeholder = '::1' ;
o = s . taboption ( 'advanced' , form . Value , 'macaddr' , _ ( 'Override MAC address' ) ) ;
o . datatype = 'macaddr' ;
o . placeholder = dev ? ( dev . getMAC ( ) || '' ) : '' ;
o = s . taboption ( 'advanced' , form . Value , 'mtu' , _ ( 'Override MTU' ) ) ;
o . datatype = 'max(9200)' ;
o . placeholder = dev ? ( dev . getMTU ( ) || '1500' ) : '1500' ;
o = s . taboption ( 'advanced' , form . Value , 'metric' , _ ( 'Use gateway metric' ) ) ;
o . placeholder = this . getMetric ( ) || '0' ;
o . datatype = 'uinteger' ;
}
} ) ;