The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;

use File::Temp;
use Sys::Hostname;

use Vulcan::Sudo;
use Vulcan::OptConf;

Vulcan::Sudo->sudo();

$| ++;

=head1 SYNOPSIS

 $0 [--up|--down|--reload]

=cut
my ( $option, %seco );
BEGIN { $option = Vulcan::OptConf->load(); %seco = $option->dump( 'seco' ) }

use lib $seco{lib}; use SECO::Conf::Auto;

my %o = $option->get( qw( up down reload ) )->dump;
my $conf = SECO::Conf::Auto->new( $seco{conf} );
my $host = Sys::Hostname::hostname();
my $info = $conf->search( $host );

die "no seco config!" unless my ( $tier, $dc, $replica ) = @{ $info->{$host} };

my $seco = $conf->{$tier}{$dc};
my ( $script, $vlan, @conf, @device ) = '/etc/sysconfig/network-scripts/ifcfg';

$info = $seco->dump( vips => $replica );

while ( my ( $ipv4, $conf ) = each %{ $info->{$host} } )
{
    next if ( @conf = split ':', $conf ) < 3;
    $vlan = shift @conf if $conf[0] =~ /^vlan/;

    my ( $mask, $iface, $id ) = @conf;
    my $device = $vlan ? "$vlan:$id" : "$iface:$id";
    my $temp = File::Temp->new( UNLINK => 0, SUFFIX => '.vips' );

    push @device, $device;
    print $temp <<CONF;
IPADDR=$ipv4
NETMASK=$mask
DEVICE=$device
BOOTPROTO=static
TYPE=Ethernet
ONBOOT=yes
CONF
    close $temp; chmod 0644, $temp; system "mv $temp $script-$device";
}

@device = sort @device;

if ( $vlan )
{
    my $temp = File::Temp->new( UNLINK => 0, SUFFIX => '.vips' );

    unshift @device, $vlan;
    print $temp <<CONF;
VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID_NO_PAD
PHYSDEV=$conf[1]
DEVICE=$vlan
BOOTPROTO=static
TYPE=Ethernet
ONBOOT=yes
CONF
    close $temp; chmod 0644, $temp; system "mv $temp $script-$vlan";
}

$o{down} = $o{up} = 1 if $o{reload};
map { system "/sbin/ifdown $_" } @device if $o{down};
map { system "/sbin/ifup $_" } @device if $o{up};

exit 0;