#!/usr/bin/perl -w # # Copyright (c) 2003-2018 University of Utah and the Flux Group. # # {{{EMULAB-LICENSE # # This file is part of the Emulab network testbed software. # # This file is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or (at # your option) any later version. # # This file is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public # License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this file. If not, see . # # }}} # use strict; use English; use Getopt::Std; use Data::Dumper; # # Add a new type to images having another type (or architecture). # sub usage() { print STDERR "Usage: addtypetoimages \n"; exit(-1); } my $optlist = "vn"; my $verbose = 0; my $impotent = 0; # Protos sub fatal($); # # Configure variables # my $TB = "@prefix@"; # # Testbed Support libraries # use lib "@prefix@/lib"; use emdb; use emutil; use User; use NodeType; use Image; # # Turn off line buffering on output # $| = 1; # # Untaint the path # $ENV{'PATH'} = "/bin:/sbin:/usr/bin:"; # # Parse command arguments. # my %options = (); if (! getopts($optlist, \%options)) { usage(); } if (defined($options{'v'})) { $verbose = 1; } if (defined($options{'n'})) { $impotent = 1; } usage() if (@ARGV != 2); # # Map invoking user to object. # my $this_user = User->ThisUser(); if (! defined($this_user)) { fatal("You ($UID) do not exist!"); } fatal("Not a testbed administrator") if ($this_user->IsAdmin()); my $newtype_string = shift(@ARGV); my $oldtype_string = shift(@ARGV); my $newtype = NodeType->Lookup($newtype_string); fatal("Not a valid PC type: $newtype_string") if (!defined($newtype)); my $oldtype = NodeType->Lookup($oldtype_string); fatal("Not a valid PC type: $oldtype_string") if (!defined($oldtype)); # # Look in osidtoimageid to find all the images that run on the old type, # and add the new type to that image. # my $query_result = DBQueryFatal("select imageid from osidtoimageid ". "where type='$oldtype_string'"); while (my ($imageid) = $query_result->fetchrow_array()) { my $image = Image->Lookup($imageid); if (!defined($image)) { print STDERR "Cannot lookup $imageid, skipping\n"; next; } my @typelist = $image->TypeList(); next if (grep {$_ eq $newtype_string} map { $_->type() } @typelist); if ($impotent) { print "Would add newtype to $image\n"; } else { if ($verbose) { print "Adding newtype to $image\n"; } $image->SetRunsOnNodeType($newtype_string) == 0 or fatal("Could not add new type to $image"); } } exit(0); sub fatal($) { my ($mesg) = $_[0]; die("*** $0:\n". " $mesg\n"); }