#!/usr/bin/perl

# alex, alex@noris.de, 2013-03-15
# sgikas, sgikas@noris.de, 2013-06-20

BEGIN {
    unshift @INC, '/usr/pop/lib';
}

use strict;
use 5.010;
use utf8;
use warnings;

use lib "/usr/lib/netapp-manageability-sdk-5.0/lib/perl/NetApp";
use NaServer;
use NaElement;

use Config::Simple;
use CGI;
use Data::Dumper;
use Dbase::Globals qw/get_standort_from_hardware/;     # kunde
use Dbase::Help qw(:readonly DoSelect DoFn qquote);    # kunde
use Loader qw/print_adresse/;                          # kunde
use noris::Ticket::API qw(get_pooled_connection);      # kunde
use HTML::Entities;                                    # libhtml-parser-perl
use noris::IO::AutoEncoding qw(decode_auto);           # libnoris-io-autoencoding-perl

my ($username) = DoFn 'SELECT name FROM person WHERE user = ' . qquote( $ENV{'REMOTE_USER'} );
$username =~ s/^(Herr|Frau)\s+//;

my $q         = new CGI;
my $ticket    = $q->url_param('ticket');
my $otrs_user = 'otrs-sys';

print $q->header( -charset => 'UTF-8' );
print <<_;
<html>
<head>
    <title>Technogroup Case</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" href="/layout_vmcreate.css" />
</head>
<body>
_

my %Config;
Config::Simple->import_from( '/etc/technogroup.ini', \%Config )
  || fehler("Konnte Config '/etc/technogroup.ini' nicht laden!");

if ( !$ticket ) {
    fehler('Konnte keine Ticketnummer finden!');
}

my ( $ticket_nr, $title, $kunde, $created, $changed, $type, $status, $queue ) =
  get_pooled_connection($otrs_user)->get_ticket(
    $ticket,
    [qw/ticket_number title kunde created changed type status queue/]
  );

# Nagios@monitor2: CRITICAL: na2.office.noris.de/Plattenstatus
$title =~ /.*: (.*)\//;
my $hostname = $1;
fehler('Konnte KEINEN NetApp Hostname in diesem Ticket finden!') if !$hostname;

my $hardware_id = get_hardware_from_hostname($hostname);
fehler("Konnte KEINE Hardware zu '$hostname' finden!") unless $hardware_id;

my ( $seriennr, $hwtyp ) = DoFn "SELECT seriennr, name FROM hardware WHERE id = $hardware_id";
$seriennr = '-- Unbekannt --' unless $seriennr;
$hwtyp    = '-- Unbekannt --' unless $hwtyp;

my $standort_id = get_standort_from_hardware($hardware_id);
fehler("Konnte KEINEN Standort zur Hardware #$hardware_id finden!") unless $standort_id;

my $adresse = DoFn "SELECT adresse FROM person WHERE id = $standort_id";

$adresse = print_adresse($adresse);
$adresse =~ s/^http//;
$adresse =~ s/Gebäude C, EG\n//;

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

my $failed = get_failed_disk() || '--- UNBEKANNT ---';

print <<EOF;
<p>
<p><h1>mit <a href="https://intra.office.noris.de/wiki/index.php/Netapp_7-Mode/Howto#defekte_HDD_aus_dem_DHS_Festplatten_Pool" target="_parent">DHS Festplatten Pool</a></h1></p>
<p>
<ul>
 <li>Defekte Festplatte mit der passenden aus dem <a href="https://intra.office.noris.de/wiki/index.php/Netapp#defekte_HDD_aus_dem_DHS_Festplatten_Pool" target="_parent">DHS Festplatten Pool</a> austauschen.</li>
 <li>Defekte Festplatte aus dem <a href="https://intra.office.noris.de/wiki/index.php/Netapp#defekte_HDD_aus_dem_DHS_Festplatten_Pool" target="_parent">DHS Festplatten Pool</a> streichen.</li>
 <li>mit folgender <u>ausgef&uuml;llter Mail</u> jetzt noch an Technogroup ( tgsupport\@technogroup.com ) melden:</li>
</ul>

</p>
<pre style="border-style:solid; padding: 30px;">
EOF

my $t = <<EOF;
Hallo,

wir haben eine Ersatz-Festplatte für eine '$hwtyp' (Serien-Nr: $seriennr) aus unserem Pool genommen.

Genaue Daten:

PN: FILLME
SN: FILLME

$failed

