###
# SNMP: OID:46618 SYSTEM:AXEL
# 18/06/2024
###


package Ocsinventory::Agent::Modules::Snmp::46618;

use strict;
no strict 'refs';
use warnings;

#######################################################################################
#######################################################################################
sub AxelDeviceGetSN
{
my $MAC = shift(@_);
my $str;
my $lg;
my $MODEL;
my $CHRONO;

$MODEL = substr($MAC, 9, 2);
$MODEL = hex("0x$MODEL");

$CHRONO = substr($MAC, 12, 2);
$str = substr($MAC, 15, 2);
$CHRONO = hex("0x$CHRONO$str");

$str="0000XXX";
if (($MODEL == 0x2c) || ($MODEL == 0x2d)) {$str="B81180F";}
if (($MODEL == 0x2e) || ($MODEL == 0x2f)) {$str="1919M85";}
if (($MODEL == 0x30) || ($MODEL == 0x31)) {$str="B10780G";}
if (($MODEL == 0x32) || ($MODEL == 0x33)) {$str="B10780M";}
if (($MODEL == 0x34) || ($MODEL == 0x35)) {$str="230185B";}
if (($MODEL == 0x36) || ($MODEL == 0x37)) {$str="B509M90";}
if (($MODEL == 0x42) || ($MODEL == 0x43)) {$str="B101M90";}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {$str="2906M95";}
if (($MODEL == 0x3e) || ($MODEL == 0x3f)) {$str="B90180G";}
if (($MODEL == 0x40) || ($MODEL == 0x41)) {$str="B90680G";}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {$str="B401G10";}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {$str="3401G15";}

if (($MODEL == 0x2d) || ($MODEL == 0x2f) || ($MODEL == 0x31)||
    ($MODEL == 0x33) || ($MODEL == 0x35) || ($MODEL == 0x37)||
    ($MODEL == 0x3d) || ($MODEL == 0x3f) || ($MODEL == 0x41)||
    ($MODEL == 0x43) || ($MODEL == 0x45) || ($MODEL == 0x47)) {$CHRONO =$CHRONO + 65536;}

$CHRONO = "000$CHRONO";
$lg = length ($CHRONO);
$CHRONO = substr ($CHRONO, $lg - 5);

return "$str$CHRONO";
}

#######################################################################################
#######################################################################################
sub AxelDeviceGetModel
{
my $MODEL = shift(@_);
my $str="???";

$MODEL = hex("0x$MODEL");
if (($MODEL == 0x2c) || ($MODEL == 0x2c)) {$str="80F";}
if (($MODEL == 0x2e) || ($MODEL == 0x2f)) {$str="85";}
if (($MODEL == 0x30) || ($MODEL == 0x31)) {$str="80G";}
if (($MODEL == 0x32) || ($MODEL == 0x33)) {$str="80WMS";}
if (($MODEL == 0x34) || ($MODEL == 0x35)) {$str="85B";}
if (($MODEL == 0x36) || ($MODEL == 0x37)) {$str="90";}
if (($MODEL == 0x42) || ($MODEL == 0x43)) {$str="90";}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {$str="95";}
if (($MODEL == 0x3e) || ($MODEL == 0x3f)) {$str="80G";}
if (($MODEL == 0x40) || ($MODEL == 0x41)) {$str="80G";}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {$str="G10";}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {$str="G15";}
return "AX3000 Model $str";
}

#######################################################################################
#######################################################################################
sub AxelDeviceWireless
{
my $MODEL = shift(@_);
my $FW = shift(@_);

my $pos = index($FW, 'WFI');
if ($pos == -1) {return "no";}
$MODEL = hex("0x$MODEL");
if (($MODEL == 0x28) || ($MODEL == 0x29)) {return "802.11b/g";}
if (($MODEL == 0x2e) || ($MODEL == 0x2f)) {return "802.11b/g";}
if (($MODEL == 0x34) || ($MODEL == 0x35)) {return "802.11b/g";}
if (($MODEL == 0x36) || ($MODEL == 0x37)) {return "802.11a/b/g/n";}
if (($MODEL == 0x42) || ($MODEL == 0x43)) {return "802.11a/b/g/n";}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {return "802.11a/b/g/n";}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {return "802.11a/b/g/n";}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {return "802.11a/b/g/n";}
return "no";
}


