#!/usr/bin/perl -w
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
use POSIX qw( EXIT_FAILURE EXIT_SUCCESS );
use Sys::Detect::Virtualization;

=head1 NAME

virtdetect -- Detect if this system is running as a virtual machine

=head1 SYNOPSIS

virtdetect [ --verbose ] [ --detect-host ]

=head1 DESCRIPTION

Attempts to determine if this system is running under some form of
virtualization.

If --verbose is enabled, each check will be output.  Otherwise, only the result
will be output.

if --detect-host is enabled, try and detect virtualization host (as opposed to
guest) platforms

=head1 OPTIONS

=over 4

=item B<--verbose>

Enable debug output

=item B<--detect-host>

Try to detect virtualization host (as opposed to guest) platform.

=item B<--help>

This help

=item B<--man>

Full manpage

=back

=head1 EXIT STATUS

=over 4

=item 0

No virtualization detected

=item 1

Virtualization detected

=item 2

More than one kind of virtualization detected

=back

=head1 SEE ALSO

L<Sys::Detect::Virtualization>, 
L<http://www.dmo.ca/blog/detecting-virtualization-on-linux>

=head1 LICENCE AND COPYRIGHT

Copyright (C) 2009 Roaring Penguin Software Inc.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

=cut

my $verbose = 0;
my $detect_host = 0;
my $rc = GetOptions(
	'verbose'  => \$verbose,
	'detect-host'  => \$detect_host,
	'help'     => sub { pod2usage(-exitval => EXIT_SUCCESS, -verbose => 1) },
	'man'      => sub { pod2usage(-exitval => EXIT_SUCCESS, -verbose => 2) },
);

if(!$rc) {
	# Commandline parse failure.
	pod2usage(-exitval => EXIT_FAILURE, -verbose => 0);
}

my $d = eval { Sys::Detect::Virtualization->new({ verbose => $verbose, ignore_host => !$detect_host }); };
if( $@ ) {
	my $err = $@;
	$err =~ s/ at .*//;
	pod2usage(
		-exitval => EXIT_FAILURE,
		-message => $err,
		-verbose => 0
	);
}


my @types = $d->detect();
if( @types == 0 ) {
	print "No virtualization detected\n";
	exit(0);
} elsif(@types == 1) {
	print "Detected $types[0]\n";
	exit(1);
} else {
	print "Multiple possible virtualization systems detected:\n";
	print "\t$_\n" for @types;
	exit(2);
}