Reserve a tcp port on a node.
[vsys-scripts.git] / exec / reserve_tcp_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 my $cat_cmd;
16
17 $slicename = $ARGV[0];
18 $xid = int(`id -u $slicename`) || die("Could not determine xid of $slicename\n");
19 $portnumber = <STDIN>;
20 chop($portnumber);
21
22 if ($portnumber!~/^\d+$/) {
23         die("$portnumber is not a port number");
24 }
25
26 $fuser_cmd = "ncontext --nid $xid --migrate -- vcontext --xid $xid --migrate fuser -n tcp $portnumber";
27 $pid = `$fuser_cmd` || die("Please bind to port $portnumber, e.g. run nc -l $portnumber."); 
28
29 $cat_cmd = "cat /proc/$pid/vinfo";
30 $_ = `$cat_cmd`;
31 @vinfo = split /\n/;
32 ($#vinfo>0) || die("Port reservation failed. Please try again.\n");
33
34 $_=@vinfo[0];
35
36 ($foo,$real_xid) = split;
37
38 if (int($real_xid)!=$xid) {
39     die("Port $portnumber belongs to user $real_xid, not to you.\n"); 
40 }
41
42 close CMD;