diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..04cc8f6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM debian:stretch +# copy the data in + +RUN apt-get update && apt-get -y install build-essential autoconf libtool-bin libsnmp-dev && rm -rf /var/lib/apt/lists/* + +COPY . . + +RUN ./autogen.sh + +RUN ./configure + +RUN make + +EXPOSE 1661/udp + +CMD [ "./replayd", "-d", "replays", "-v", "-v", "-v" ] diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..0ddd5fa --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker build -t replayd . && docker run -p 1661:1661/udp replayd diff --git a/parse_type.c b/parse_type.c index 1ec604c..23c0f62 100644 --- a/parse_type.c +++ b/parse_type.c @@ -37,6 +37,7 @@ type_atoi type_map[] = { {"Timeticks", ASN_TIMETICKS}, {"Gauge32", ASN_GAUGE}, {"Counter32", ASN_COUNTER}, + {"Counter64", ASN_COUNTER64}, {"IpAddress", ASN_IPADDRESS}, {"NULL", ASN_NULL}, {NULL, 0}, // Array end marker diff --git a/replayd.c b/replayd.c index 04357e8..7f6b818 100644 --- a/replayd.c +++ b/replayd.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -63,6 +64,8 @@ netsnmp_variable_list *parse_reply(char *name) { netsnmp_variable_list *list = NULL; netsnmp_variable_list *lptr = NULL; + setbuf(stdout, NULL); + fname = malloc(strlen(directory) + strlen(name) + 2); sprintf(fname, "%s/%s", directory, name); fr = fopen(fname, "r"); @@ -103,6 +106,7 @@ netsnmp_variable_list *parse_reply(char *name) { case ASN_TIMETICKS: case ASN_GAUGE: case ASN_COUNTER: + case ASN_COUNTER64: lptr->val.integer = malloc(sizeof(long)); if (strchr(value, (int)'(')) { value = strchr(value, (int)'('); @@ -142,6 +146,17 @@ netsnmp_variable_list *parse_reply(char *name) { snmp_parse_oid(value, lptr->val.objid, &(lptr->val_len)); lptr->val_len *= sizeof(oid); break; + case ASN_IPADDRESS: + lptr->val.integer = malloc(sizeof(struct in_addr)); + + if (inet_pton(AF_INET, value, (struct in_addr *)lptr->val.integer) != 1){ + fprintf(stderr, "Invalid address: %s\n", value); + } + lptr->val_len = sizeof(struct in_addr); + break; + default: + fprintf(stderr, "Don't know how to parse %s\n", type_str); + break; } } @@ -226,6 +241,9 @@ int main(int argc, char *argv[]) { struct dirent *dEnt; replay_entry *rEnt; + // disable output buffering + setbuf(stdout, NULL); + // Process options while ((arg = getopt(argc, argv, "vd:L::")) != EOF) { switch (arg) { diff --git a/replays/unittest b/replays/unittest index 2b1cd3e..88046ce 100644 --- a/replays/unittest +++ b/replays/unittest @@ -29,6 +29,8 @@ .1.3.6.1.2.1.1.9.1.4.6 = Timeticks: (2) 0:00:00.02 .1.3.6.1.2.1.1.9.1.4.7 = Timeticks: (2) 0:00:00.02 .1.3.6.1.2.1.1.9.1.4.8 = Timeticks: (2) 0:00:00.02 +.1.3.6.1.2.1.15.3.1.7.0.0.0.0 = IpAddress: 0.0.0.0 +.1.3.6.1.2.1.15.3.1.7.10.1.159.251 = IpAddress: 10.1.159.251 .1.3.6.1.4.1.31865.9999.42.2.1 = INTEGER: test(1) .1.3.6.1.4.1.31865.9999.42.2.2 = INTEGER: test(-2) .1.3.6.1.4.1.31865.9999.42.2.4 = INTEGER: 4