Enhanced validation of general DNS servers and gateways
Improve processing of DNS server changes

What a pain this was. The user can blank out a DNS server from a position in the middle of the list. e.g. they had all 4 entries previously filled, and then they blank out DNS server #3. The way the DNS servers are stored in the config, they are just the defined ones in an "un-indexed" array. So actually entries 1, 2 and 4 on the screen become 1st, 2nd and 3rd in the config. The selected gateways for 1, 2 and 4 then have to end up in positions 1, 2 and 3 to match the stored DNS servers.
This fixes all that up, as well as allowing the user to leave a gateway selected against a blanked-out DNS server entry - in that case the whole entry is "removed/ignored".
Merge pull request #917 from phil-davis/master

Enhanced validation of general DNS servers and gateways
Use the 11th column for the radius context rather than overriding the interim interval field with it. Fixes #3447
Use descr as the field name for voucher description so it gets CDATA protection. Fixes #3441
Merge 10 -> 10.1 and 10.1 -> 10.2 function upgrade since the recent changes done on 2.1.1 for Ticket #3441
Some tweaking to handle when switching off dhcpv6.
Consider setting of noconcurrent login for passthrough expiry of users. Fixes #3340
Put a kludge for now which Fixes #3280. It should be improved later on to have proper handling and overloading of configuration functions
Grab exec result just to be careful
Use htmlspecialchars(), a better solution for #2952
Whitespace fix
Normally when an ip is set the interface comes up on BSD stacks. Though push this commit which Fixes #3281
Fix typo on variable name and really add custom options for dhcpdv6
Use correct parameter (bootfile-url) to configure netboot on DHCPdv6, it fixes #3421
Help ticket #3449:

Improve data validation to avoid save a host/subnet or a IPv4 with
invalid mask. The reported error is on javascript and only happen on
IE8,but this fix will prevent the same issue happening in the future on
a different browser.
Move this global declaration to the proper file rather than backend code
Put a timeout of 30 seconds to aid with Ticket #3412