#!/usr/bin/perl

########################################################
my $SYSTEM_VERS 	= $ARGV[0] . "/System/Library/CoreServices/SystemVersion.plist";
my $TIER_3_LANG 	= $ARGV[0] . "/var/db/.AppleTier3Language";
my $EXIT_VALUE 		= 0;
########################################################

DO_CHECKS: 
{
    
    # Must have Mac OS X on target volume
    if (! -e $SYSTEM_VERS) {
            $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ));
            last;
    }
    
    # Must NOT be tier 3
	if (-e $TIER_3_LANG) {
            $EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ));
            last;
    }
    
    # Fail if < 10.4 or > 10.5
    if( CheckVersion("$SYSTEM_VERS", "10.4", "ProductVersion", "<") || CheckVersion("$SYSTEM_VERS", "10.5", "ProductVersion", ">=") ) {
			$EXIT_VALUE = (( 1 << 6 ) | ( 1 << 5 ));
			last;
    }

}

exit($EXIT_VALUE);

########################################################

sub CheckVersion
{
    my $path            = $_[0];
    my $version         = $_[1];
    my $keyName         = $_[2];
    my $operator        = $_[3];

    if (! -e $path) {
        return 0;
    }

    if (!$operator) {
        $operator = "==";
    }

    my $oldSeperator = $/;
    $/ = \0;

    open( PLIST, "$path") || do {
        return 0;
    };

    $plistData = <PLIST>;
    $plistData =~ /<dict>(.*?)<\/dict>/gis;

    @items = split(/<key>/, $plistData);

    shift @items;
    foreach $item (@items) {
        $item =~ /(.*?)<\/key>.*?<string>(.*?)<\/string>/gis;
        $versiondata{ $1 } = $2;
    }

    close(PLIST);

    $/ = $oldSeperator;

    # ProductBuildVersion style keys
    $versiondata{$keyName} =~ /(\d+)([A-Z])(\d+)/ && ($versiondata{$keyName} = "$1.".ord($2).".$3");
    $version =~ /(\d+)([A-Z])(\d+)/ && ($version = "$1.".ord($2).".$3");

    @theVersionArray = split(/\./, $versiondata{$keyName});
    for ($i = 0; $i < 3; $i++) {
        if(!$theVersionArray[$i]) {
            $theVersionArray[$i] = '0';
        }
    }

    @versionArray = split(/\./, $version);
    
    my $actualVersion;

    for ($i = 0; $i < 3; $i++) {
        if (($theVersionArray[$i] != $versionArray[$i]) or ($i == 2)) {

            $actualVersion = $theVersionArray[$i];
            $version = $versionArray[$i];

            last;
        }
    }

	if( $operator eq  '<' ){ return int($actualVersion)  < int($version); }
	if( $operator eq 'lt' ){ return int($actualVersion)  < int($version); }
	if( $operator eq  '>' ){ return int($actualVersion)  > int($version); }
	if( $operator eq 'gt' ){ return int($actualVersion)  > int($version); }
	if( $operator eq '<=' ){ return int($actualVersion) <= int($version); }
	if( $operator eq 'le' ){ return int($actualVersion) <= int($version); }
	if( $operator eq '>=' ){ return int($actualVersion) >= int($version); }
	if( $operator eq 'ge' ){ return int($actualVersion) >= int($version); }
	if( $operator eq '==' ){ return int($actualVersion) == int($version); }
	if( $operator eq 'eq' ){ return int($actualVersion) == int($version); }
	if( $operator eq '!=' ){ return int($actualVersion) != int($version); }
	if( $operator eq 'ne' ){ return int($actualVersion) != int($version); }
}
