Diff for /embedaddon/mpd/src/web.c between versions 1.1 and 1.1.1.3

version 1.1, 2012/02/21 23:32:47 version 1.1.1.3, 2021/03/17 00:39:23
Line 28 Line 28
  * INTERNAL FUNCTIONS   * INTERNAL FUNCTIONS
  */   */
   
  static int    WebSetCommand(Context ctx, int ac, char *av[], void *arg);  static int    WebSetCommand(Context ctx, int ac, const char *const av[], const void *arg);
   
   static int    WebServletRun(struct http_servlet *servlet,    static int    WebServletRun(struct http_servlet *servlet,
                          struct http_request *req, struct http_response *resp);                           struct http_request *req, struct http_response *resp);
Line 42 Line 42
   
   static void   WebRunBinCmd(FILE *f, const char *query, int priv);    static void   WebRunBinCmd(FILE *f, const char *query, int priv);
   static void   WebRunCmd(FILE *f, const char *query, int priv);    static void   WebRunCmd(FILE *f, const char *query, int priv);
  static void   WebShowSummary(FILE *f, int priv);  static void   WebShowHTMLSummary(FILE *f, int priv);
   static void     WebShowJSONSummary(FILE *f, int priv);
   
 /*  /*
  * GLOBAL VARIABLES   * GLOBAL VARIABLES
Line 59 Line 60
         WebSetCommand, NULL, 2, (void *) SET_ENABLE },          WebSetCommand, NULL, 2, (void *) SET_ENABLE },
     { "disable [opt ...]",      "Disable web option" ,      { "disable [opt ...]",      "Disable web option" ,
         WebSetCommand, NULL, 2, (void *) SET_DISABLE },          WebSetCommand, NULL, 2, (void *) SET_DISABLE },
    { NULL },    { NULL, NULL, NULL, NULL, 0, NULL },
   };    };
   
   
Line 156  WebClose(Web w) Line 157  WebClose(Web w)
  */   */
   
 int  int
