#!/usr/bin/perl
use common::sense;
+use Getopt::Long;
-# FIXME: Tie to specified machines
+my $bind_to_ip;
+my $contest_id;
+
+Getopt::Long::Configure("bundling");
+GetOptions(
+ "i|bind-ip!" => \$bind_to_ip,
+ "c|contest=i" => \$contest_id,
+) && !$ARGV && $contest_id
+ or die "Usage: $0 -c <contest-id> [-i]\n";
-# Parses login.tex
-binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
-while (<STDIN>) {
+
+# Parse /etc/hosts
+open my $hosts, '<', '/etc/hosts' or die;
+my %host_to_ip = ();
+while (<$hosts>) {
+ chomp;
+ /^$/ and next;
+ /^#/ and next;
+ my @a = split /\s+/;
+ my $ip = shift @a or next;
+ $host_to_ip{$_} = $ip for @a;
+}
+close $hosts;
+
+# use Data::Dumper;
+# print Dumper(\%host_to_ip);
+
+# Parse user list
+open my $userlist, '-|:utf8', 'bin/mo-get-users --raw' or die;
+my %fullname = ();
+my %machine = ();
+while (<$userlist>) {
+ chomp;
+ my ($user, $full, $mach) = split /\t+/;
+ $fullname{$user} = $full;
+ if ($mach) {
+ if ($host_to_ip{$mach}) {
+ $machine{$user} = $host_to_ip{$mach};
+ } else {
+ print STDERR "Warning: Unknown machine $mach\n";
+ }
+ }
+}
+close $userlist;
+
+# Parse login.tex
+open my $logins, '<:utf8', 'logins.tex' or die;
+while (<$logins>) {
chomp;
s[^\\user\{][] or next;
s[}$][] or die;
- my ($login, $passwd, $full) = split /}{/;
- my ($fn, $ln) = split /\s+/, $full;
- print "cmsAddUser -c 1 -p '$passwd' '$fn' '$ln' '$login'\n";
+ my ($login, $passwd) = split /}{/;
+ my ($fn, $ln) = split /\s+/, $fullname{$login};
+ my $ip = $machine{$login};
+ print "cmsAddUser -c $contest_id -p '$passwd'",
+ ($bind_to_ip && $ip ? " -i $ip" : ""),
+ " '$fn' '$ln' '$login'\n";
}
+close $logins;
# List all contestants according to $CT_USER_LIST
if [ "$1" = --help ] ; then
- echo "Usage: mo-get-users [--full]"
+ echo "Usage: mo-get-users [--full | --raw]"
fi
[ -f cf/mop ] || { echo "Missing config file, check cwd." ; exit 1 ; }
set -e
. cf/mop
-if [ "$1" = --full ] ; then
+if [ "$1" = --raw ] ; then
+ cat $CT_USER_LIST
+elif [ "$1" = --full ] ; then
cut -d ' ' -f 1,2 <$CT_USER_LIST
else
cut -d ' ' -f 1 <$CT_USER_LIST