all the python scripts are for python2, and fedora31 requires to be specific
[vsys-scripts.git] / root-context / exec / reserve_udp_port
1 #!/usr/bin/perl
2
3 use strict;
4
5 $|=1;
6
7 my $slicename;
8 my $xid;
9 my $portnumber;
10 my $fuser_cmd;
11 my $pid;
12 my @vinfo;
13 my $foo;
14 my $real_xid;
15
16 $slicename = $ARGV[0];
17 $xid = int(`id -u $slicename`) || die("Could not determine xid of $slicename\n");
18 $portnumber = <STDIN>;
19 chop($portnumber);
20
21 if ($portnumber!~/^\d+$/) {
22         die("$portnumber is not a port number");
23 }
24
25 if ($portnumber<61001 || $portnumber>65535) {
26         die("$portnumber lies in the local port-rover range\n");
27 }
28
29 $fuser_cmd = "ncontext --nid $xid --migrate -- vcontext --xid $xid --migrate fuser -n udp $portnumber 2>/dev/null";
30 $pid = `$fuser_cmd` || die("Please bind to port $portnumber, e.g. run nc -ul $portnumber."); 
31 $pid=~s/\s+//g;
32
33 my $cat_cmd;
34
35 $cat_cmd = "chcontext --ctx 1 cat /proc/$pid/vinfo";
36 $_ = `$cat_cmd`;
37 @vinfo = split /\n/;
38 ($#vinfo>0) || die("Port reservation failed. Please try again.\n");
39
40 $_=@vinfo[0];
41
42 ($foo,$real_xid) = split;
43
44 if (int($real_xid)!=$xid) {
45     die("Port $portnumber belongs to user $real_xid, not to you.\n"); 
46 }
47
48 # OK. We're good
49 # Only, slices are allowed only 1 port reservation/session
50
51 if ( -f "/dev/shm/$slicename-port" ) {
52         print "You have already reserved the following port:\n";
53         system("cat /dev/shm/$slicename-port");
54         exit(1);
55 }
56
57 open FIL,">/dev/shm/$slicename-port";
58 print FIL "$portnumber";
59 close FIL;
60
61 system("iptables -t mangle -A INPUT -m udp -p udp --dport $portnumber -j MARK --set-mark $xid");