Ticket #1079: patch_scsiprint_v1.01.2.diff

File patch_scsiprint_v1.01.2.diff, 6.7 KB (added by Rick Chen, 3 years ago)
  • scsiprint.cpp

    diff --git a/scsiprint.cpp b/scsiprint.cpp
    index cca0dcc..1e6314d 100644
    a b scsiGetSmartData(scsi_device * device, bool attribs) 
    332332        }
    333333        if (255 == triptemp)
    334334            pout("Drive Trip Temperature:        <not available>\n");
    335         else
    336             pout("Drive Trip Temperature:        %d C\n", triptemp);
     335        else {
     336            jout("Drive Trip Temperature:        %d C\n", triptemp);
     337            jglb["temperature"]["drive_trip"] = triptemp;
     338        }
    337339    }
    338340    pout("\n");
    339341    return err;
    scsiPrintGrownDefectListLen(scsi_device * device) 
    609611            print_off();
    610612            break;
    611613    }
    612     if (0 == dl_len)
    613         pout("Elements in grown defect list: 0\n\n");
     614    if (0 == dl_len) {
     615        jout("Elements in grown defect list: 0\n\n");
     616        jglb["scsi_elements_grown_list"] = 0;
     617    }
    614618    else {
    615619        if (0 == div)
    616620            pout("Grown defect list length=%u bytes [unknown "
    617621                 "number of elements]\n\n", dl_len);
    618         else
    619             pout("Elements in grown defect list: %u\n\n", dl_len / div);
     622        else {
     623            jout("Elements in grown defect list: %u\n\n", dl_len / div);
     624            jglb["scsi_elements_grown_list"] = dl_len;
     625        }
    620626    }
    621627}
    622628
    scsiPrintSeagateFactoryLPage(scsi_device * device) 
    704710    int num, pl, pc, len, err, good, bad;
    705711    unsigned char * ucp;
    706712    uint64_t ull;
     713    static const char * jname = "format_status";
    707714
    708715    if ((err = scsiLogSense(device, SEAGATE_FACTORY_LPAGE, 0, gBuf,
    709716                            LOG_RESP_LEN, 0))) {
    scsiPrintSeagateFactoryLPage(scsi_device * device) 
    758765        pl = ucp[3] + 4;
    759766        good = 0;
    760767        switch (pc) {
    761         case 0: pout("  number of hours powered up");
     768        case 0: jout("  number of hours powered up");
     769            jname = "scsi_hours_powered_up";
    762770            good = 1;
    763771            break;
    764         case 8: pout("  number of minutes until next internal SMART test");
     772        case 8: jout("  number of minutes until next internal SMART test");
     773            jname = "scsi_minutes_next_smart_test";
    765774            good = 1;
    766775            break;
    767776        default:
    scsiPrintSeagateFactoryLPage(scsi_device * device) 
    781790                k = (int)sizeof(ull);
    782791            }
    783792            ull = sg_get_unaligned_be(k, xp + 0);
    784             if (0 == pc)
    785                 pout(" = %.2f\n", ull / 60.0 );
    786             else
    787                 pout(" = %" PRIu64 "\n", ull);
     793            if (0 == pc) {
     794                jout(" = %.2f\n", ull / 60.0 );
     795                jglb[jname] = strprintf("%.2f", ull / 60.0);
     796            }
     797            else {
     798                jout(" = %" PRIu64 "\n", ull);
     799                jglb[jname] = ull;
     800            }
    788801        }
    789802        num -= pl;
    790803        ucp += pl;
    scsiPrintErrorCounterLog(scsi_device * device) 
    828841             "algorithm      processed    uncorrected\n");
    829842        pout("           fast | delayed   rewrites  corrected  "
    830843             "invocations   [10^9 bytes]  errors\n");
     844
     845        json::ref jref = jglb["scsi_error_counter_log"];
    831846        for (int k = 0; k < 3; ++k) {
    832847            if (! found[k])
    833848                continue;
    834849            ecp = &errCounterArr[k];
    835850            static const char * const pageNames[3] =
    836851                                 {"read:   ", "write:  ", "verify: "};
    837             pout("%s%8" PRIu64 " %8" PRIu64 "  %8" PRIu64 "  %8" PRIu64
     852            static const char * jpageNames[3] =
     853                                 {"read", "write", "verify"};
     854            jout("%s%8" PRIu64 " %8" PRIu64 "  %8" PRIu64 "  %8" PRIu64
    838855                 "   %8" PRIu64, pageNames[k], ecp->counter[0],
    839856                 ecp->counter[1], ecp->counter[2], ecp->counter[3],
    840857                 ecp->counter[4]);
    841858            double processed_gb = ecp->counter[5] / 1000000000.0;
    842             pout("   %12.3f    %8" PRIu64 "\n", processed_gb,
     859            jout("   %12.3f    %8" PRIu64 "\n", processed_gb,
    843860                 ecp->counter[6]);
     861            // Error counter log info
     862            jref[jpageNames[k]]["errors_corrected_by_eccfast"] = ecp->counter[0];
     863            jref[jpageNames[k]]["errors_corrected_by_eccdelayed"] = ecp->counter[1];
     864            jref[jpageNames[k]]["errors_corrected_by_rereads_rewrites"] = ecp->counter[2];
     865            jref[jpageNames[k]]["total_errors_corrected"] = ecp->counter[3];
     866            jref[jpageNames[k]]["correction_algorithm_invocations"] = ecp->counter[4];
     867            jref[jpageNames[k]]["gigabytes_processed"] = strprintf("%.3f", processed_gb);
     868            jref[jpageNames[k]]["total_uncorrected_errors"] = ecp->counter[6];
    844869        }
    845870    }
    846871    else
    scsiPrintBackgroundResults(scsi_device * device) 
    11751200            else
    11761201                pout("unknown [0x%x] background scan status value\n", j);
    11771202            j = sg_get_unaligned_be32(ucp + 4);
    1178             pout("    Accumulated power on time, hours:minutes %d:%02d "
     1203            jout("    Accumulated power on time, hours:minutes %d:%02d "
    11791204                 "[%d minutes]\n", (j / 60), (j % 60), j);
    1180             pout("    Number of background scans performed: %d,  ",
     1205            jglb["accumulated_power_on_time_minutes"] = j;
     1206            jout("    Number of background scans performed: %d,  ",
    11811207                 sg_get_unaligned_be16(ucp + 10));
     1208            jglb["number_sacns_performed"] = sg_get_unaligned_be16(ucp + 10);
    11821209            pout("scan progress: %.2f%%\n",
    11831210                 (double)sg_get_unaligned_be16(ucp + 12) * 100.0 / 65536.0);
    1184             pout("    Number of background medium scans performed: %d\n",
     1211            jout("    Number of background medium scans performed: %d\n",
    11851212                 sg_get_unaligned_be16(ucp + 14));
     1213            jglb["scsi_number_medium_scans_performed"] = sg_get_unaligned_be16(ucp + 14);
    11861214            break;
    11871215        default:
    11881216            if (noheader) {
    scsiPrintSSMedia(scsi_device * device) 
    12741302                print_off();
    12751303                return FAILSMART;
    12761304            }
    1277             pout("Percentage used endurance indicator: %d%%\n", ucp[7]);
     1305            jout("Percentage used endurance indicator: %d%%\n", ucp[7]);
     1306            jglb["percentage_used_endurance_indicator"] = ucp[7];
    12781307        default:        /* ignore other parameter codes */
    12791308            break;
    12801309        }
    scsiPrintTemp(scsi_device * device) 
    22242253    }
    22252254    if (255 == trip)
    22262255        pout("Drive Trip Temperature:        <not available>\n");
    2227     else
    2228         pout("Drive Trip Temperature:        %d C\n", trip);
     2256    else {
     2257        jout("Drive Trip Temperature:        %d C\n", trip);
     2258        jglb["temperature"]["drive_trip"] = trip;
     2259    }
    22292260    pout("\n");
    22302261}
    22312262