#######################################################################################
#######################################################################################
sub AxelDeviceNetworkPorts
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL == 0x36) || ($MODEL == 0x37)) {return "1 Gb/s";}
if (($MODEL == 0x42) || ($MODEL == 0x43)) {return "1 Gb/s";}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {return "1 Gb/s";}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {return "1 Gb/s";}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {return "1 Gb/s";}
return "100 Mb/s";
}

#######################################################################################
#######################################################################################
sub AxelDeviceVGAPorts
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL == 0x42) || ($MODEL == 0x43)) {return 0;}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {return 0;}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {return 0;}
return 1;
}

#######################################################################################
#######################################################################################
sub AxelDeviceDisplayPortPorts
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL == 0x36) || ($MODEL == 0x37)) {return 1;}
if (($MODEL == 0x42) || ($MODEL == 0x43)) {return 2;}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {return 1;}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {return 2;}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {return 2;}
return 0;
}

#######################################################################################
#######################################################################################
sub AxelDeviceParallelPorts
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL >= 0xb) && ($MODEL <=0xe)) {return 1;}
if (($MODEL >= 0x20) && ($MODEL <=0x23)) {return 1;}
if (($MODEL >= 0x32) && ($MODEL <=0x35)) {return 1;}
if (($MODEL == 0x28) || ($MODEL == 0x29)) {return 1;}
if (($MODEL == 0x2e) || ($MODEL == 0x2f)) {return 1;}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {return 1;}
return 0;
}

#######################################################################################
#######################################################################################
sub AxelDeviceSerialPorts
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL >= 0xb) && ($MODEL <=0xe)) {return 2;}
if (($MODEL >= 0x20) && ($MODEL <=0x23)) {return 2;}
if (($MODEL >= 0x32) && ($MODEL <=0x35)) {return 2;}
if (($MODEL == 0x28) || ($MODEL == 0x29)) {return 2;}
if (($MODEL == 0x2e) || ($MODEL == 0x2f)) {return 2;}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {return 2;}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {return 2;}
return 0;
}


#######################################################################################
#######################################################################################
sub AxelDeviceUSBPorts
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL == 0x20) || ($MODEL == 0x21)) {return 2;}
if (($MODEL >= 0x24) && ($MODEL <=0x35)) {return 4;}
if (($MODEL == 0x36) || ($MODEL == 0x37)) {return 6;}
if (($MODEL == 0x42) || ($MODEL == 0x43)) {return 6;}
if (($MODEL == 0x3c) || ($MODEL == 0x3d)) {return 4;}
if (($MODEL == 0x44) || ($MODEL == 0x45)) {return 4;}
if (($MODEL == 0x46) || ($MODEL == 0x47)) {return 4;}
return 0;
}



#######################################################################################
#######################################################################################
sub AxelDevicePS2Ports
{
my $MODEL = shift(@_);

$MODEL = hex("0x$MODEL");
if (($MODEL >= 0xb) && ($MODEL <=0xe)) {return 2;}
if (($MODEL >= 0x20) && ($MODEL <=0x23)) {return 2;}
if (($MODEL >= 0x32) && ($MODEL <=0x35)) {return 2;}
if (($MODEL == 0x28) || ($MODEL == 0x29)) {return 2;}
if (($MODEL == 0x2e) || ($MODEL == 0x2f)) {return 2;}
return 0;
}



