#!/usr/local/bin/php 0) { $handle = fopen($vfilename, 'r+'); if (flock($handle, LOCK_EX)) { fseek($handle, 0); foreach (explode("\n", fread($handle, filesize($vfilename))) as $line) { if (!isset($gres_todo[$line]) && trim($line) != '') { $gres_todo[$line] = []; } } fseek($handle, 0); ftruncate($handle, 0); flock($handle, LOCK_UN); } } /* collect changed gres to reconfigure */ $gre_configure = []; foreach ((new OPNsense\Interfaces\Gre())->gre->iterateItems() as $item) { $gre = []; foreach ($item->iterateItems() as $node) { $gre[$node->getInternalXMLTagName()] = (string)$node; } if (isset($gres_todo[$gre['greif']])) { $gre_configure[] = $gre; unset($gres_todo[$gre['greif']]); } } /* remove non existing interfaces */ foreach (array_keys($gres_todo) as $greif) { legacy_interface_destroy($greif); } /* reconfigure still existing gres, removal should happen first as it may free parent interfaces. */ $ifdetails = legacy_interfaces_details(); foreach ($gre_configure as $gre) { $reconfigure = false; if (isset($ifdetails[$gre['greif']])) { /* when reconfiguring, we need to remove addresses (at least for IPv6) to prevent old ones left behind */ $reconfigure = true; interfaces_addresses_flush($gre['greif'], 4, $ifdetails); interfaces_addresses_flush($gre['greif'], 6, $ifdetails); } _interfaces_gre_configure($gre); if ($reconfigure) { /* re-apply additional addresses and hook routing */ interfaces_restart_by_device(false, [$gre['greif']]); } }