Пример #1
0
void LOG_PROCESSOR_USAGE()
{
    int j = 0;
    int rc;
    int num_descript;
    size_t toc_sz = 0;
    size_t max_toc_sz = (10 * sizeof(descript));
    struct dirent **cpuent;
    descript *toc;
    descript *ttoc;

    /* do something different for VmWare and Solaris */
    cpucount = scandir("/sys/class/cpuid", &cpuent, file_select, versionsort);
    DEBUGMSGTL(("rec:rec_log:rec_log_proc_usage","cpucount = %d\n", cpucount));

    if (cpucount == -1) 
        return;

    if (!rec_init() )
        return;

    /* do Code Descriptor */
    if ((rc = doCodeDescriptor(s_ams_rec_handle, 
                               s_ams_rec_class, 
			       REC_CODE_AMS_PROCESSOR_USAGE,
			       0,
			       REC_SEV_PERIOD,
			       REC_BINARY_DATA,
			       REC_VIS_CUSTOMER,
			       REC_CODE_AMS_PROCESSOR_USAGE_STR)) 
            != RECORDER_OK) {
        DEBUGMSGTL(("rec:rec_log_error", 
		    "Host Name register descriptor failed %d\n", rc));
        return;
    }

    num_descript = sizeof(fld)/sizeof(field) * cpucount;
    DEBUGMSGTL(("rec:rec_log:rec_log_proc_usage","ProcUsage num_descript = %d\n", 			num_descript));

    toc_sz = sizeof(descript) * num_descript;
    toc = malloc(toc_sz);
    DEBUGMSGTL(("rec:log","Initial Processor Usage toc_sz = %ld\n", toc_sz));

    /* now do the field descriptor */
    memset(toc, 0, toc_sz);
    for (j = 0; j < num_descript; j++ ) {
        toc[j].flags = REC_FLAGS_DESCRIPTOR | REC_FLAGS_DESC_FIELD;
        toc[j].classs = s_ams_rec_class;
        toc[j].code = REC_CODE_AMS_PROCESSOR_USAGE;
        toc[j].field = j;
        toc[j].severity_type = REC_SEV_PERIOD | fld[j%2].tp;
        toc[j].format = fld[j%2].sz;
        toc[j].visibility = REC_VIS_CUSTOMER;
        strncpy(toc[j].desc, fld[j%2].nm, 
                sizeof(toc[j].desc) - strlen(toc[j].desc - 1));
        strcat(toc[j].desc, cpuent[j/2]->d_name);
        DEBUGMSGTL(("rec:log", "toc[i] = %p\n", &toc[j]));
        dump_chunk("rec:rec_log","descriptor", (const u_char *)&toc[j], 96);
        if (j % 2)
            free(cpuent[j/2]);
    }
    dump_chunk("rec:rec_log", "toc", (const u_char *)toc, toc_sz);
    free(cpuent);

    ttoc = toc;
    while (toc_sz > RECORDER_MAX_BLOB_SIZE) {
        DEBUGMSGTL(("rec:log","Processor Usage ttoc = %p\n", ttoc));
        DEBUGMSGTL(("rec:log","Processor Usage toc_sz = %ld\n", toc_sz));
        if ((rc = rec_api4_field(s_ams_rec_handle, 
                                      max_toc_sz,
                                      ttoc)) != RECORDER_OK) {
            DEBUGMSGTL(("rec:rec_log_error","Proc Usage register descriptor failed %d\n", 
                        rc));
            return;
        }
        toc_sz = toc_sz - max_toc_sz;
        ttoc = (void *)ttoc + max_toc_sz;
    }
    if ((rc = rec_api4_field(s_ams_rec_handle, toc_sz, ttoc)) 
                    != RECORDER_OK) {
        DEBUGMSGTL(("rec:rec_log_error","Proc Usage register descriptor failed %d\n", rc));
        return;
    }
    free(toc);

    if (!proc_usage_reinit) 
        switch (log_interval) {
            case 0:
                rec_log_proc_usage(0, &cpucount);
                break;
            case 1:
                snmp_alarm_register(60, SA_REPEAT, &rec_log_proc_usage, &cpucount);
                break;
            case 2:
                snmp_alarm_register(600, SA_REPEAT, &rec_log_proc_usage, &cpucount);
                break;
            case 3:
                snmp_alarm_register(3600, SA_REPEAT, &rec_log_proc_usage, &cpucount);
                break;
        }
    else
        proc_usage_reinit = 0;
    return;
}
Пример #2
0
static int log_buffer_contents_rec(char *msg) {
    int i = 0;
    int rc = 0;
    int num_descript = 0;
    size_t toc_sz = 0;
    size_t blob_sz = 0;
    char* blob;
    RECORDER_API4_RECORD *toc;

    if (NULL != msg) {

        if (!rec_init()) {
            return -1;
        }

        if ((rc = doCodeDescriptor(s_ams_rec_handle,
                                   s_ams_rec_class,
                                   REC_CODE_AMS_OS_CRASH,
                                   0,
                                   REC_SEV_CRIT,
                                   REC_BINARY_DATA,
                                   REC_VIS_CUSTOMER,
                                   REC_CODE_AMS_OS_CRASH_STR)) != RECORDER_OK) {
            DEBUGMSGTL(("rec:rec_kdump","KDump register descriptor failed %d\n", rc));
            return -1;
        }

        /* TODO: Since I'm collapsing all of the kdump data into a
         * single field, do I have to do this? 
         */
        num_descript = sizeof(fld)/sizeof(field);
        DEBUGMSGTL(("rec:log","Kdump num_descript = %d\n", num_descript));
        if ((toc_sz = sizeof(RECORDER_API4_RECORD) * num_descript) 
            > RECORDER_MAX_BLOB_SIZE) {
            DEBUGMSGTL(("rec:log", "KDump descriptor too large %ld\n", toc_sz));
            return -1;
        }

        DEBUGMSGTL(("rec:log", "Kdump toc_sz = %ld\n", toc_sz));
        if ((toc = malloc(toc_sz)) == NULL) {
            DEBUGMSGTL(("rec:log","KDump unable to malloc %ld bytes\n", toc_sz));
            return -1;
        }
        memset(toc, 0, toc_sz);

        /* now setup field descriptor */
        for (i = 0; i < num_descript; i++) {
            toc[i].flags = REC_FLAGS_API4 | REC_FLAGS_DESC_FIELD;
            toc[i].classs = s_ams_rec_class;
            toc[i].code = REC_CODE_AMS_OS_CRASH;
            toc[i].field = i;
            toc[i].severity_type = REC_DESC_SEVERITY_CRITICAL | fld[i].tp;
            toc[i].format = fld[i].sz;
            toc[i].visibility = REC_DESC_VISIBILITY_CUSTOMER;
            strncpy(toc[i].desc, fld[i].nm, strlen(fld[i].nm));
            DEBUGMSGTL(("rec:log", "toc[i] = %p\n", &toc[i]));
            dump_chunk("rec:rec_log", "descriptor", (const u_char*)&toc[i], 96);
        }
        dump_chunk("rec:rec_log", "toc", (const u_char*)toc, toc_sz);
        
        if ((rc = rec_api4_field(s_ams_rec_handle, toc_sz, toc))
            != RECORDER_OK) {
            DEBUGMSGTL(("rec:log", "KDump register descriptor failed %d\n", rc));
            free(toc);
            return -1;
        }
        free(toc);

        blob_sz = RECORDER_MAX_BLOB_SIZE;
        if ((blob = malloc(blob_sz)) == NULL) {
            DEBUGMSGTL(("rec:log", "KDump unable to malloc() %ld blob\n", blob_sz));
            return -1;
        }

        memset(blob, 0, blob_sz);
        strncpy(blob, msg, blob_sz);
        blob_sz = strlen(blob);
        if ((rc = rec_api6(s_ams_rec_handle, (const char*)blob, blob_sz))
            != RECORDER_OK) {
            DEBUGMSGTL(("rec:log", "KDump log to recorder data failed (%d)\n", rc));
            free(blob);
            return -1;
        }
        DEBUGMSGTL(("rec:log", "Logged record for code %d\n", REC_CODE_AMS_OS_CRASH));
        free(blob);
        return 0;
    }

    /* msg was NULL */
    return -1;
}