WebStat(Context ctx, int ac, char *av[], void *arg)WebStat(Context ctx, int ac, const char *const av[], const void *arg)
 {  {
   Web           w = &gWeb;    Web           w = &gWeb;
   char          addrstr[64];    char          addrstr[64];
   
     (void)ac;
     (void)av;
     (void)arg;
   
   Printf("Web configuration:\r\n");    Printf("Web configuration:\r\n");
   Printf("\tState         : %s\r\n", w->srv ? "OPENED" : "CLOSED");    Printf("\tState         : %s\r\n", w->srv ? "OPENED" : "CLOSED");
   Printf("\tIP-Address    : %s\r\n", u_addrtoa(&w->addr,addrstr,sizeof(addrstr)));    Printf("\tIP-Address    : %s\r\n", u_addrtoa(&w->addr,addrstr,sizeof(addrstr)));
Line 217  static void Line 222  static void
 WebShowCSS(FILE *f)  WebShowCSS(FILE *f)
 {  {
   fprintf(f, "body {font-family: Arial, Helvetica, Sans-Serif; background-color: #EEEEEE; }\n");    fprintf(f, "body {font-family: Arial, Helvetica, Sans-Serif; background-color: #EEEEEE; }\n");
  fprintf(f, "table {background-color: #FFFFFF; }\n");  fprintf(f, "table, pre {background-color: #FFFFFF; }\n");
   fprintf(f, "th, td {padding: 0 2pt 0 2pt; }\n");    fprintf(f, "th, td {padding: 0 2pt 0 2pt; }\n");
   fprintf(f, "th {background-color: #00B000; }\n");    fprintf(f, "th {background-color: #00B000; }\n");
   fprintf(f, "td {background-color: #EEEEEE; }\n");    fprintf(f, "td {background-color: #EEEEEE; }\n");
Line 225  WebShowCSS(FILE *f) Line 230  WebShowCSS(FILE *f)
   fprintf(f, "td.y {background-color: #EEEEBB; }\n");    fprintf(f, "td.y {background-color: #EEEEBB; }\n");
   fprintf(f, "td.g {background-color: #BBEEBB; }\n");    fprintf(f, "td.g {background-color: #BBEEBB; }\n");
   fprintf(f, "td.d {background-color: #CCCCCC; }\n");    fprintf(f, "td.d {background-color: #CCCCCC; }\n");
   fprintf(f, "pre {background-color: #FFFFFF; }\n");  
   fprintf(f, "a, a:visited, a:link { color: blue; }\n");    fprintf(f, "a, a:visited, a:link { color: blue; }\n");
 }  }
   
 static void  static void
WebShowSummary(FILE *f, int priv)WebShowHTMLSummary(FILE *f, int priv)
 {  {
   int           b,l;    int           b,l;
   Bund          B;    Bund          B;
Line 238  WebShowSummary(FILE *f, int priv) Line 242  WebShowSummary(FILE *f, int priv)
   Rep           R;    Rep           R;
   char          buf[64],buf2[64];    char          buf[64],buf2[64];
   
  fprintf(f, "<H2>Current status summary</H2>\n");  fprintf(f, "<h2>Current status summary</h2>\n");
   fprintf(f, "<table>\n");    fprintf(f, "<table>\n");
  fprintf(f, "<TR><TH>Bund</TH><TH colspan=2>Iface</TH><TH>IPCP</TH><TH>IPV6CP</TH><TH>CCP</TH><TH>ECP</TH>"  fprintf(f, "<thead>\n<tr>\n<th>Bund</th>\n<th colspan=\"2\">Iface</th>\n<th>IPCP</th>\n<th>IPV6CP</th>\n<th>CCP</th>\n<th>ECP</th>\n"
             "<TH>Link</TH><TH>LCP</TH><TH>User</TH><TH colspan=2>Device</TH><TH>Peer</TH><TH>IP</TH><TH colspan=3></TH>%s</TR>",             "<th>Link</th>\n<th>LCP</th>\n<th>User</th>\n<th colspan=\"2\">Device</th>\n<th>Peer</th>\n<th>IP</th>\n<th>&#160;</th>\n<th>&#160;</th>\n<th>&#160;</th>\n%s</tr>\n</thead>\n<tbody>\n",
             priv?"<TH>State</TH>":"");             priv?"<th>State</th>\n":"");
 #define FSM_COLOR(s) (((s)==ST_OPENED)?"g":(((s)==ST_INITIAL)?"r":"y"))  #define FSM_COLOR(s) (((s)==ST_OPENED)?"g":(((s)==ST_INITIAL)?"r":"y"))
 #define PHYS_COLOR(s) (((s)==PHYS_STATE_UP)?"g":(((s)==PHYS_STATE_DOWN)?"r":"y"))  #define PHYS_COLOR(s) (((s)==PHYS_STATE_UP)?"g":(((s)==PHYS_STATE_DOWN)?"r":"y"))
     for (b = 0; b<gNumLinks; b++) {      for (b = 0; b<gNumLinks; b++) {
         if ((L=gLinks[b]) != NULL && L->bund == NULL && L->rep == NULL) {          if ((L=gLinks[b]) != NULL && L->bund == NULL && L->rep == NULL) {
            fprintf(f, "<TR>\n");            fprintf(f, "<tr>\n");
            fprintf(f, "<TD colspan=\"7\">&nbsp;</a></TD>\n");            fprintf(f, "<td colspan=\"7\">&#160;</td>\n");
            fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20link\">%s</a></TD>\n",             fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20link\">%s</a></td>\n", 
                 L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->name);                  L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->name);
            fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20lcp\">%s</a></TD>\n",             fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20lcp\">%s</a></td>\n", 
                 L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, FsmStateName(L->lcp.fsm.state));                  L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, FsmStateName(L->lcp.fsm.state));
            fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20auth\">%s</a></TD>\n",             fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20auth\">%s</a></td>\n", 
                 L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->lcp.auth.params.authname);                  L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->lcp.auth.params.authname);
            fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",             fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                 L->tmpl?"d":PHYS_COLOR(L->state), L->name, L->type?L->type->name:"");                  L->tmpl?"d":PHYS_COLOR(L->state), L->name, L->type?L->type->name:"");
            fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",             fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                 L->tmpl?"d":PHYS_COLOR(L->state), L->name, gPhysStateNames[L->state]);                  L->tmpl?"d":PHYS_COLOR(L->state), L->name, gPhysStateNames[L->state]);
             if (L->state != PHYS_STATE_DOWN) {              if (L->state != PHYS_STATE_DOWN) {
                 PhysGetPeerAddr(L, buf, sizeof(buf));                  PhysGetPeerAddr(L, buf, sizeof(buf));
                fprintf(f, "<TD>%s</TD>\n", buf);                fprintf(f, "<td>%s</td>\n", buf);
                fprintf(f, "<TD></TD>\n");                fprintf(f, "<td>&#160;</td>\n");
                 PhysGetCallingNum(L, buf, sizeof(buf));                  PhysGetCallingNum(L, buf, sizeof(buf));
                 PhysGetCalledNum(L, buf2, sizeof(buf2));                  PhysGetCalledNum(L, buf2, sizeof(buf2));
                 if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {                  if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
                    fprintf(f, "<TD>%s</TD><TD><=</TD><TD>%s</TD>\n",                     fprintf(f, "<td>%s</td>\n<td>&#60;=</td>\n<td>%s</td>\n", 
                         buf2, buf);                          buf2, buf);
                 } else {                  } else {
                    fprintf(f, "<TD>%s</TD><TD>=></TD><TD>%s</TD>\n",                     fprintf(f, "<td>%s</td>\n<td>=&#62;</td>\n<td>%s</td>\n", 
                         buf, buf2);                          buf, buf2);
                 }                  }
             } else {              } else {
                fprintf(f, "<TD></TD>\n");                fprintf(f, "<td>&#160;</td>\n");
                fprintf(f, "<TD></TD>\n");                fprintf(f, "<td>&#160;</td>\n");
                fprintf(f, "<TD colspan=3></TD>\n");                fprintf(f, "<td colspan=\"3\">&#160;</td>\n");
             }              }
             if (priv) {              if (priv) {
                 if (!L->tmpl) {                  if (!L->tmpl) {
                     switch (L->state) {                      switch (L->state) {
                         case PHYS_STATE_DOWN:                          case PHYS_STATE_DOWN:
                            fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</A></TD>\n",                            fprintf(f, "<td><a href=\"/cmd?link%%20%s&#38;open\">[Open]</a></td>\n",
                                 L->name);                                  L->name);
                             break;                              break;
                         case PHYS_STATE_UP:                          case PHYS_STATE_UP:
                            fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;close\">[Close]</A></TD>\n",                            fprintf(f, "<td><a href=\"/cmd?link%%20%s&#38;close\">[Close]</a></td>\n",
                                 L->name);                                  L->name);
                             break;                              break;
                         default:                          default:
                            fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</a>&nbsp;<A href=\"/cmd?link%%20%s&amp;close\">[Close]</a></TD>\n",                             fprintf(f, "<td><a href=\"/cmd?link%%20%s&#38;open\">[Open]</a>&#160;<a href=\"/cmd?link%%20%s&#38;close\">[Close]</a></td>\n", 
                                 L->name, L->name);                                  L->name, L->name);
                     }                      }
                 } else {                  } else {
                    fprintf(f, "<TD></TD>\n");                    fprintf(f, "<td>&#160;</td>\n");
                 }                  }
             }              }
            fprintf(f, "</TR>\n");            fprintf(f, "</tr>\n");
         }          }
     }      }
   for (b = 0; b<gNumBundles; b++) {    for (b = 0; b<gNumBundles; b++) {
     if ((B=gBundles[b]) != NULL) {      if ((B=gBundles[b]) != NULL) {
         int rows = B->n_links?B->n_links:1;          int rows = B->n_links?B->n_links:1;
         int first = 1;          int first = 1;
        fprintf(f, "<TR>\n");        fprintf(f, "<tr>\n");
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20bund\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20bund\">%s</a></td>\n", 
             rows, B->tmpl?"d":(B->iface.up?"g":"r"), B->name, B->name);              rows, B->tmpl?"d":(B->iface.up?"g":"r"), B->name, B->name);
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20iface\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20iface\">%s</a></td>\n", 
             rows, B->tmpl?"d":(B->iface.up?"g":"r"), B->name, B->iface.ifname);              rows, B->tmpl?"d":(B->iface.up?"g":"r"), B->name, B->iface.ifname);
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20iface\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20iface\">%s</a></td>\n", 
             rows, B->tmpl?"d":(B->iface.up?"g":"r"), B->name, (B->iface.up?"Up":"Down"));              rows, B->tmpl?"d":(B->iface.up?"g":"r"), B->name, (B->iface.up?"Up":"Down"));
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20ipcp\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20ipcp\">%s</a></td>\n", 
             rows, B->tmpl?"d":FSM_COLOR(B->ipcp.fsm.state), B->name,FsmStateName(B->ipcp.fsm.state));              rows, B->tmpl?"d":FSM_COLOR(B->ipcp.fsm.state), B->name,FsmStateName(B->ipcp.fsm.state));
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20ipv6cp\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20ipv6cp\">%s</a></td>\n", 
             rows, B->tmpl?"d":FSM_COLOR(B->ipv6cp.fsm.state), B->name,FsmStateName(B->ipv6cp.fsm.state));              rows, B->tmpl?"d":FSM_COLOR(B->ipv6cp.fsm.state), B->name,FsmStateName(B->ipv6cp.fsm.state));
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20ccp\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20ccp\">%s</a></td>\n", 
             rows, B->tmpl?"d":FSM_COLOR(B->ccp.fsm.state), B->name,FsmStateName(B->ccp.fsm.state));              rows, B->tmpl?"d":FSM_COLOR(B->ccp.fsm.state), B->name,FsmStateName(B->ccp.fsm.state));
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?bund%%20%s&amp;show%%20ecp\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?bund%%20%s&#38;show%%20ecp\">%s</a></td>\n", 
             rows, B->tmpl?"d":FSM_COLOR(B->ecp.fsm.state), B->name,FsmStateName(B->ecp.fsm.state));              rows, B->tmpl?"d":FSM_COLOR(B->ecp.fsm.state), B->name,FsmStateName(B->ecp.fsm.state));
         if (B->n_links == 0) {          if (B->n_links == 0) {
            fprintf(f, "<TD colspan=\"11\">&nbsp;</a></TD>\n</TR>\n");            fprintf(f, "<td colspan=\"11\">&#160;</td>\n</tr>\n");
         }          }
         for (l = 0; l < NG_PPP_MAX_LINKS; l++) {          for (l = 0; l < NG_PPP_MAX_LINKS; l++) {
             if ((L=B->links[l]) != NULL) {              if ((L=B->links[l]) != NULL) {
                 if (first)                  if (first)
                     first = 0;                      first = 0;
                 else                  else
                    fprintf(f, "<TR>\n");                    fprintf(f, "<tr>\n");
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20link\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20link\">%s</a></td>\n", 
                     L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->name);                      L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->name);
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20lcp\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20lcp\">%s</a></td>\n", 
                     L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, FsmStateName(L->lcp.fsm.state));                      L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, FsmStateName(L->lcp.fsm.state));
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20auth\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20auth\">%s</a></td>\n", 
                     L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->lcp.auth.params.authname);                      L->tmpl?"d":FSM_COLOR(L->lcp.fsm.state), L->name, L->lcp.auth.params.authname);
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                     L->tmpl?"d":PHYS_COLOR(L->state), L->name, L->type?L->type->name:"");                      L->tmpl?"d":PHYS_COLOR(L->state), L->name, L->type?L->type->name:"");
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                     L->tmpl?"d":PHYS_COLOR(L->state), L->name, gPhysStateNames[L->state]);                      L->tmpl?"d":PHYS_COLOR(L->state), L->name, gPhysStateNames[L->state]);
                 if (L->state != PHYS_STATE_DOWN) {                  if (L->state != PHYS_STATE_DOWN) {
                     PhysGetPeerAddr(L, buf, sizeof(buf));                      PhysGetPeerAddr(L, buf, sizeof(buf));
                    fprintf(f, "<TD>%s</TD>\n", buf);                    fprintf(f, "<td>%s</td>\n", buf);
                     if (L->bund != NULL)                      if (L->bund != NULL)
                        fprintf(f, "<TD>%s</TD>\n", inet_ntoa(L->bund->ipcp.peer_addr));                        fprintf(f, "<td>%s</td>\n", inet_ntoa(L->bund->ipcp.peer_addr));
                     else                      else
                        fprintf(f, "<TD></TD>\n");                        fprintf(f, "<td>&#160;</td>\n");
                     PhysGetCallingNum(L, buf, sizeof(buf));                      PhysGetCallingNum(L, buf, sizeof(buf));
                     PhysGetCalledNum(L, buf2, sizeof(buf2));                      PhysGetCalledNum(L, buf2, sizeof(buf2));
                     if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {                      if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
                            fprintf(f, "<TD>%s</TD><TD><=</TD><TD>%s</TD>\n",                             fprintf(f, "<td>%s</td>\n<td>&#60;=</td>\n<td>%s</td>\n", 
                                 buf2, buf);                                  buf2, buf);
                     } else {                      } else {
                            fprintf(f, "<TD>%s</TD><TD>=></TD><TD>%s</TD>\n",                             fprintf(f, "<td>%s</td>\n<td>=&#62;</td>\n<td>%s</td>\n", 
                                 buf, buf2);                                  buf, buf2);
                     }                      }
                 } else {                  } else {
                        fprintf(f, "<TD></TD>\n");                        fprintf(f, "<td>&#160;</td>\n");
                        fprintf(f, "<TD></TD>\n");                        fprintf(f, "<td>&#160;</td>\n");
                        fprintf(f, "<TD colspan=3></TD>\n");                        fprintf(f, "<td colspan=\"3\">&#160;</td>\n");
                 }                  }
                 if (priv) {                  if (priv) {
                     switch (L->state) {                      switch (L->state) {
                         case PHYS_STATE_DOWN:                          case PHYS_STATE_DOWN:
                            fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</A></TD>\n",                            fprintf(f, "<td><a href=\"/cmd?link%%20%s&#38;open\">[Open]</a></td>\n",
                                 L->name);                                  L->name);
                             break;                              break;
                         case PHYS_STATE_UP:                          case PHYS_STATE_UP:
                            fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;close\">[Close]</A></TD>\n",                            fprintf(f, "<td><a href=\"/cmd?link%%20%s&#38;close\">[Close]</a></td>\n",
                                 L->name);                                  L->name);
                             break;                              break;
                         default:                          default:
                            fprintf(f, "<TD><A href=\"/cmd?link%%20%s&amp;open\">[Open]</a>&nbsp;<A href=\"/cmd?link%%20%s&amp;close\">[Close]</a></TD>\n",                             fprintf(f, "<td><a href=\"/cmd?link%%20%s&#38;open\">[Open]</a>&#160;<a href=\"/cmd?link%%20%s&#38;close\">[Close]</a></td>\n", 
                                 L->name, L->name);                                  L->name, L->name);
                     }                      }
                 }                  }
                fprintf(f, "</TR>\n");                fprintf(f, "</tr>\n");
             }              }
         }          }
     }      }
