=head2 KEY CACHE
The cache is described in detail in L<virt-tools(8)>. In brief, if
-C<@LOCALSTATEDIR@/lib/virt-tools/keys/E<lt>UUIDE<gt>> exists (where
+C<@localstatedir@/lib/virt-tools/keys/E<lt>UUIDE<gt>> exists (where
E<lt>UUIDE<gt> is the guest's UUID), then the contents of that file
are returned directly. Otherwise we will try to create this file
after reading the key so that we don't have to read the key out of the
exit
}
-die __"no domain name or UUID listed on the command line\n" unless @ARGV == 1;
+die __"no domain name listed on the command line\n" unless @ARGV == 1;
-my $g;
+my ($g, $conn, $dom);
if ($uri) {
- $g = open_guest (\@ARGV, address => $uri);
+ ($g, $conn, $dom) = open_guest (\@ARGV, address => $uri);
} else {
- $g = open_guest (\@ARGV);
+ ($g, $conn, $dom) = open_guest (\@ARGV);
}
+my $uuid = $dom->get_uuid_string ();
+
+undef $dom;
+undef $conn;
+
+# See if the UUID exists in the cache already.
+print STDERR "checking for UUID $uuid in the cache directory\n" if $verbose;
+
+my $cachedir = "@localstatedir@/lib/virt-tools/keys";
+if (-r "$cachedir/$uuid") {
+ print STDERR "$cachedir/$uuid exists, returning contents\n" if $verbose;
+ open FILE, "$cachedir/$uuid" or die "$cachedir/$uuid: $!";
+ my $key = <FILE>;
+ chomp $key;
+ close FILE;
+ print $key, "\n";
+ exit 0;
+}
+
+print STDERR "$cachedir/$uuid not found, looking inside guest\n" if $verbose;
+
$g->launch ();
# Don't care about mountpoints. Instead, just look for a
my $key;
-SEARCH:
foreach my $partition (@partitions) {
eval {
$g->mount_ro ($partition, "/");
foreach $dir (@dirs) {
if ($g->is_dir ($dir) && $g->is_file ("$dir/key")) {
$key = $g->cat ("$dir/key");
- last SEARCH;
+ last;
}
}
};
$g->umount_all ();
+ last if $key;
}
undef $g;
n => $ARGV[0])
unless $key;
+print STDERR "try to write key to $cachedir/$uuid\n" if $verbose;
+
+if (open FILE, ">$cachedir/$uuid") {
+ print FILE $key;
+ close FILE
+}
+
print $key;
exit 0;