Ersatz bitte zum folgendem Standort schicken:

noris network AG
$adresse

Ein Techniker wird nicht benötigt.

Vielen Dank,
mit freundlichen Grüßen

$username

--
noris network AG - Thomas-Mann-Straße 16-20 - D-90471 Nürnberg -
Tel +49 911 9352-0 - Fax +49 911 9352-100

http://www.noris.de - The IT-Outsourcing Company

Vorstand: Ingo Kraupa (Vorsitzender), Joachim Astel, Hansjochen Klenk -
Vorsitzender des Aufsichtsrats: Stefan Schnabel - AG Nürnberg HRB 17689
EOF

print encode_entities($t);

print <<_;
</pre>
</p>
_


print '<br><hr><br>';

print <<EOF;
<p>
<p><h1>ohne <a href="https://intra.office.noris.de/wiki/index.php/Netapp_7-Mode/Howto#defekte_HDD_aus_dem_DHS_Festplatten_Pool" target="_parent">DHS Festplatten Pool</a></h1></p>
<p>
<ul>
 <li>Folgende Mail jetzt an Technogroup ( tgsupport\@technogroup.com ) schicken:</li>
</ul>
</p>
<pre style="border-style:solid; padding: 30px;">
EOF

my $t = <<EOF;
Hallo,

wir bräuchten eine Ersatz-Festplatte für eine '$hwtyp' (Serien-Nr: $seriennr)

Genaue Daten:

$failed

Ersatz bitte zum folgendem Standort schicken:

noris network AG
$adresse

Ein Techniker wird nicht benötigt.

Vielen Dank,
mit freundlichen Grüßen

$username

--
noris network AG - Thomas-Mann-Straße 16-20 - D-90471 Nürnberg -
Tel +49 911 9352-0 - Fax +49 911 9352-100

http://www.noris.de - The IT-Outsourcing Company

Vorstand: Ingo Kraupa (Vorsitzender), Joachim Astel, Hansjochen Klenk -
Vorsitzender des Aufsichtsrats: Stefan Schnabel - AG Nürnberg HRB 17689
EOF

print encode_entities($t);

print <<_;
</pre>
</p>
_

print <<_;
</body>
</html>
_

sub get_failed_disk {

    my $s = NaServer->new( $hostname, 1, 3 );
    $s->set_transport_type('HTTPS');
    $s->set_style('LOGIN');
    $s->set_admin_user( $Config{'Username'}, $Config{'Password'} );

    my $output = $s->invoke('disk-list-info');
    my $aggrs  = $output->child_get('disk-details');
    #Can't call method "children_get" on an undefined value at
    #Bei der Meldung stimmt was mit den Zugangsdaten nicht.
    # -r--------  /etc/technogroup.ini
    # Username Username
    # Password Password
    my @result = $aggrs->children_get();
    foreach my $aggr (@result) {
        if ( $aggr->child_get_string('broken-details') ) {
            if (($aggr->child_get_string('broken-details') eq 'failed') || ($aggr->child_get_string('broken-details') eq 'not responding')) {
                my $type = $aggr->child_get_string('disk-type');
                my $size = $aggr->child_get_string('raw-disk-sectors');
                my $rpm  = $aggr->child_get_string('rpm');
                $size = sprintf( '%.f', $size );

                if ( $type eq 'ATA' ) {
                    $type = 'SATA';
                    $size = $size / 1000000000 * 512;
                }
                elsif ( $type eq 'FCAL' ) {
                    $type = 'FC';
                    $size = $size / 1000000000 * 520;
                }
                else {
                    return 'Unknown Disk Type';
                }
                $size = sprintf( '%.f', $size );

                return "$type, $size GB $rpm RPM\n";
            }
        }
    }
}

sub get_hardware_from_hostname {
    my ($search_for) = @_;
    my $ip =
      DoFn 'SELECT id FROM ipkunde WHERE name = ? AND ( ende IS NULL OR ende > UNIX_TIMESTAMP( NOW() ) )',
      undef, 1, $hostname;

    my $host = DoFn 'SELECT host FROM host_ipkunde WHERE ipkunde = ?',
      undef, 1, $ip;

    my $hw = DoFn 'SELECT hardware FROM host_hardware WHERE host = ?',
      undef, 1, $host;

    return $hw;
}

sub fehler {
    my ($error) = @_;
    print <<_;
<p>$error</p>
<p>Also auch kein Ticket aufgemacht.</p> 
</body>
</html>
_
    exit 0;
}

