From 6aec044c5299948d2f3de4b3463aedbcbd63a69c Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Thu, 21 May 2026 16:59:55 +0200 Subject: [PATCH] add drop down menu for interfaces --- apply.pl | 5 +++++ settings.pl | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/apply.pl b/apply.pl index 576fd3f..ab32dc5 100644 --- a/apply.pl +++ b/apply.pl @@ -109,6 +109,11 @@ sub handle_request() { delconfigline( '4 ' . $c[2] ); } + if( defined( $p{interface_manual} ) && $p{interface_manual} ne '' ) + { + $p{interface} = $p{interface_manual}; + } + $p{interface} =~ s/[^-_\.A-Za-z0-9:\*]//g; if( $p{number} ne '' ) { addconfigline( '4 ' . $p{number} . ' ' . $p{interface} . ' ' . $p{frametype} . ' ' . $p{delay} ); diff --git a/settings.pl b/settings.pl index 82b03d9..6cb83f2 100644 --- a/settings.pl +++ b/settings.pl @@ -22,6 +22,61 @@ # # + +sub html_escape( $ ) +{ + my $s = $_[0]; + $s = '' unless defined $s; + $s =~ s/&/&/g; + $s =~ s//>/g; + $s =~ s/"/"/g; + return $s; +} + +sub network_interface_options( $ ) +{ + my $current = $_[0]; + my @interfaces = (); + my %seen = (); + my $html = ''; + + $current = '' unless defined $current; + + if( opendir( my $dh, '/sys/class/net' ) ) + { + foreach my $ifname ( sort readdir( $dh ) ) + { + next if $ifname =~ /^\./; + next if $ifname =~ /[^-_\.A-Za-z0-9]/; + next if $seen{$ifname}; + push( @interfaces, $ifname ); + $seen{$ifname} = 1; + } + closedir( $dh ); + } + + # Keep special/manual values usable even if they are not real kernel interfaces. + foreach my $ifname ( '*', 'auto', $current ) + { + next if !defined( $ifname ) || $ifname eq ''; + next if $seen{$ifname}; + push( @interfaces, $ifname ); + $seen{$ifname} = 1; + } + + foreach my $ifname ( @interfaces ) + { + my $selected = ( $ifname eq $current ) ? ' SELECTED' : ''; + my $label = $ifname; + $label = '* (all interfaces)' if $ifname eq '*'; + $label = 'auto' if $ifname eq 'auto'; + $html .= '\t\t\t\t\n'; + } + + return $html; +} + sub handle_request() { if( $c[1] eq 'general' ) @@ -1385,6 +1440,7 @@ EOF { $c = getconfigline( '4 ' . $c[2] ); @c = split( ' ', $c ); + $interface_options = network_interface_options( $c[1] ); $c[2] =~ s/\.//g; eval( '$frametype_' . $c[2] . ' = " SELECTED";' ); @@ -1453,7 +1509,10 @@ TT { color:#5b4b38; } Network interface: -
+
+ Manual override:
+