mirror of
				https://github.com/frebib/dotfiles.git
				synced 2024-06-14 12:57:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/perl
 | 
						|
# Made by Pierre Mavro/Deimosfr <deimos@deimos.fr>
 | 
						|
# Licensed under the terms of the GNU GPL v3, or any later version.
 | 
						|
# Version: 0.2
 | 
						|
 | 
						|
# Usage:
 | 
						|
# 1. The configuration name of OpenVPN should be familiar for you (home,work...)
 | 
						|
# 2. The device name in your configuration file should be fully named (tun0,tap1...not only tun or tap)
 | 
						|
# 3. When you launch one or multiple OpenVPN connexion, be sure the PID file is written in the correct folder (ex: --writepid /run/openvpn/home.pid)
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
use utf8;
 | 
						|
use Getopt::Long;
 | 
						|
 | 
						|
my $openvpn_enabled='/dev/shm/openvpn_i3blocks_enabled';
 | 
						|
my $openvpn_disabled='/dev/shm/openvpn_i3blocks_disabled';
 | 
						|
 | 
						|
# Print output
 | 
						|
sub print_output {
 | 
						|
    my $ref_pid_files = shift;
 | 
						|
    my @pid_files = @$ref_pid_files;
 | 
						|
    my $change=0;
 | 
						|
 | 
						|
    # Total pid files
 | 
						|
    my $total_pid = @pid_files;
 | 
						|
    if ($total_pid == 0) {
 | 
						|
        print "VPN: down\n"x2;
 | 
						|
        # Delete OpenVPN i3blocks temp files
 | 
						|
        if (-f $openvpn_enabled) {
 | 
						|
            unlink $openvpn_enabled or die "Can't delete $openvpn_enabled\n";
 | 
						|
            # Colorize if VPN has just went down
 | 
						|
            print '#FF0000\n';
 | 
						|
        }
 | 
						|
        unless (-f $openvpn_disabled) {
 | 
						|
            open(my $shm, '>', $openvpn_disabled) or die "Can't write $openvpn_disabled\n";
 | 
						|
        }
 | 
						|
        exit(0);
 | 
						|
    }
 | 
						|
 | 
						|
    # Check if interface device is present
 | 
						|
    my $vpn_found=0;
 | 
						|
    my $pid;
 | 
						|
    my $cmd_line;
 | 
						|
    my @config_name;
 | 
						|
    my @config_path;
 | 
						|
    my $interface;
 | 
						|
    my $current_config_path;
 | 
						|
    my $current_config_name;
 | 
						|
    foreach (@pid_files) {
 | 
						|
        # Get current PID
 | 
						|
        $pid=0;
 | 
						|
        open(PID, '<', $_);
 | 
						|
        while(<PID>) {
 | 
						|
            chomp $_;
 | 
						|
            $pid = $_;
 | 
						|
        }
 | 
						|
        close(PID);
 | 
						|
        # Check if PID has been found
 | 
						|
        if ($pid ==0) {
 | 
						|
            print "Can't get PID $_: $!\n";
 | 
						|
        }
 | 
						|
 | 
						|
        # Check if PID is still alive
 | 
						|
        $cmd_line='/proc/'.$pid.'/cmdline';
 | 
						|
        if (-f $cmd_line) {
 | 
						|
            # Get config name
 | 
						|
            open(CMD_LINE, '<', $cmd_line);
 | 
						|
            while(<CMD_LINE>) {
 | 
						|
                chomp $_;
 | 
						|
                if ($_ =~ /--config\s*(.*\.conf)/) {
 | 
						|
                    # Get interface from config file
 | 
						|
                    $current_config_path = $1;
 | 
						|
                    # Remove unwanted escape chars
 | 
						|
                    $current_config_path =~ s/\x{00}//g;
 | 
						|
                    $interface = 'null';
 | 
						|
                    # Get configuration name
 | 
						|
                    if ($current_config_path =~ /(\w+).conf/) {
 | 
						|
                        $current_config_name=$1;
 | 
						|
                    } else {
 | 
						|
                        $current_config_name='unknow';
 | 
						|
                    }
 | 
						|
                    # Get OpenVPN interface device name
 | 
						|
                    open(CONFIG, '<', $current_config_path) or die "Can't read config file '$current_config_path': $!\n";
 | 
						|
                    while(<CONFIG>) {
 | 
						|
                        chomp $_;
 | 
						|
                        if ($_ =~ /dev\s+(\w+)/) {
 | 
						|
                            $interface=$1;
 | 
						|
                            last;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    close(CONFIG);
 | 
						|
                    # check if interface exist
 | 
						|
                    unless ($interface eq 'null') {
 | 
						|
                        if (-d "/sys/class/net/$interface") {
 | 
						|
                            push @config_name, $current_config_name;
 | 
						|
                            $vpn_found=1;
 | 
						|
                            # Write enabled file
 | 
						|
                            unless (-f $openvpn_enabled) {
 | 
						|
                                open(my $shm, '>', $openvpn_enabled) or die "Can't write $openvpn_enabled\n";
 | 
						|
                                $change=1;
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            close(CMD_LINE);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    # Check if PID found
 | 
						|
    my $names;
 | 
						|
    my $short_status;
 | 
						|
    if ($vpn_found == 1) {
 | 
						|
        $names = join('/', @config_name);
 | 
						|
        $short_status='up';
 | 
						|
    } else {
 | 
						|
        $short_status='down';
 | 
						|
        $names = $short_status;
 | 
						|
    }
 | 
						|
 | 
						|
    print "VPN: $names\n";
 | 
						|
    print "VPN: $short_status\n";
 | 
						|
 | 
						|
    # Print color if there were changes
 | 
						|
    print "#00FF00\n" if ($change == 1);
 | 
						|
 | 
						|
    exit(0);
 | 
						|
}
 | 
						|
 | 
						|
sub check_opts {
 | 
						|
    # Vars
 | 
						|
    my @pid_file=glob '/run/openvpn/*.pid';
 | 
						|
 | 
						|
    # Set options
 | 
						|
    GetOptions( "help|h" => \&help,
 | 
						|
        "p=s"    => \@pid_file);
 | 
						|
 | 
						|
    print_output(\@pid_file);
 | 
						|
}
 | 
						|
 | 
						|
sub help {
 | 
						|
    print "Usage: openvpn [-d pid folder files]\n";
 | 
						|
    print "-d : pid folder files (default /run/openvpn/*.pid)\n";
 | 
						|
    print "Note: devices in configuration file should be named with their number (ex: tun0, tap1)\n";
 | 
						|
    exit(1);
 | 
						|
}
 | 
						|
 | 
						|
&check_opts;
 |