1 contributor
#!/usr/bin/perl
=head1 NAME
simple-smart-test.pl - Very simple SMART data test
=head1 DESCRIPTION
Direct SMART data collection and database storage test.
=cut
use strict;
use warnings;
use DBI;
use JSON::XS;
print "=== Simple SMART Test ===\n\n";
# Database connection
my $dsn = "DBI:Pg:dbname=autosmart;host=192.168.2.102;port=5432";
my $dbh = DBI->connect($dsn, "autosmart", "autoSMART2025!", {
RaiseError => 1,
AutoCommit => 1,
PrintError => 0
}) or die "Failed to connect to database: $DBI::errstr\n";
print "✓ Database connected\n";
# Test SMART data collection manually
my @devices = glob('/dev/sd[a-z]');
for my $device (@devices) {
print "\nTesting device: $device\n";
# Get basic device info
my $smartctl_output = `smartctl -i $device 2>/dev/null`;
if ($? != 0) {
print " ✗ SMART not available\n";
next;
}
# Parse basic info
my ($model) = $smartctl_output =~ /Device Model:\s+(.+)/;
my ($serial) = $smartctl_output =~ /Serial Number:\s+(.+)/;
if (!$model || !$serial) {
print " ✗ Could not parse model/serial\n";
next;
}
print " Model: $model\n";
print " Serial: $serial\n";
# Get SMART attributes
my $smart_output = `smartctl -A $device 2>/dev/null`;
my %parameters;
# Parse SMART attributes
for my $line (split /\n/, $smart_output) {
if ($line =~ /^\s*(\d+)\s+(\w+)\s+0x[\da-f]+\s+(\d+)\s+(\d+)\s+(\d+)\s+\S+\s+\S+\s+\S+\s+(\d+)/) {
my ($id, $name, $current, $worst, $threshold, $raw) = ($1, $2, $3, $4, $5, $6);
$parameters{$name} = $raw;
}
}
# Get temperature
my $temp = $parameters{'Temperature_Celsius'} || 0;
print " Temperature: ${temp}°C\n";
print " Parameters: " . scalar(keys %parameters) . "\n";
# Check if HDD exists in inventory
my $sth = $dbh->prepare("SELECT id FROM hdd_inventory WHERE serial_number = ? AND model_name = ?");
$sth->execute($serial, $model);
my ($hdd_id) = $sth->fetchrow_array();
if (!$hdd_id) {
# Create new HDD
print " Creating new HDD entry...\n";
$sth = $dbh->prepare(q{
INSERT INTO hdd_inventory
(serial_number, model_name, current_device_path, current_node_id, status)
VALUES (?, ?, ?, 'ebony', 'active')
RETURNING id
});
$sth->execute($serial, $model, $device);
($hdd_id) = $sth->fetchrow_array();
print " ✓ HDD created with ID: $hdd_id\n";
} else {
print " ✓ HDD exists with ID: $hdd_id\n";
# Update location
$sth = $dbh->prepare("UPDATE hdd_inventory SET current_device_path = ?, last_seen = NOW() WHERE id = ?");
$sth->execute($device, $hdd_id);
}
# Store SMART reading
print " Storing SMART reading...\n";
my $parameters_json = encode_json(\%parameters);
$sth = $dbh->prepare(q{
INSERT INTO smart_readings
(hdd_id, serial_number, device_path, node_id, timestamp,
collection_ok, temperature, parameters_json, reading_type)
VALUES (?, ?, ?, 'ebony', NOW(), true, ?, ?, 'full')
});
$sth->execute($hdd_id, $serial, $device, $temp, $parameters_json);
print " ✓ SMART reading stored\n";
}
# Show results
print "\n=== Database Summary ===\n";
my $sth = $dbh->prepare("SELECT COUNT(*) FROM hdd_inventory");
$sth->execute();
my ($hdd_count) = $sth->fetchrow_array();
print "HDD Inventory: $hdd_count drives\n";
$sth = $dbh->prepare("SELECT COUNT(*) FROM smart_readings");
$sth->execute();
my ($reading_count) = $sth->fetchrow_array();
print "SMART Readings: $reading_count readings\n";
# Show latest readings
$sth = $dbh->prepare(q{
SELECT hi.serial_number, hi.model_name, sr.timestamp, sr.temperature
FROM smart_readings sr
JOIN hdd_inventory hi ON sr.hdd_id = hi.id
ORDER BY sr.timestamp DESC
LIMIT 5
});
$sth->execute();
print "\nLatest readings:\n";
while (my $row = $sth->fetchrow_hashref()) {
printf " %s (%s) - %s - %d°C\n",
substr($row->{serial_number}, 0, 12),
substr($row->{model_name}, 0, 20),
$row->{timestamp},
$row->{temperature} || 0;
}
$dbh->disconnect();
print "\n=== Test Complete ===\n";