Exemple #1
0
static int openssl_revoked_revocationDate(lua_State* L)
{
  X509_REVOKED* revoked = CHECK_OBJECT(1, X509_REVOKED, "openssl.x509_revoked");
  PUSH_ASN1_TIME(L, revoked->revocationDate);
  lua_pushinteger(L, (LUA_INTEGER)ASN1_GetTimeT(revoked->revocationDate));
  return 2;
}
Exemple #2
0
int main(int argc, char *argv[]) {

    CURL *curl;
    CURLcode ret;
    char *url = NULL;
    char *host_header = NULL;
    char *host_name = NULL;
    char *regex = NULL;

    struct timeval tvBegin, tvEnd, tvDiff;

    /* Commandline switches */
    int verbose_level=0;
    int status_only = false;
    int measure_time = false;
    int nossl_verify = false;
    int follow_location = false;
    int fail_on_curl_error = false;
    int ssl_valid_date = false;

    struct curl_slist *headers = NULL;
    int i;
    int curl_timeout = TIMEOUT;
    char *curl_userpwd = NULL;

    ASN1_TIME * notAfter;
    time_t now;
    time_t expire;
    int time_left;

    pcre *re;
    int pcre_opts=0;
    const char *error;
    int erroffset;
    int ovector[OVECCOUNT];
    int rc;
    int opt;

    wr_error = 0;
    wr_index = 0;

    /* First step, init curl */
    curl = curl_easy_init();
    if(!curl) {
        fprintf(stderr, "couldn't init curl\n");
        exit(EXIT_FAILURE);
    }

    /* 
     * if no arguments are given
     */
    if(argc == 1) {
        fprintf(stderr, "This program needs arguments....\n\n");
        print_arguments(argc, argv);
        print_help(1);
    }

    while((opt = getopt(argc, argv, "?VfcamMlsvp:t:u:h:r:i")) != -1) {
        switch(opt) {
            case 'V':
                fprintf(stderr,"%s %s\n\n", PACKAGE, VERSION);
                exit(0);
                break;
            case 'v':
                verbose_level++;
                break;
            case 'a':
                curl_easy_setopt(curl, CURLOPT_HEADER  , true);
                break;
            case 'i':
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
                nossl_verify = true;
                break;
            case 's':
                status_only = true;
                break;
            case 'm':
                measure_time = true;
                break;
            case 'M':
                pcre_opts |= PCRE_MULTILINE;
                break;
            case 'l':
                follow_location = true;
                curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
                break;
            case 'f':
                fail_on_curl_error = true;
                break;
            case 'p':
                curl_userpwd = optarg;
                break;
            case 'u':
                url = optarg;
                break;
            case 't':
                curl_timeout = atoi(optarg);
                break;
            case 'h':
                host_header = malloc(strlen("Host: ") + strlen(optarg) + 1);
                host_name = optarg;
                strcpy(host_header, "Host: ");
                strcat(host_header, optarg);
                headers = curl_slist_append(headers, host_header);
                curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
                break;
            case 'c':
                ssl_valid_date = true;
            case 'r':
                regex = optarg;
                break;
            case ':':
                fprintf(stderr, "%s: Error - Option `%c' needs a value\n\n", PACKAGE, optopt);
                print_arguments(argc, argv);
                print_help(1);
                break;
            case '?':
                fprintf(stderr, "%s: Error - No such option: `%c'\n", PACKAGE, optopt);
                print_arguments(argc, argv);
                print_help(1);
        }
    }

    if (verbose_level > 3){
        curl_easy_setopt(curl, CURLOPT_VERBOSE , true);
    }

    if (verbose_level > 0){
        fprintf(stderr, "%-17s %s\n", "URL", url);
        fprintf(stderr, "%-17s %s\n", "REGEX", regex);
        fprintf(stderr, "%-17s %i\n", "TIMEOUT", curl_timeout);
        fprintf(stderr, "%-17s %s\n",   "HOST HEADER", host_header);
        fprintf(stderr, "%-17s %i\n\n", "STATUS ONLY", status_only);

        fprintf(stderr, "%-17s %s -t %i -u \"%s\" -r \"%s\"", "CMD ", PACKAGE, curl_timeout, url, regex);
        if ( status_only == true ){
            fprintf(stderr, " -s");
        }
        if ( measure_time  == true ){
            fprintf(stderr, " -m");
        }
        if ( nossl_verify == true ){
            fprintf(stderr, " -i");
             }
        if ( follow_location == true ){
            fprintf(stderr, " -l");
             }
        if ( fail_on_curl_error == true ){
            fprintf(stderr, " -f");
        }
        if ( (pcre_opts & PCRE_MULTILINE) == PCRE_MULTILINE ){
            fprintf(stderr, " -M");
        }
        if (curl_userpwd != NULL){
            fprintf(stderr, " -p %s", curl_userpwd);
        }

        if ( host_name != NULL ){
            fprintf(stderr, " -h %s",host_name);
        }
        fprintf(stderr, "\n");

        fprintf(stderr, "%-17s %s[\"-t\",\"%i\",\"-u\",\"%s\",\"-r\",\"%s\"", "ZABBIX 2.0 ITEM", PACKAGE, curl_timeout, url, regex);
        if ( status_only == true ){
            fprintf(stderr, ",\"-s\"");
        }
        if ( measure_time  == true ){
            fprintf(stderr, ",\"-m\"");
        }
        if ( nossl_verify == true ){
            fprintf(stderr, ",\"-i\"");
             }
        if ( follow_location == true ){
            fprintf(stderr, ",\"-l\"");
             }
        if ( fail_on_curl_error == true ){
            fprintf(stderr, ",\"-f\"");
        }
        if ( (pcre_opts & PCRE_MULTILINE) == PCRE_MULTILINE ){
            fprintf(stderr, ",\"-M\"");
        }
        if (curl_userpwd != NULL){
            fprintf(stderr, ",\"-p\",\"%s\"", curl_userpwd);
        }

        if ( host_name != NULL ){
            fprintf(stderr, ",\"-h\",\"%s\"",host_name);
        }
       fprintf(stderr, "]\n");
    }


    if (((url == NULL) || (regex == NULL)) && (ssl_valid_date == false)){
        print_arguments(argc, argv);
        print_help(EXIT_FAILURE);
    }

    /* Tell curl the URL of the file we're going to retrieve */
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5");

    /* Tell curl that we'll receive data to the function write_data, and
     * also provide it with a context pointer for our error return.
     */
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &wr_error);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, curl_timeout);

    curl_easy_setopt(curl, CURLOPT_USERPWD, curl_userpwd);

    gettimeofday(&tvBegin, NULL);
    /* Initialize certificate array*/
    for(i=0; i<MAX_CERTS;i++) {
        certificates[i] = 0;
        certificates_error[i] = X509_V_OK;
    }
    curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfunc);
    if(ssl_valid_date == true) {
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
    }

    /* Allow curl to perform the action */
    ret = curl_easy_perform(curl);
    /* Stop execution here if only status is needed */
    if ((ret != 0) || (fail_on_curl_error == true)){
        if (status_only == true){
            printf("0");
            if (verbose_level > 1){
                fprintf(stderr,"returned: '0'\n");
            }
        } else if (measure_time == true){
            printf("0.0");
            if (verbose_level > 1){
                fprintf(stderr,"returned: '0.0'\n");
            }
        }
        exit(EXIT_FAILURE);
    }

    /* Get days until certificate expires */
    if(ssl_valid_date == true) {
        if(ret!=0 || certificates[0]==0) {
            exit(EXIT_FAILURE);
        }
        notAfter = X509_get_notAfter(certificates[0]);
        now = time(NULL);
        expire = ASN1_GetTimeT(notAfter);
        time_left = (expire-now)/(60*60*24);

        printf("%d",time_left);

        if (verbose_level > 1){
            fprintf(stderr,"returned: '%d'\n",time_left);
        }

        curl_easy_cleanup(curl);
        exit(EXIT_SUCCESS);
    }

    re = pcre_compile(regex,    /* the pattern */
                      pcre_opts,        /* default options */
                      &error,   /* for error message */
                      &erroffset,   /* for error offset */
                      NULL);    /* use default character tables */


    rc = pcre_exec(re,          /* the compiled pattern */
                   NULL,        /* no extra data - we didn't study the pattern */
                   wr_buf,      /* the subject string */
                   wr_index,    /* the length of the subject */
                   0,           /* start at offset 0 in the subject */
                   0,           /* default options */
                   ovector,     /* output vector for substring information */
                   OVECCOUNT);  /* number of elements in the output vector */

    if(verbose_level > 2) {
        fprintf(stderr, "out: >>>%s<<< [%i bytes]\n", wr_buf, wr_index);
    }

    /* Evaluate the match and output status */
    if(rc < 0) {
        if (status_only == true) {
            printf("0");
            if (verbose_level > 1){
                fprintf(stderr,"returned: '0'\n");
            }
        } else if (measure_time == true) {
            printf("0.0");
            if (verbose_level > 1){
                fprintf(stderr,"returned: '0.0'\n");
            }
        } else {
            switch (rc) {
                case PCRE_ERROR_NOMATCH      : fprintf(stderr,"String did not match the pattern\n");        break;
                case PCRE_ERROR_NULL         : fprintf(stderr,"Something was null\n");                      break;
                case PCRE_ERROR_BADOPTION    : fprintf(stderr,"A bad option was passed\n");                 break;
                case PCRE_ERROR_BADMAGIC     : fprintf(stderr,"Magic number bad (compiled re corrupt?)\n"); break;
                case PCRE_ERROR_UNKNOWN_NODE : fprintf(stderr,"Something kooky in the compiled re\n");      break;
                case PCRE_ERROR_NOMEMORY     : fprintf(stderr,"Ran out of memory\n");                       break;
                default                      : fprintf(stderr,"Matching error %d\n", rc);                   break;
            }
        }
        pcre_free(re);          /* Release memory used for the compiled pattern */
        exit(EXIT_FAILURE);
    }

    if(rc == 2) {
        if (status_only == true) {
            printf("1");
            if (verbose_level > 1) {
                fprintf(stderr,"returned: '1'\n");
            }
        } else if (measure_time == true) {
            gettimeofday(&tvEnd, NULL);
            timeval_subtract(&tvDiff, &tvEnd, &tvBegin);
            printf("%ld.%06ld", tvDiff.tv_sec, tvDiff.tv_usec);
            if (verbose_level > 1){
                fprintf(stderr,"measure time returned: '%ld.%06ld'\n", tvDiff.tv_sec, tvDiff.tv_usec);
            }
        } else {
            char *substring_start = NULL;
            int substring_length = 0;
            i = 1;
            substring_start = wr_buf + ovector[2 * i];
            substring_length = ovector[2 * i + 1] - ovector[2 * i];
            printf("%.*s", substring_length, substring_start);
            fprintf(stderr,"parsing returned: '%.*s'\n", substring_length, substring_start);
        }
    }
    curl_easy_cleanup(curl);

    exit(EXIT_SUCCESS);
}