Line 386  WebShowSummary(FILE *f, int priv) Line 390  WebShowSummary(FILE *f, int priv)
         int rows = (R->links[0]?1:0) + (R->links[1]?1:0);          int rows = (R->links[0]?1:0) + (R->links[1]?1:0);
         if (rows == 0)          if (rows == 0)
             rows = 1;              rows = 1;
        fprintf(f, "<TR>\n");        fprintf(f, "<tr>\n");
        fprintf(f, "<TD rowspan=\"%d\" colspan=6>Repeater</TD>\n", rows);        fprintf(f, "<td rowspan=\"%d\" colspan=\"6\">Repeater</td>\n", rows);
        fprintf(f, "<TD rowspan=\"%d\" class=\"%s\"><A href=\"/cmd?rep%%20%s&amp;show%%20repeater\">%s</a></TD>\n",         fprintf(f, "<td rowspan=\"%d\" class=\"%s\"><a href=\"/cmd?rep%%20%s&#38;show%%20repeater\">%s</a></td>\n", 
              rows, R->p_up?"g":"r", R->name, R->name);               rows, R->p_up?"g":"r", R->name, R->name);
         for (l = 0; l < 2; l++) {          for (l = 0; l < 2; l++) {
             if ((L=R->links[l]) != NULL) {              if ((L=R->links[l]) != NULL) {
                 if (shown)                  if (shown)
                    fprintf(f, "<TR>\n");                    fprintf(f, "<tr>\n");
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                     PHYS_COLOR(L->state), L->name, L->name);                      PHYS_COLOR(L->state), L->name, L->name);
                fprintf(f, "<TD colspan=2></TD>\n");                fprintf(f, "<td colspan=\"2\">&#160;</td>\n");
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                     PHYS_COLOR(L->state), L->name, L->type?L->type->name:"");                      PHYS_COLOR(L->state), L->name, L->type?L->type->name:"");
                fprintf(f, "<TD class=\"%s\"><A href=\"/cmd?link%%20%s&amp;show%%20device\">%s</a></TD>\n",                 fprintf(f, "<td class=\"%s\"><a href=\"/cmd?link%%20%s&#38;show%%20device\">%s</a></td>\n", 
                     PHYS_COLOR(L->state), L->name, gPhysStateNames[L->state]);                      PHYS_COLOR(L->state), L->name, gPhysStateNames[L->state]);
                 if (L->state != PHYS_STATE_DOWN) {                  if (L->state != PHYS_STATE_DOWN) {
                     PhysGetPeerAddr(L, buf, sizeof(buf));                      PhysGetPeerAddr(L, buf, sizeof(buf));
                    fprintf(f, "<TD>%s</TD>\n", buf);                    fprintf(f, "<td>%s</td>\n", buf);
                     if (L->bund != NULL)                      if (L->bund != NULL)
                        fprintf(f, "<TD>%s</TD>\n", inet_ntoa(L->bund->ipcp.peer_addr));                        fprintf(f, "<td>%s</td>\n", inet_ntoa(L->bund->ipcp.peer_addr));
                     else                      else
                        fprintf(f, "<TD></TD>\n");                        fprintf(f, "<td>&#160;</td>\n");
                     PhysGetCallingNum(L, buf, sizeof(buf));                      PhysGetCallingNum(L, buf, sizeof(buf));
                     PhysGetCalledNum(L, buf2, sizeof(buf2));                      PhysGetCalledNum(L, buf2, sizeof(buf2));
                     if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {                      if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
                            fprintf(f, "<TD>%s</TD><TD><=</TD><TD>%s</TD>\n",                             fprintf(f, "<td>%s</td>\n<td>&#60;=</td>\n<td>%s</td>\n", 
                                 buf2, buf);                                  buf2, buf);
                     } else {                      } else {
                            fprintf(f, "<TD>%s</TD><TD>=></TD><TD>%s</TD>\n",                             fprintf(f, "<td>%s</td>\n<td>=&#62;</td>\n<td>%s</td>\n", 
                                 buf, buf2);                                  buf, buf2);
                     }                      }
                 } else {                  } else {
                        fprintf(f, "<TD></TD>\n");                        fprintf(f, "<td>&#160;</td>\n");
                        fprintf(f, "<TD></TD>\n");                        fprintf(f, "<td>&#160;</td>\n");
                        fprintf(f, "<TD colspan=3></TD>\n");                        fprintf(f, "<td colspan=\"3\">&#160;</td>\n");
                 }                  }
                fprintf(f, "<TD></TD>\n");                fprintf(f, "<td>&#160;</td>\n");
                fprintf(f, "</TR>\n");                fprintf(f, "</tr>\n");
                                   
                 shown = 1;                  shown = 1;
             }              }
         }          }
         if (!shown) {          if (!shown) {
            fprintf(f, "<TD colspan = \"11\"></TD>\n");            fprintf(f, "<td colspan=\"11\">&#160;</td>\n");
            fprintf(f, "</TR>\n");            fprintf(f, "</tr>\n");
         }          }
     }      }
   }    }
  fprintf(f, "</TABLE>\n");  fprintf(f, "</tbody>\n</table>\n");
 }  }
   
   static void
   WebShowJSONSummary(FILE *f, int priv)
   {
     int           b,l;
     Bund          B;
     Link          L;
     Rep           R;
     char          buf[64],buf2[64];
   
     (void)priv;
     int first_l = 1;
     fprintf(f, "{\"links\":[\n");
     for (b = 0; b<gNumLinks; b++) {
           if ((L=gLinks[b]) != NULL && L->bund == NULL && L->rep == NULL) {
               if (first_l) {
                   fprintf(f, "{\n");
                   first_l = 0;
               } else
                   fprintf(f, ",\n{\n");
   
               fprintf(f, "\"link\": \"%s\",\n", L->name);
               fprintf(f, "\"lcp\": \"%s\",\n", FsmStateName(L->lcp.fsm.state));
               fprintf(f, "\"auth\": \"%s\",\n", L->lcp.auth.params.authname);
               fprintf(f, "\"type\": \"%s\",\n", L->type?L->type->name:"");
               fprintf(f, "\"state\": \"%s\",\n", gPhysStateNames[L->state]);
   
               if (L->state != PHYS_STATE_DOWN) {
                   PhysGetPeerAddr(L, buf, sizeof(buf));
                   fprintf(f, "\"peer_ip\": \"%s\",\n", buf);
   
                   PhysGetCallingNum(L, buf, sizeof(buf));
                   PhysGetCalledNum(L, buf2, sizeof(buf2));
                   if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
                       fprintf(f, "\"calling_num\": \"%s\",\n", buf);
                       fprintf(f, "\"called_num\": \"%s\"\n", buf2);
                   } else {
                       fprintf(f, "\"calling_num\": \"%s\",\n", buf2);
                       fprintf(f, "\"called_num\": \"%s\"\n", buf);
                   }
               } else {
                   fprintf(f, "\"calling_num\": \"%s\",\n", "");
                   fprintf(f, "\"called_num\": \"%s\"\n", "");
               }
               fprintf(f, "}\n");
           }
     }
     fprintf(f, "],\n");
   
     int first_b = 1;
     fprintf(f, "\"bundles\":[\n");
     for (b = 0; b<gNumBundles; b++) {
       if ((B=gBundles[b]) != NULL) {
           if (first_b) {
               fprintf(f, "{\n");
               first_b = 0;
           } else
               fprintf(f, ",\n{\n");
   
           fprintf(f, "\"bundle\": \"%s\",\n", B->name);
           fprintf(f, "\"iface\": \"%s\",\n", B->iface.ifname);
           fprintf(f, "\"state\": \"%s\",\n", (B->iface.up?"Up":"Down"));
           fprintf(f, "\"ipcp\": \"%s\",\n", FsmStateName(B->ipcp.fsm.state));
           fprintf(f, "\"ipv6cp\": \"%s\",\n", FsmStateName(B->ipv6cp.fsm.state));
           fprintf(f, "\"ccp\": \"%s\",\n", FsmStateName(B->ccp.fsm.state));
           fprintf(f, "\"ecp\": \"%s\",\n", FsmStateName(B->ecp.fsm.state));
   
           first_l = 1;
           fprintf(f, "\"links\":[\n");
           for (l = 0; l < NG_PPP_MAX_LINKS; l++) {
               if ((L=B->links[l]) != NULL) {
                   if (first_l) {
                       fprintf(f, "{\n");
                       first_l = 0;
                   } else
                       fprintf(f, ",\n{\n");
   
                   fprintf(f, "\"link\": \"%s\",\n", L->name);
                   fprintf(f, "\"lcp\": \"%s\",\n", FsmStateName(L->lcp.fsm.state));
                   fprintf(f, "\"auth\": \"%s\",\n", L->lcp.auth.params.authname);
                   fprintf(f, "\"type\": \"%s\",\n", L->type?L->type->name:"");
                   fprintf(f, "\"state\": \"%s\",\n", gPhysStateNames[L->state]);
   
                   if (L->state != PHYS_STATE_DOWN) {
                       PhysGetPeerAddr(L, buf, sizeof(buf));
                       fprintf(f, "\"peer_ip\": \"%s\",\n", buf);
   
                       if (L->bund != NULL)
                           fprintf(f, "\"ipcp_ip\": \"%s\",\n", inet_ntoa(L->bund->ipcp.peer_addr));
                       else
                           fprintf(f, "\"ipcp_ip\": \"%s\",\n", "");
   
                       PhysGetCallingNum(L, buf, sizeof(buf));
                       PhysGetCalledNum(L, buf2, sizeof(buf2));
                       if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
                           fprintf(f, "\"calling_num\": \"%s\",\n", buf);
                           fprintf(f, "\"called_num\": \"%s\"\n", buf2);
                       } else {
                           fprintf(f, "\"calling_num\": \"%s\",\n", buf2);
                           fprintf(f, "\"called_num\": \"%s\"\n", buf);
                       }
                   } else {
                           fprintf(f, "\"calling_num\": \"%s\",\n", "");
                           fprintf(f, "\"called_num\": \"%s\"\n", "");
                   }
                   fprintf(f, "}\n");
               }
           }
           fprintf(f, "]\n}\n");
       }
     }
     fprintf(f, "],\n");
   
     int first_r = 1;
     fprintf(f, "\"repeaters\":[\n");
     for (b = 0; b<gNumReps; b++) {
       if ((R=gReps[b]) != NULL) {
           if (first_r) {
               fprintf(f, "{\n");
               first_r = 0;
           } else
               fprintf(f, ",\n{\n");
   
           fprintf(f, "\"repeater\": \"%s\",\n", R->name);
   
           first_l = 1;
           fprintf(f, "\"links\":[\n");
           for (l = 0; l < 2; l++) {
               if ((L=R->links[l]) != NULL) {
                   if (first_l) {
                       fprintf(f, "{\n");
                       first_l = 0;
                   } else
                       fprintf(f, ",\n{\n");
   
                   fprintf(f, "\"link\": \"%s\",\n", L->name);
                   fprintf(f, "\"type\": \"%s\",\n", L->type?L->type->name:"");
                   fprintf(f, "\"state\": \"%s\",\n", gPhysStateNames[L->state]);
   
                   if (L->state != PHYS_STATE_DOWN) {
                       PhysGetPeerAddr(L, buf, sizeof(buf));
                       fprintf(f, "\"peer_ip\": \"%s\",\n", buf);
   
                       if (L->bund != NULL)
                           fprintf(f, "\"ipcp_ip\": \"%s\",\n", inet_ntoa(L->bund->ipcp.peer_addr));
                       else
                           fprintf(f, "\"ipcp_ip\": \"%s\",\n", "");
   
                       PhysGetCallingNum(L, buf, sizeof(buf));
                       PhysGetCalledNum(L, buf2, sizeof(buf2));
                       if (PhysGetOriginate(L) == LINK_ORIGINATE_REMOTE) {
                           fprintf(f, "\"calling_num\": \"%s\",\n", buf);
                           fprintf(f, "\"called_num\": \"%s\"\n", buf2);
                       } else {
                           fprintf(f, "\"calling_num\": \"%s\",\n", buf2);
                           fprintf(f, "\"called_num\": \"%s\"\n", buf);
                       }
                   } else {
                       fprintf(f, "\"calling_num\": \"%s\",\n", "");
                       fprintf(f, "\"called_num\": \"%s\"\n", "");
                   }
                   fprintf(f, "}\n");
               }
           }
           fprintf(f, "]\n");
   
           if (b == (gNumReps - 1)) {
               fprintf(f, "}\n");
           } else {
               fprintf(f, "},\n");
           }
       }
     }
     fprintf(f, "]}\n");
   }
   
 static void   static void 
 WebRunBinCmd(FILE *f, const char *query, int priv)  WebRunBinCmd(FILE *f, const char *query, int priv)
 {  {
Line 467  WebRunBinCmd(FILE *f, const char *query, int priv) Line 646  WebRunBinCmd(FILE *f, const char *query, int priv)
   
     for (k = 0; k < argc; k++) {      for (k = 0; k < argc; k++) {
         int     ac, rtn;          int     ac, rtn;
        char    *av[MAX_CONSOLE_ARGS];        char *av[MAX_CONSOLE_ARGS];
         char    *buf1;          char    *buf1;
   
         buf1 = Malloc(MB_WEB, strlen(argv[k]) + 1);          buf1 = Malloc(MB_WEB, strlen(argv[k]) + 1);
Line 478  WebRunBinCmd(FILE *f, const char *query, int priv) Line 657  WebRunBinCmd(FILE *f, const char *query, int priv)
             buf1));              buf1));
         ac = ParseLine(buf1, av, sizeof(av) / sizeof(*av), 0);          ac = ParseLine(buf1, av, sizeof(av) / sizeof(*av), 0);
         cs->context.errmsg[0] = 0;          cs->context.errmsg[0] = 0;
        rtn = DoCommandTab(&cs->context, gCommands, ac, av);        rtn = DoCommandTab(&cs->context, gCommands, ac, (const char *const *)av);
         Freee(buf1);          Freee(buf1);
         fprintf(f, "RESULT: %d %s\n", rtn, cs->context.errmsg);          fprintf(f, "RESULT: %d %s\n", rtn, cs->context.errmsg);
     }      }
