On 05/26/11 17:16, Mike Mestnik wrote: > In-Reply-To: <20080412023656.gr14...@yi.org> > > Hello, > This is an old thread, but I find myself in a similar situation. I'd > like to edit a 4in6 tunnel endpoint and reconfigure the interface. > While I can handle the Apache/sudo parts of this I'm stuck with... OK > now how and I going to change this one value out of this whole file? > > My current plan is to convert the file to XML storing away comments and > partial white space as well as the settings. Then I should be able to > edit the setting a write the file back out. > > Any better ideas? For this project Perl seams to be the ideal language. > > I may contact the ifupdown maintainer to include this in his package, so > I'm looking to get it done right. > I'm quite certain this is a some-what usable solution. However it dosen't appear to have any means to preserver order. I'd also like input for the XMLers about the use of etc_network_interfaces for the RootName?
#!/usr/bin/perl -w use warnings; use strict; use feature 'switch'; use XML::Simple; use Data::Dumper; sub trim { $_[0]=~s/\A\s+//; $_[0]=~s/\s+\z//; $_[0]; } my $file = q{/etc/network/interfaces}; open (my $INTER, '<', $file) or die "Can't read $file: $!"; my %tmp; $tmp{'HEAD'}=['']; my $ptr = \$tmp{'HEAD'}[0]; LINE: while (my $ln=<$INTER>) { chomp $ln; # A line may be extended across multiple lines by making the last charac- # ter a backslash. while ($ln =~ /\\$/) { chop $ln; chomp($ln.=<$INTER>); last if (eof $INTER); } if (ref($ptr) ne 'SCALAR' and $ln =~ /^\s*#/ ) { push(@{$tmp{'COMMENT'}}, $ln); next LINE; } foreach my $rx (qr(auto),qr(allow-auto),qr(allow-[^ ]*), qr(mapping),qr(iface)) { if ($ln =~ /^\s*($rx)\s+(\S*)\s*(.*)$/) { $ptr = undef; given ($1){ when('mapping') { push(@{$tmp{'mapping'}},{ $2 => { 'opts' => $3 }}); $ptr = $tmp{'mapping'}[$#{$tmp{'mapping'}}]{$2}; } when('iface') { push(@{$tmp{'iface'}},{ $2 => { 'opts' => $3 }}); $ptr = $tmp{'iface'}[$#{$tmp{'iface'}}]{$2}; } default { push (@{$tmp{$1}}, trim("$2 $3")); $ptr = $tmp{$1}; } } next LINE; } } if ($ln =~ /^\s*(\S*)\s(.*)$/) { if (defined $ptr) { given (ref($ptr)){ when('HASH') { given ($1){ when(['up', 'down']) { push(@{${$ptr}{$1}}, $2); } default { ${$ptr}{$1}.=$2; } } } when('ARRAY') { push(@{$ptr}, trim("$1 $2")); } when('SCALAR') { ${$ptr}.="$ln\n"; } default { warn Dumper(ref($ptr)); warn Dumper(\$ptr); } } next LINE; } warn $ln; next LINE; } if ($ln eq '') { push(@{$tmp{'br'}}, ''); next LINE; } warn $ln; } warn XMLout(\%tmp, (RootName => 'etc_network_interfaces')); -- To UNSUBSCRIBE, email to debian-user-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/4de5beb7.5060...@mikemestnik.net