123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/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;
|