Line 516  WebRunCmd(FILE *f, const char *query, int priv) Line 695  WebRunCmd(FILE *f, const char *query, int priv)
             if (++argc >= MAX_CONSOLE_ARGS)              if (++argc >= MAX_CONSOLE_ARGS)
                 break;                  break;
   
    fprintf(f, "<P><A href=\"/\"><< Back</A></P>\n");    fprintf(f, "<p>\n<a href=\"/\">Back</a>\n</p>\n");
   
     if (argc == 0) {      if (argc == 0) {
        fprintf(f, "<P>No command cpecified!</P>\n");        fprintf(f, "<p>No command cpecified!</p>\n");
         goto done;          goto done;
     }      }
   
    fprintf(f, "<PRE>\n");    fprintf(f, "<pre>\n");
     for (k = 0; k < argc; k++) {      for (k = 0; k < argc; k++) {
         int     ac;          int     ac;
        char    *av[MAX_CONSOLE_ARGS];        char *av[MAX_CONSOLE_ARGS];
         char    *buf1;          char    *buf1;
   
         buf1 = Malloc(MB_WEB, strlen(argv[k]) + 1);          buf1 = Malloc(MB_WEB, strlen(argv[k]) + 1);
Line 540  WebRunCmd(FILE *f, const char *query, int priv) Line 719  WebRunCmd(FILE *f, const char *query, int priv)
         cs->write(cs, "%s\n", buf1);          cs->write(cs, "%s\n", buf1);
           
         ac = ParseLine(buf1, av, sizeof(av) / sizeof(*av), 0);          ac = ParseLine(buf1, av, sizeof(av) / sizeof(*av), 0);
        DoCommand(&cs->context, ac, av, NULL, 0);        DoCommand(&cs->context, ac, (const char *const *)av, NULL, 0);
         Freee(buf1);          Freee(buf1);
     }      }
    fprintf(f, "</PRE>\n");    fprintf(f, "</pre>\n");
 done:  done:
     Freee(buf);      Freee(buf);
    fprintf(f, "<P><A href=\"/\"><< Back</A></P>\n");    fprintf(f, "<p>\n<a href=\"/\">Back</a>\n</p>\n");
     RESETREF(cs->context.lnk, NULL);      RESETREF(cs->context.lnk, NULL);
     RESETREF(cs->context.bund, NULL);      RESETREF(cs->context.bund, NULL);
     RESETREF(cs->context.rep, NULL);      RESETREF(cs->context.rep, NULL);
 }  }
   
 static void  static void
