#!/usr/bin/perl use lib "/opt/vyatta/share/perl5/"; use VyattaConfig; use VyattaQosPolicy; use strict; use Getopt::Long; my $qosNode = 'qos-policy'; my $debug = $ENV{'QOS_DEBUG'}; my @update = (); my @delete = (); my $list = undef; GetOptions( "list" => \$list, "update=s{3}" => \@update, "delete=s{2}" => \@delete, ); ## list available qos policy names sub list_available { my $config = new VyattaConfig; my @nodes = (); foreach my $policy ( $config->listNodes($qosNode) ) { foreach my $name ( $config->listNodes("$qosNode $policy") ) { push @nodes, $name; } } print join( ' ', @nodes ), "\n"; } ## delete_interface('eth0', 'out') # remove all filters and qdisc's sub delete_interface { my ( $interface, $direction ) = @_; if ( $direction =~ /^out/ ) { # delete old qdisc - will give error if no policy in place system("tc qdisc del dev $interface root 2>/dev/null"); system("tc filter del dev $interface 2>/dev/null"); } else { return -1; } } ## update_interface('eth0', 'out', 'my-shaper') # update policy to interface sub update_interface { my ( $interface, $direction, $name ) = @_; my $config = new VyattaConfig; # TODO: add support for ingress ( $direction =~ /^out/ ) or die "Only out direction supported"; foreach my $policy ( $config->listNodes($qosNode) ) { if ( $config->exists("$qosNode $policy $name") ) { $config->setLevel("$qosNode $policy $name"); my $policy = VyattaQosPolicy->config( $config, $policy ); defined $policy or die "undefined policy"; # When doing debugging just echo the commands my $out; if (defined $debug) { open $out, '>-' or die "can't open stdout: $!"; } else { open $out, "|-" or exec qw/sudo tc -batch -/ or die "Tc setup failed: $!\n"; } $policy->commands($out, $interface); close $out or die "Tc command failed: $!\n"; exit 0; } } die "Unknown $qosNode $name\n"; } if ( defined $list ) { list_available(); exit 0; } if ( $#delete == 1 ) { delete_interface(@delete); exit 0; } if ( $#update == 2 ) { update_interface(@update, $debug); exit 0; } print <