#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mibs.h"
#include "util.h"

char pipefile[MAX], *mib;
int m;   /*  (m == 2) for snmpget;  (m == 3) for snmpset  */
int n;   /*  number of host_ip in the parameter */

extern struct mibs_t root;

//////////////////////////////////////////////////////////////////
// get-request: snmp.cgi?g+mib_oid+host_ip+community+...
//       (e.g.) snmp.cgi?g+mib_oid+host_ip+community+host_ip+community+...
// set-request: snmp.cgi?s+mib_oid+host_ip+community+value+...
//////////////////////////////////////////////////////////////////
int main(int argc,char *argv[]) {
  void checkparam(int argc,char *argv[]);
  void process(int argc,char *argv[]);
  void display();

  checkparam(argc,argv);
  process(argc,argv);
  display();
}

void checkparam(int argc,char *argv[]) {
  if (strcmp(argv[1],"g")==0) m = 2;
  else if (strcmp(argv[1],"s")==0) {
    m = 3;
    readmibs();
  }
  else printerror("Unknown command");
  if ((argc-3) % m) printerror("Odd number of parameters");
  if ((argc-1) < (m+2)) printerror("Too few parameters");
  mib = argv[2];
  n = (argc - 3) / m;
}

void _sprocess(int argc,char *argv[]) {
  int i;
  char sformat[MAX], integ[MAX];

  snprintf(sformat,sizeof(sformat),"snmpset -v 2c %s %s %c %s > /dev/null",
           "%s %s",mib,parse_mib(mib),"%s");
  for (i=0;i<n;i++) {
    snprintf(integ,sizeof(integ),sformat,argv[i*m+3],argv[i*m+4],argv[i*m+5]);
    system(integ);
  }
}

void process(int argc,char *argv[]) {
  int i;
  char gformat[MAX], integ[MAX];

  if (m == 3) _sprocess(argc,argv);
  snprintf(pipefile,sizeof(pipefile),"/tmp/snmp%d.txt",getpid());
  snprintf(gformat,sizeof(gformat),"snmpget -v 2c %s %s >> %s",
           "%s %s",mib,pipefile);
  snprintf(integ,sizeof(integ),"touch %s",pipefile);
  system(integ);
  for (i=0;i<n;i++) {
    snprintf(integ,sizeof(integ),"echo : %s >> %s",argv[i*m+3],pipefile);
    system(integ);
    snprintf(integ,sizeof(integ),gformat,argv[i*m+3],argv[i*m+4]);
    system(integ);
  }
}

void display() {
  void _display_results();
  void _display_javascript();

  printf("Content-type: text/html\n");
  printf("Content-encoding: us/ascii\n\n");
  printf("<html>\n<head>\n");
  printf("<title>Result of query</title>\n");
  _display_javascript();
  printf("</head>\n");
  printf("<body bgcolor=#0000FF text=#FFFF00 onLoad=loadframe()><center>\n");
  if (m == 3) printf("<p>After saving the changes for <b>%s</b> :\n",mib);
  else printf("<p>Result of <b>%s</b>\n",mib);
  _display_results();
  printf("</center></body>\n");
  printf("</html>\n");
}

void _display_results() {
  FILE * f;
  char colon, ip[MAX], value[MAX], dummy[MAX];
  int i;

  if ((f = fopen(pipefile,"r")) == NULL)
    printerror("Broken pipe when querying snmp agent");
  printf("<form>\n");
  printf("<table border=0>\n");
  printf("<tr><th></th><th>Agent</th><th>Community</th><th>Value</th></tr>\n");
  for (i=0; (colon = fgetc(f)) == ':'; i++) {
    fscanf(f,"%s",ip); fgets(dummy,sizeof(dummy),f);
    ungetc(colon = fgetc(f),f);
    if ((colon == EOF) || (colon == ':'))
      strncpy(value,"ERROR OR NO RESPONSE",sizeof(value));
    else {
      fscanf(f,"%s %s \"",dummy,dummy);
      fgets(value,sizeof(value),f);
      if (value[strlen(value)-1] == '\n') value[strlen(value)-1] = '\0';
      if (value[strlen(value)-1] == '"') value[strlen(value)-1] = '\0';
    }
    printf("<tr><td><input type=checkbox name=cb%d></td>",i);
    printf("<td><input type=hidden name=ip%d value='%s'>%s</td>",i,ip,ip);
    printf("<td><input type=text name=com%d value=private></td>",i);
    printf("<td><input type=text name=val%d value='%s'></td></tr>\n",i,value);
  }
  printf("</table>\n");
  printf("<p><input type=button value=Save onClick=save(this.form)></p>\n");
  printf("</form>\n");
  fclose(f);
}

void _display_javascript() {
  int i;

  printf("<script language=javascript>\n\n");
  printf("function loadframe() {\n");
  printf("  parent.frames[0].location = '/cgi-bin/mibtree.cgi?%s';\n",mib);
  printf("}\n\n");
  printf("function save(form) {\n");
  printf("  var tempstr = '/cgi-bin/snmp.cgi?s+%s';\n\n",mib);
  for (i=0;i<n;i++) {
    printf("  if (form.cb%d.checked) {\n",i);
    printf("    if (form.com%d.value == \"\")\n",i);
    printf("      alert(\"Please enter community name for line %d!\");\n",i+1);
    printf("    else tempstr += \"+\" + form.ip%d.value +\n",i);
    printf("                    \"+\" + form.com%d.value +\n",i);
    printf("                    \"+\" + form.val%d.value;\n",i);
    printf("  }\n");
  }
  printf("  parent.frames[0].location = '/wait.html';\n");
  printf("  window.location = tempstr;\n");
  printf("}\n\n");
  printf("</script>\n");
}