WebServletRunCleanup(void *cookie) {WebServletRunCleanup(void *cookie) NO_THREAD_SAFETY_ANALYSIS
 {
     (void)cookie;
     GIANT_MUTEX_UNLOCK();      GIANT_MUTEX_UNLOCK();
 }  }
   
Line 566  WebServletRun(struct http_servlet *servlet, Line 747  WebServletRun(struct http_servlet *servlet,
     const char *query;      const char *query;
     int priv = 0;      int priv = 0;
           
       (void)servlet;
     if (Enabled(&gWeb.options, WEB_AUTH)) {      if (Enabled(&gWeb.options, WEB_AUTH)) {
         const char *username;          const char *username;
         const char *password;          const char *password;
Line 601  WebServletRun(struct http_servlet *servlet, Line 783  WebServletRun(struct http_servlet *servlet,
     if (!strcmp(path,"/mpd.css")) {      if (!strcmp(path,"/mpd.css")) {
         http_response_set_header(resp, 0, "Content-Type", "text/css");          http_response_set_header(resp, 0, "Content-Type", "text/css");
         WebShowCSS(f);          WebShowCSS(f);
    } else if (!strcmp(path,"/bincmd")) {    } else if (!strcmp(path,"/bincmd") || !strcmp(path,"/json")) {
         http_response_set_header(resp, 0, "Content-Type", "text/plain");          http_response_set_header(resp, 0, "Content-Type", "text/plain");
         http_response_set_header(resp, 1, "Pragma", "no-cache");          http_response_set_header(resp, 1, "Pragma", "no-cache");
         http_response_set_header(resp, 1, "Cache-Control", "no-cache, must-revalidate");          http_response_set_header(resp, 1, "Cache-Control", "no-cache, must-revalidate");
                   
         pthread_cleanup_push(WebServletRunCleanup, NULL);          pthread_cleanup_push(WebServletRunCleanup, NULL);
         GIANT_MUTEX_LOCK();          GIANT_MUTEX_LOCK();
        WebRunBinCmd(f, query, priv);        
         if (!strcmp(path,"/bincmd"))
             WebRunBinCmd(f, query, priv);
         else if (!strcmp(path,"/json"))
             WebShowJSONSummary(f, priv);
 
         GIANT_MUTEX_UNLOCK();          GIANT_MUTEX_UNLOCK();
         pthread_cleanup_pop(0);          pthread_cleanup_pop(0);
   
     } else if (!strcmp(path,"/") || !strcmp(path,"/cmd")) {      } else if (!strcmp(path,"/") || !strcmp(path,"/cmd")) {
         http_response_set_header(resp, 0, "Content-Type", "text/html");          http_response_set_header(resp, 0, "Content-Type", "text/html");
         http_response_set_header(resp, 1, "Pragma", "no-cache");          http_response_set_header(resp, 1, "Pragma", "no-cache");
Line 618  WebServletRun(struct http_servlet *servlet, Line 806  WebServletRun(struct http_servlet *servlet,
                   
         pthread_cleanup_push(WebServletRunCleanup, NULL);          pthread_cleanup_push(WebServletRunCleanup, NULL);
         GIANT_MUTEX_LOCK();          GIANT_MUTEX_LOCK();
        fprintf(f, "<!DOCTYPE HTML "
            "PUBLIC \"-//W3C//DTD HTML 4.01//EN\" "        fprintf(f, "<!DOCTYPE html>\n");
            "\"http://www.w3.org/TR/html4/strict.dtd\">\n");        fprintf(f, "<html>\n");
        fprintf(f, "<HTML>\n");        fprintf(f, "<head>\n<title>Multi-link PPP Daemon for FreeBSD (mpd)</title>\n");
        fprintf(f, "<HEAD><TITLE>Multi-link PPP Daemon for FreeBSD (mpd)</TITLE>\n");        fprintf(f, "<link rel=\"stylesheet\" href=\"/mpd.css\" type=\"text/css\"/>\n");
        fprintf(f, "<LINK rel='stylesheet' href='/mpd.css' type='text/css'>\n");        fprintf(f, "</head>\n<body>\n");
        fprintf(f, "</HEAD>\n<BODY>\n");        fprintf(f, "<h1>Multi-link PPP Daemon for FreeBSD</h1>\n");
        fprintf(f, "<H1>Multi-link PPP Daemon for FreeBSD</H1>\n"); 
           
         if (!strcmp(path,"/"))          if (!strcmp(path,"/"))
            WebShowSummary(f, priv);            WebShowHTMLSummary(f, priv);
         else if (!strcmp(path,"/cmd"))          else if (!strcmp(path,"/cmd"))
             WebRunCmd(f, query, priv);              WebRunCmd(f, query, priv);
                           
         GIANT_MUTEX_UNLOCK();          GIANT_MUTEX_UNLOCK();
         pthread_cleanup_pop(0);          pthread_cleanup_pop(0);
                   
        fprintf(f, "</BODY>\n</HTML>\n");        fprintf(f, "</body>\n</html>\n");
     } else {      } else {
         http_response_send_error(resp, 404, NULL);          http_response_send_error(resp, 404, NULL);
     }      }
Line 645  WebServletRun(struct http_servlet *servlet, Line 832  WebServletRun(struct http_servlet *servlet,
 static void       static void     
 WebServletDestroy(struct http_servlet *servlet)  WebServletDestroy(struct http_servlet *servlet)
 {  {
       (void)servlet;
 }  }
   
 static void  static void
Line 652  WebLogger(int sev, const char *fmt, ...) Line 840  WebLogger(int sev, const char *fmt, ...)
 {  {
   va_list       args;    va_list       args;
   
     (void)sev;
   va_start(args, fmt);    va_start(args, fmt);
   vLogPrintf(fmt, args);    vLogPrintf(fmt, args);
   va_end(args);    va_end(args);
Line 662  WebLogger(int sev, const char *fmt, ...) Line 851  WebLogger(int sev, const char *fmt, ...)
  */   */
   
 static int  static int
WebSetCommand(Context ctx, int ac, char *av[], void *arg) WebSetCommand(Context ctx, int ac, const char *const av[], const void *arg) 
 {  {
   Web                   w = &gWeb;    Web                   w = &gWeb;
   int                   port;    int                   port;

Removed from v.1.1  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>