#######################################################################################
#######################################################################################
#######################################################################################
sub snmp_run {
  my ($session,$snmp) = @_;

  my $systdescr;
  my $result_snmp;

  my $common = $snmp->{common};
  my $logger=$snmp->{logger};

  $logger->debug("Running AXEL V1.1 (46618) MIB module");

  my $snmp_objID  = ".1.3.6.1.2.1.1.1.0";

  $result_snmp=$session->get_request(-varbindlist => [$snmp_objID]);
    if ( defined($result_snmp->{$snmp_objID}) ) {
       $systdescr=$result_snmp->{$snmp_objID};
    }



my $i;
my $tag;
my $sndtag;
my $pos;
my $postag;
my $capname;
my $capval;
my $str;
my $len;
my $code;
my $CONST_MAC_ZERO = "00:00:00:00:00:00";
my $CONST_IP_ZERO = "0.0.0.0";
my $CONST_NO = "No";
my $CONST_YES = "Yes";
my $CONST_UP = "Up";
my $CONST_DOWN = "Down";
my $nbPort;
my $thePort;
my $MODEL;


my $DEVICE_MODEL;
my $DEVICE_SN;
my $DEVICE_NAME;
my $DEVICE_IP;
my $DEVICE_DESCR = "";
my $DEVICE_FW;
my $DEVICE_ETH_STATUS = $CONST_DOWN;
my $DEVICE_ETH_MAC = $CONST_MAC_ZERO;
my $DEVICE_ETH_IP = $CONST_IP_ZERO;
my $DEVICE_ETH_DHCP = $CONST_NO;
my $DEVICE_WFI_STATUS = $CONST_DOWN;
my $DEVICE_WFI_MAC = $CONST_MAC_ZERO;
my $DEVICE_WFI_IP = $CONST_IP_ZERO;
my $DEVICE_WFI_DHCP = $CONST_NO;


$DEVICE_IP = $session->hostname;

$str = "";
$len = length ($systdescr);
$tag = substr ($systdescr, 0, 2);

if ($tag =~ "0x")
   {
### $systdescr is given as hexadecimal because 0x1F are contained in the 'comment' tag.
   $pos = 2;
Again:
   if ($pos >= $len) {goto AfterLoop;}
   $tag = substr ($systdescr, $pos, 2);
   if ($tag =~ "") {goto AfterLoop;}
   $code = chr (hex ("0x$tag"));
   $str="$str$code";
   $pos = $pos + 2;
   goto Again;

AfterLoop:
   $systdescr = $str;

### $systdescr is now a true string
   }


### is it an AXEL ID string?
$tag = substr ($systdescr, 0, 4);
if (!($tag eq "AXEL"))
   {
   printf("ERROR not axel\n");
   exit 1;
   }

$systdescr = "$systdescr ";     ## add a space to process the last tag
### Each tag (separated by a space) must be processed
$pos = index($systdescr, ' ');
while ($pos != -1) {

    $tag = substr ($systdescr, 0, $pos);
    ### remove tag from string
    $systdescr = substr ($systdescr, $pos+1);
    $pos = index($systdescr, ' ');

    $postag = index($tag, ':');
    if ($postag != -1)
        {
        $capname = substr ($tag, 0, $postag);
        $capval = substr ($tag, $postag+1);
        $tag = chr(0x1f);
        $sndtag = chr(0x20);
        $capval =~ s/$tag/$sndtag/ge;
###        print "$capname = $capval\n";

        if ($capname eq "COMMENT") {$DEVICE_DESCR=" - $capval";}
        if ($capname eq "FW") {$DEVICE_FW=$capval;}
        if ($capname eq "NAME") {$DEVICE_NAME=$capval;}
        if ($capname eq "FQDN") {$DEVICE_NAME=$capval;}

        if ($capname eq "AXEL") {$DEVICE_ETH_MAC=$capval;}
        if ($capname eq "IPV4_ADDR") {
            $DEVICE_ETH_IP=$capval;
            if (!($capval eq $CONST_IP_ZERO)) {$DEVICE_ETH_STATUS=$CONST_UP;}
            }
        if ($capname eq "IP") {
           $DEVICE_ETH_DHCP=$CONST_NO;
           if ($capval eq "DHCP") {$DEVICE_ETH_DHCP=$CONST_YES;}
           }
        if ($capname eq "WAXEL") {$DEVICE_WFI_MAC=$capval;}
        if ($capname eq "WIPV4_ADDR") {
            $DEVICE_WFI_IP=$capval;
            if (!($capval eq $CONST_IP_ZERO)) {$DEVICE_WFI_STATUS=$CONST_UP;}
            }
        if ($capname eq "WIP") {
           $DEVICE_WFI_DHCP=$CONST_NO;
           if ($capval eq "DHCP") {$DEVICE_WFI_DHCP=$CONST_YES;}
           }
        }

  }

$MODEL = substr($DEVICE_ETH_MAC, 9, 2);

$DEVICE_SN = AxelDeviceGetSN ($DEVICE_ETH_MAC);
$DEVICE_MODEL =  AxelDeviceGetModel ($MODEL);
$DEVICE_DESCR = "$DEVICE_MODEL$DEVICE_DESCR";

$common->setSnmpCommons( {
                TYPE           => "Axel",
                IPADDR         => $DEVICE_IP,
		MACADDR        => $DEVICE_ETH_MAC, 
                NAME           => $DEVICE_NAME,
                DESCRIPTION    => $DEVICE_DESCR,
                } );

##                CONTACT        => "support at axel.fr",
##                LOCATION       => "France",

$common->setSnmpComputer({SYSTEM => 'Axel Ultra Thin Client'});

$thePort = AxelDeviceNetworkPorts ($MODEL);
$common->addSnmpNetwork( { 
		DESCRIPTION   => "Ethernet $thePort",
		SPEED	      => $thePort,
		MACADDR       => $DEVICE_ETH_MAC, 
		STATUS        => $DEVICE_ETH_STATUS,
                IPADDR        => $DEVICE_ETH_IP,
                IPDHCP        => $DEVICE_ETH_DHCP,
		});

##		TYPE          => "Ethernet",
##              IPMASK        => "255.255.255.0",

if (!($DEVICE_WFI_MAC eq $CONST_MAC_ZERO)) {
   $thePort = AxelDeviceWireless ($MODEL, $DEVICE_FW);
   $common->addSnmpNetwork( {
                DESCRIPTION   => "Wireless $thePort",
		SPEED	      => $thePort,
                MACADDR       => $DEVICE_WFI_MAC,
                STATUS        => $DEVICE_WFI_STATUS,
                IPADDR        => $DEVICE_WFI_IP,
                IPDHCP        => $DEVICE_WFI_DHCP,
                });
  } 

############### PORTS #################

$nbPort = AxelDevicePS2Ports ($MODEL);
for ($i = 1; $i <= $nbPort; $i++) {
    if ($i == 1) {$str="Keyboard";} else {$str="Mouse";}
    $common->addPorts( { 
        TYPE        => "$str Port",
        NAME        => "$str", 
        CAPTION     => "$str PS/2",
        DESCRIPTION => "PS/2",
         } );
    }

$nbPort = AxelDeviceSerialPorts ($MODEL);
for ($i = 1; $i <= $nbPort; $i++) {
    $common->addPorts( { 
        TYPE        => "RS232 Serial Port",
        NAME        => "AUX$i", 
        CAPTION     => "AUX$i RJ45 Female",
        DESCRIPTION => "RJ45 Female",
         } );
    }

$nbPort = AxelDeviceParallelPorts ($MODEL);
##Only one
for ($i = 1; $i <= $nbPort; $i++) {
    $common->addPorts( { 
        TYPE        => "Parallel Port ECP/EPP",
        NAME        => "PARALLEL", 
        CAPTION     => "PARALLEL DB-25 pin Female",
        DESCRIPTION => "DB-25 Pin Female",
         } );
    }

$nbPort = AxelDeviceUSBPorts ($MODEL);
for ($i = 1; $i <= $nbPort; $i++) {
    $common->addPorts( { 
        TYPE        => "USB Port",
        NAME        => "USB $i", 
        CAPTION     => "USB $i",
        DESCRIPTION => "USB",
         } );
    }

$nbPort = AxelDeviceVGAPorts ($MODEL);
for ($i = 1; $i <= $nbPort; $i++) {
    $common->addPorts( { 
        TYPE        => "Video Port",
        NAME        => "Video VGA", 
        CAPTION     => "Video VGA",
        DESCRIPTION => "DB-15 Pin Female",
         } );
    }

$nbPort = AxelDeviceDisplayPortPorts ($MODEL);
for ($i = 1; $i <= $nbPort; $i++) {
    $common->addPorts( { 
        TYPE        => "Video Port",
        NAME        => "Video DisplayPort $i", 
        CAPTION     => "Video DisplayPort $i",
        DESCRIPTION => "DisplayPort",
         } );
    }

#### LAN is always there
$thePort = AxelDeviceNetworkPorts ($MODEL);
$common->addPorts( { 
        TYPE        => "Ethernet Port",
        NAME        => "Network Ethernet $thePort", 
        CAPTION     => "Network RJ45",
        DESCRIPTION => "RJ45 Female",
         } );

#### Wireless
$thePort = AxelDeviceWireless ($MODEL, $DEVICE_FW);
if (!($thePort eq "no")) {
   $common->addPorts( {
        TYPE        => "Wireless Interface",
        NAME        => "Network Wireless $thePort",
        CAPTION     => "Wireless",
        DESCRIPTION => "Wireless",
         } );
   }



############### SOFTWARE #################
$common->addSoftware( { NAME => $DEVICE_FW , COMMENTS => "AXEL O.S." } );

$str = substr ($DEVICE_FW, 0 , 10);

  $common->setBios ({
      MMANUFACTURER => "AXEL",
      MMODEL => $DEVICE_MODEL,
      MSN => $DEVICE_SN,
      SMANUFACTURER => "AXEL",
      SMODEL => $DEVICE_MODEL,
      SSN => $DEVICE_SN,
      BMANUFACTURER => "AXEL",
      BVERSION => $str,
    });

}
1;
