| 
									
										
										
										
											2023-10-26 11:24:52 +01:00
										 |  |  | #!/usr/bin/perl -w | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use esmith::ConfigDB; | 
					
						
							|  |  |  | use esmith::templates; | 
					
						
							|  |  |  | use esmith::ethernet; | 
					
						
							|  |  |  | use strict; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $c = esmith::ConfigDB->open_ro() || | 
					
						
							|  |  |  |     die "Couldn't open ConfigDB"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my @adapters = split(/\n/, esmith::ethernet::probeAdapters()); | 
					
						
							|  |  |  | my @nics = (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (($c->get('EthernetDriver1')->value || 'unknown') eq 'dummy'){ | 
					
						
							|  |  |  |   push @adapters, "dummy\tdummy\t10:00:01:02:03:04\tFake Network Interface\tdummy0"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | # If NIC bonding is enabled, we need to handle route-bond0 and ifcfg-bond0 | 
					
						
							|  |  |  | if (($c->get('InternalInterface')->prop('NICBonding') || 'disabled') eq 'enabled'){ | 
					
						
							|  |  |  |   push @adapters, "bond\tbond\t10:00:01:02:03:04\tBonding virtual Interface\tbond0"; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-12-23 01:05:02 -05:00
										 |  |  | # if external VLAN is configured | 
					
						
							|  |  |  | if (($c->get('ExternalInterface')->prop('VLAN') || 'disabled') ne 'disabled'){ | 
					
						
							|  |  |  |   my $name= ($c->get('ExternalInterface')->prop('Name') eq "ppp0") ? $c->get('pppoe')->prop('PhysicalInterface')  : $c->get('ExternalInterface')->prop('Name') ; | 
					
						
							|  |  |  |   my $vlan=$c->get('ExternalInterface')->prop('VLAN'); | 
					
						
							|  |  |  |   $name=~ s/\.$vlan$//; | 
					
						
							|  |  |  |   my ($newl) = grep ( /$name$/ , @adapters); | 
					
						
							|  |  |  |   push @adapters, "$newl.$vlan"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #TODO if external virtual lan is configured | 
					
						
							| 
									
										
										
										
											2023-10-26 11:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Expand templates for every adapters found | 
					
						
							|  |  |  | foreach my $adapter (@adapters){ | 
					
						
							|  |  |  |     my (undef, undef, undef, undef, $nic) = split(/\t/, $adapter, 5); | 
					
						
							|  |  |  |     push @nics, $nic; | 
					
						
							|  |  |  |     esmith::templates::processTemplate({ | 
					
						
							|  |  |  |         MORE_DATA => { THIS_DEVICE => $nic }, | 
					
						
							|  |  |  |         TEMPLATE_PATH => '/etc/sysconfig/network-scripts/ifcfg-ethX', | 
					
						
							|  |  |  |         OUTPUT_FILENAME => "/etc/sysconfig/network-scripts/ifcfg-$nic" | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     esmith::templates::processTemplate({ | 
					
						
							|  |  |  |         MORE_DATA => { THIS_DEVICE => $nic }, | 
					
						
							|  |  |  |         TEMPLATE_PATH => '/etc/sysconfig/network-scripts/route-ethX', | 
					
						
							|  |  |  |         OUTPUT_FILENAME => "/etc/sysconfig/network-scripts/route-$nic" | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     esmith::templates::processTemplate({ | 
					
						
							|  |  |  |         MORE_DATA => { THIS_DEVICE => $nic }, | 
					
						
							|  |  |  |         TEMPLATE_PATH => '/var/lib/dhclient/dhclient.conf', | 
					
						
							|  |  |  |         OUTPUT_FILENAME => "/var/lib/dhclient/dhclient-$nic.conf" | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Build a list of interfaces for which we want to keep the config | 
					
						
							|  |  |  | foreach ($c->get_all_by_prop( type => 'interface')){ | 
					
						
							|  |  |  |     push @nics, $_->prop('Name'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | push @nics, $_ foreach (qw/ppp0 lo/); | 
					
						
							|  |  |  | my %dedup; | 
					
						
							|  |  |  | @dedup{@nics} = (); | 
					
						
							|  |  |  | @nics = keys %dedup; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Now remove any ifcfg-X, route-X or dhclient-X.conf | 
					
						
							|  |  |  | # for NIC which have been removed | 
					
						
							|  |  |  | foreach my $removed (glob "/etc/sysconfig/network-scripts/ifcfg-*"){ | 
					
						
							|  |  |  |     $removed =~ m/ifcfg\-(.*)$/; | 
					
						
							|  |  |  |     my $interface = $1; | 
					
						
							|  |  |  |     next if (grep { $_ eq $interface } @nics); | 
					
						
							|  |  |  |     unlink $removed; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | foreach my $removed (glob "/etc/sysconfig/network-scripts/route-*"){ | 
					
						
							|  |  |  |     $removed =~ m/route\-(.*)$/; | 
					
						
							|  |  |  |     my $interface = $1; | 
					
						
							|  |  |  |     next if (grep { $_ eq $interface } @nics); | 
					
						
							|  |  |  |     unlink $removed; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | foreach my $removed (glob "/var/lib/dhclient/dhclient-*.conf"){ | 
					
						
							|  |  |  |     $removed =~ m/dhclient\-(.*)\.conf$/; | 
					
						
							|  |  |  |     my $interface = $1; | 
					
						
							|  |  |  |     next if (grep { $_ eq $interface } @nics); | 
					
						
							|  |  |  |     unlink $removed; | 
					
						
							|  |  |  | } |