Changeset db656f3332551668dbf8656d8dcd05fe917ddcd7

Show
Ignore:
Timestamp:
09/06/08 23:51:16 (6 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1220745076 +0000
git-parent:

[aa6712ff5754eb2cffd6bc6260529c77b5878dbe]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1220745076 +0000
Message:

pull help and docs into the console, refs #21

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • configure.in

    r27a24a1 rdb656f3  
    212212AC_MSG_RESULT([$XML2LIBS]) 
    213213 
     214AC_CHECK_FUNC(xmlParseDocument, , [AC_MSG_ERROR(*** libxml2 is required ***)]) 
     215 
     216AC_MSG_CHECKING([libxslt cflags]) 
     217XSLTCFLAGS=`xslt-config --cflags` 
     218CFLAGS="$CFLAGS $XSLTCFLAGS" 
     219AC_MSG_RESULT([$XSLTCFLAGS]) 
     220 
     221AC_MSG_CHECKING([libxslt libs]) 
     222XSLTLIBS=`xslt-config --libs` 
     223LIBS="$LIBS $XSLTLIBS" 
     224AC_MSG_RESULT([$XSLTLIBS]) 
     225 
     226AC_CHECK_FUNC(xsltParseStylesheetDoc, , [AC_MSG_ERROR(*** libxslt is required ***)]) 
     227 
    214228APRPREFIX="`apr-1-config --prefix`" 
    215229AC_MSG_CHECKING([libserf cflags]) 
  • src/Makefile.in

    r0a06b2c rdb656f3  
    99PGLIBS=@PGLIBS@ 
    1010INSTALL=@INSTALL@ 
     11XML2H=@top_srcdir@/buildtools/xml2h 
    1112 
    1213prefix=@prefix@ 
     
    9798        @echo "- compiling $<" 
    9899 
     100noit_module.o:  module-online.h 
     101 
     102module-online.h:        modules/module-online.xsl 
     103        @echo "- making module-online.h (StyleSheet include" 
     104        @$(XML2H) helpStyleXML < modules/module-online.xsl > $@ 
     105 
    99106noit_tokenizer.c:       noit_tokenizer.re 
    100107        @re2c -o $@ noit_tokenizer.re 
  • src/modules/Makefile.in

    r27a24a1 rdb656f3  
    1 .SUFFIXES: .lo .@MODULEEXT@ 
     1.SUFFIXES: .lo .@MODULEEXT@ .xml .xmlh 
    22 
    33CC=@CC@ 
     
    1818XSLTPROC=@XSLTPROC@ 
    1919XMLLINT=@XMLLINT@ 
     20XML2H=@top_srcdir@/buildtools/xml2h 
    2021 
    2122top_srcdir=@top_srcdir@ 
     
    2728all:    $(MODULES) 
    2829 
     30.xml.xmlh: 
     31        @$(XML2H) `echo $< | sed -e 's/\.xml$$//;'`_xml_description < $< > $@ 
     32 
    2933lua.@MODULEEXT@:        lua.lo lua_noit.lo 
    3034        @$(MODULELD) $(LDFLAGS) -o $@ lua.lo lua_noit.lo ../lua/liblua.lo 
    3135        @echo "- linking $@" 
    3236 
    33 lua.lo: lua.c 
     37lua.lo: lua.c lua.xmlh 
    3438        @$(CC) $(CPPFLAGS) $(SHCFLAGS) -I$(top_srcdir)/src/lua/src -c lua.c -o $@ 
    3539        @echo "- compiling $<" 
     
    4347        @echo "- linking $@" 
    4448 
    45 postgres.lo:    postgres.c 
     49postgres.lo:    postgres.c postgres.xmlh 
    4650        @$(CC) $(CPPFLAGS) $(SHCFLAGS) $(PGCFLAGS) -c $< -o $@ 
    4751        @echo "- compiling $<" 
     
    5155        @echo "- linking $@" 
    5256 
    53 dns.lo: dns.c 
     57dns.lo: dns.c dns.xmlh 
    5458        @$(CC) $(CPPFLAGS) $(SHCFLAGS) -c $< -o $@ 
    5559        @echo "- compiling $<" 
     
    5963        @echo "- linking $@" 
    6064 
    61 http.lo:        http.c 
     65http.lo:        http.c http.xmlh resmon.xmlh resmon_part.xmlh 
    6266        @$(CC) $(CPPFLAGS) $(SHCFLAGS) -I$(top_srcdir)/src/serf @SERFCFLAGS@ -c http.c -o $@ 
    6367        @echo "- compiling $<" 
     
    7175        @echo "- linking $@" 
    7276 
     77ssh2.lo:        ssh2.xmlh 
     78 
    7379ping_icmp.@MODULEEXT@:  ping_icmp.lo 
    7480        @$(MODULELD) $(LDFLAGS) -o $@ $< 
     
    7884        @$(MODULELD) $(LDFLAGS) -o $@ $< 
    7985        @echo "- linking $@" 
     86 
     87snmp.lo:        snmp.xmlh 
    8088 
    8189.c.lo: 
     
    95103 
    96104clean: 
    97         rm -f *.lo *.@MODULEEXT@ 
     105        rm -f *.lo *.@MODULEEXT@ *.xmlh 
  • src/modules/dns.c

    r4ce9c54 rdb656f3  
    666666} 
    667667 
     668#include "dns.xmlh" 
    668669noit_module_t dns = { 
    669670  { 
     
    672673    "dns", 
    673674    "DNS RR checker", 
     675    dns_xml_description, 
    674676    dns_onload 
    675677  }, 
  • src/modules/http.c

    rc39dbcd rdb656f3  
    893893  return 0; 
    894894} 
     895 
     896#include "http.xmlh" 
    895897noit_module_t http = { 
    896898  { 
     
    899901    "http", 
    900902    "libserf-based HTTP and HTTPS resource checker", 
     903    http_xml_description, 
    901904    serf_onload 
    902905  }, 
     
    907910}; 
    908911 
     912#include "resmon.xmlh" 
    909913noit_module_t resmon = { 
    910914  { 
     
    913917    "resmon", 
    914918    "libserf-based resmon resource checker", 
     919    resmon_xml_description, 
    915920    serf_onload 
    916921  }, 
     
    921926}; 
    922927 
     928#include "resmon_part.xmlh" 
    923929noit_module_t resmon_part = { 
    924930  { 
     
    927933    "resmon_part", 
    928934    "resmon part resource checker", 
     935    resmon_part_xml_description, 
    929936    serf_onload 
    930937  }, 
  • src/modules/lua.c

    r5211225 rdb656f3  
    144144} 
    145145static int 
     146noit_lua_module_set_description(lua_State *L) { 
     147  noit_module_t *module; 
     148  if(lua_gettop(L) != 1) luaL_error(L, "wrong number of arguments"); 
     149  module = lua_touserdata(L, lua_upvalueindex(1)); 
     150  module->hdr.description = strdup(lua_tostring(L, 1)); 
     151  return 0; 
     152} 
     153static int 
     154noit_lua_module_set_name(lua_State *L) { 
     155  noit_module_t *module; 
     156  if(lua_gettop(L) != 1) luaL_error(L, "wrong number of arguments"); 
     157  module = lua_touserdata(L, lua_upvalueindex(1)); 
     158  module->hdr.name = strdup(lua_tostring(L, 1)); 
     159  return 0; 
     160} 
     161static int 
     162noit_lua_module_set_xml_description(lua_State *L) { 
     163  noit_module_t *module; 
     164  if(lua_gettop(L) != 1) luaL_error(L, "wrong number of arguments"); 
     165  module = lua_touserdata(L, lua_upvalueindex(1)); 
     166  module->hdr.xml_description = strdup(lua_tostring(L, 1)); 
     167  return 0; 
     168} 
     169static int 
    146170noit_module_index_func(lua_State *L) { 
     171  noit_module_t **udata, *module; 
     172  const char *k; 
    147173  int n; 
    148174  n = lua_gettop(L);    /* number of arguments */ 
     
    151177    luaL_error(L, "metatable error, arg1 not a noit_module_t!"); 
    152178  } 
     179  udata = lua_touserdata(L, 1); 
     180  module = *udata; 
     181  if(!lua_isstring(L, 2)) { 
     182    luaL_error(L, "metatable error, arg2 not a string!"); 
     183  } 
     184  k = lua_tostring(L, 2); 
     185  switch(*k) { 
     186    case 'd': 
     187      if(!strcmp(k, "description")) { 
     188        lua_pushlightuserdata(L, module); 
     189        lua_pushcclosure(L, noit_lua_module_set_description, 1); 
     190      } 
     191      else break; 
     192      return 1; 
     193    case 'n': 
     194      if(!strcmp(k, "name")) { 
     195        lua_pushlightuserdata(L, module); 
     196        lua_pushcclosure(L, noit_lua_module_set_name, 1); 
     197      } 
     198      else break; 
     199      return 1; 
     200    case 'x': 
     201      if(!strcmp(k, "xml_description")) { 
     202        lua_pushlightuserdata(L, module); 
     203        lua_pushcclosure(L, noit_lua_module_set_xml_description, 1); 
     204      } 
     205      else break; 
     206      return 1; 
     207    default: 
     208      break; 
     209  } 
     210  luaL_error(L, "noit_module_t no such element: %s", k); 
    153211  return 0; 
    154212} 
     
    732790} 
    733791 
     792#include "lua.xmlh" 
    734793noit_module_loader_t lua = { 
    735794  { 
     
    738797    "lua", 
    739798    "Lua check loader", 
     799    lua_xml_description, 
    740800    noit_lua_loader_onload, 
    741801  }, 
  • src/modules/postgres.c

    rab6d943 rdb656f3  
    256256} 
    257257 
     258#include "postgres.xmlh" 
    258259noit_module_t postgres = { 
    259260  { 
     
    262263    "postgres", 
    263264    "PostgreSQL Checker", 
     265    postgres_xml_description, 
    264266    postgres_onload 
    265267  }, 
  • src/modules/snmp.c

    r3277121 rdb656f3  
    465465  return 0; 
    466466} 
     467 
     468#include "snmp.xmlh" 
    467469noit_module_t snmp = { 
    468470  { 
     
    471473    "snmp", 
    472474    "SNMP collection", 
     475    snmp_xml_description, 
    473476    noit_snmp_onload 
    474477  }, 
  • src/modules/ssh2.c

    rc39dbcd rdb656f3  
    300300} 
    301301 
     302#include "ssh2.xmlh" 
    302303noit_module_t ssh2 = { 
    303304  { 
     
    306307    "ssh2", 
    307308    "Secure Shell version 2 checker", 
     309    ssh2_xml_description, 
    308310    ssh2_onload 
    309311  }, 
  • src/noit_conf.c

    r4bed82b rdb656f3  
    445445    return noit_conf_set_string(section,path,"true"); 
    446446  return noit_conf_set_string(section,path,"false"); 
    447 } 
    448  
    449 static int 
    450 noit_console_write_xml(void *vncct, const char *buffer, int len) { 
    451   noit_console_closure_t ncct = vncct; 
    452   return nc_write(ncct, buffer, len); 
    453 } 
    454 static int 
    455 noit_console_close_xml(void *vncct) { 
    456   return 0; 
    457447} 
    458448 
  • src/noit_console.c

    r7180374 rdb656f3  
    454454}; 
    455455 
     456int 
     457noit_console_write_xml(void *vncct, const char *buffer, int len) { 
     458  noit_console_closure_t ncct = vncct; 
     459  return nc_write(ncct, buffer, len); 
     460} 
     461 
     462int 
     463noit_console_close_xml(void *vncct) { 
     464  return 0; 
     465} 
     466 
    456467void 
    457468noit_console_init() { 
  • src/noit_console.h

    r7180374 rdb656f3  
    3434/* This performs a pop (exiting if at toplevel) */ 
    3535extern cmd_info_t console_command_exit; 
     36extern cmd_info_t console_command_help; 
    3637extern cmd_info_t console_command_shutdown; 
    3738extern cmd_info_t console_command_restart; 
     
    5960 
    6061typedef struct _console_state_stack { 
     62  char *name; 
    6163  noit_console_state_t *state; 
    6264  void *userdata; 
     
    121123 
    122124API_EXPORT(int) 
     125  noit_console_help(noit_console_closure_t ncct, int argc, char **argv, 
     126                    noit_console_state_t *, void *); 
     127 
     128API_EXPORT(int) 
    123129  noit_console_shutdown(noit_console_closure_t ncct, int argc, char **argv, 
    124130                        noit_console_state_t *, void *); 
     
    171177         noit_console_state_t *dstate, void *closure); 
    172178 
     179API_EXPORT(int) 
     180  noit_console_write_xml(void *vncct, const char *buffer, int len); 
     181 
     182API_EXPORT(int) 
     183  noit_console_close_xml(void *vncct); 
     184 
     185API_EXPORT(void) 
     186  noit_console_add_help(const char *topic, console_cmd_func_t topic_func); 
     187 
    173188#endif 
  • src/noit_console_state.c

    r7180374 rdb656f3  
    1212#include "noit_console.h" 
    1313#include "noit_tokenizer.h" 
     14#include "noit_module.h" 
    1415 
    1516#include <netinet/in.h> 
     
    1718#include <pcre.h> 
    1819 
     20int cmd_info_comparek(const void *akv, const void *bv) { 
     21  char *ak = (char *)akv; 
     22  cmd_info_t *b = (cmd_info_t *)bv; 
     23  return strcasecmp(ak, b->name); 
     24} 
     25int cmd_info_compare(const void *av, const void *bv) { 
     26  cmd_info_t *a = (cmd_info_t *)av; 
     27  cmd_info_t *b = (cmd_info_t *)bv; 
     28  return strcasecmp(a->name, b->name); 
     29} 
     30 
     31cmd_info_t console_command_help = { 
     32  "help", noit_console_help, NULL, NULL 
     33}; 
    1934cmd_info_t console_command_exit = { 
    2035  "exit", noit_console_state_pop, NULL, NULL 
     
    2742}; 
    2843 
     44void 
     45noit_console_add_help(const char *topic, console_cmd_func_t topic_func) { 
     46  noit_console_state_t *s = console_command_help.dstate; 
     47  if(!s) { 
     48    console_command_help.dstate = s = calloc(1, sizeof(*s)); 
     49    noit_skiplist_init(&s->cmds); 
     50    noit_skiplist_set_compare(&s->cmds, cmd_info_compare, cmd_info_comparek); 
     51  } 
     52  noit_console_state_add_cmd(s, NCSCMD(topic, topic_func, NULL, NULL)); 
     53} 
    2954 
    3055static char * 
     
    194219 
    195220int 
     221noit_console_render_help(noit_console_closure_t ncct, 
     222                         noit_console_state_t *dstate) { 
     223  noit_skiplist_node *iter = NULL; 
     224  if(!dstate) { 
     225    nc_printf(ncct, "No help available.\n"); 
     226    return -1; 
     227  } 
     228  for(iter = noit_skiplist_getlist(&dstate->cmds); iter; 
     229      noit_skiplist_next(&dstate->cmds,&iter)) { 
     230    cmd_info_t *cmd = iter->data; 
     231    if(strcmp(cmd->name, "help")) nc_printf(ncct, "  ==> '%s'\n", cmd->name); 
     232  } 
     233  return 0; 
     234} 
     235 
     236int 
    196237noit_console_state_delegate(noit_console_closure_t ncct, 
    197238                            int argc, char **argv, 
     
    201242 
    202243  if(argc == 0) { 
    203     nc_printf(ncct, "arguments expected\n"); 
    204     /* XXX: noit_console_render_help(dstate); */ 
     244    noit_console_render_help(ncct, dstate); 
     245    nc_printf(ncct, "incomplete command.\n"); 
    205246    return -1; 
    206247  } 
     
    221262 
    222263  if(!argc) { 
     264    noit_console_render_help(ncct, stack->state); 
    223265    nc_printf(ncct, "arguments expected\n"); 
    224266    return -1; 
     
    266308    } 
    267309  } 
     310  if(ncct->state_stack->name) free(ncct->state_stack->name); 
     311  ncct->state_stack->name = strdup(cmd->name); 
    268312  return cmd->func(ncct, argc-1, argv+1, cmd->dstate, cmd->closure); 
    269313} 
     
    271315noit_console_state_do(noit_console_closure_t ncct, int argc, char **argv) { 
    272316  return _noit_console_state_do(ncct, ncct->state_stack, argc, argv); 
    273 } 
    274  
    275 int cmd_info_comparek(const void *akv, const void *bv) { 
    276   char *ak = (char *)akv; 
    277   cmd_info_t *b = (cmd_info_t *)bv; 
    278   return strcasecmp(ak, b->name); 
    279 } 
    280 int cmd_info_compare(const void *av, const void *bv) { 
    281   cmd_info_t *a = (cmd_info_t *)av; 
    282   cmd_info_t *b = (cmd_info_t *)bv; 
    283   return strcasecmp(a->name, b->name); 
    284317} 
    285318 
     
    292325  noit_console_state_add_cmd(s, 
    293326      NCSCMD("apply", noit_console_generic_apply, NULL, NULL)); 
     327  noit_console_state_add_cmd(s, &console_command_help); 
    294328  return s; 
    295329} 
     
    375409  exit(1); 
    376410} 
    377  
     411int 
     412noit_console_help(noit_console_closure_t ncct, int argc, char **argv, 
     413                  noit_console_state_t *dstate, void *unused) { 
     414  noit_console_state_stack_t *current; 
     415  current = ncct->state_stack; 
     416 
     417  if(!argc) { 
     418    noit_console_state_stack_t *i = current; 
     419    if(!current) { 
     420      nc_printf(ncct, "no state!\n"); 
     421      return -1; 
     422    } 
     423    for(i=current;i;i=i->last) { 
     424      if(i != current) 
     425        nc_printf(ncct, " -> '%s'\n", i->name ? i->name : "(null)"); 
     426    } 
     427    if(dstate) { 
     428      nc_printf(ncct, "= Topics =\n"); 
     429      noit_console_render_help(ncct, dstate); 
     430    } 
     431    if(current->state) { 
     432      nc_printf(ncct, "\n= Commands =\n"); 
     433      noit_console_render_help(ncct, current->state); 
     434    } 
     435    return 0; 
     436  } 
     437  else if(argc > 0) { 
     438    nc_printf(ncct, "Help for '%s':\n", argv[0]); 
     439    if(noit_console_state_delegate(ncct, argc, argv, dstate, NULL) == 0) 
     440      return 0; 
     441  } 
     442  nc_printf(ncct, "command not understood.\n"); 
     443  return -1; 
     444
    378445int 
    379446noit_console_state_pop(noit_console_closure_t ncct, int argc, char **argv, 
     
    394461  current->last = NULL; 
    395462  if(current->state->statefree) current->state->statefree(current->state); 
     463  if(current->name) free(current->name); 
    396464  free(current); 
    397465  noit_console_state_init(ncct); 
  • src/noit_module.c

    rfc9516a rdb656f3  
    88#include <stdio.h> 
    99#include <dlfcn.h> 
     10 
     11#include <libxml/parser.h> 
     12#include <libxslt/xslt.h> 
     13#include <libxslt/xsltInternals.h> 
     14#include <libxslt/transform.h> 
    1015 
    1116#include "noit_module.h" 
     
    172177} 
    173178 
     179#include "module-online.h" 
     180 
     181void noit_module_print_help(noit_console_closure_t ncct, 
     182                            noit_module_t *module, int examples) { 
     183  const char *params[3] = { NULL }; 
     184  xmlDocPtr help = NULL, output = NULL; 
     185  xmlOutputBufferPtr out; 
     186  xmlCharEncodingHandlerPtr enc; 
     187  static xmlDocPtr helpStyleDoc = NULL; 
     188  static xsltStylesheetPtr helpStyle = NULL; 
     189  if(!helpStyle) { 
     190    if(!helpStyleDoc) 
     191      helpStyleDoc = xmlParseMemory(helpStyleXML, strlen(helpStyleXML)); 
     192    if(!helpStyleDoc) { 
     193      nc_printf(ncct, "Invalid XML for style XML\n"); 
     194      return; 
     195    } 
     196    helpStyle = xsltParseStylesheetDoc(helpStyleDoc); 
     197  } 
     198  if(!helpStyle) { 
     199    nc_printf(ncct, "no available stylesheet.\n"); 
     200    return; 
     201  } 
     202  if(!module) { 
     203    nc_printf(ncct, "no module\n"); 
     204    return; 
     205  } 
     206  if(!module->hdr.xml_description) { 
     207    nc_printf(ncct, "%s is undocumented, complain to the vendor.\n", 
     208              module->hdr.name); 
     209    return; 
     210  } 
     211  help = xmlParseMemory(module->hdr.xml_description, 
     212                        strlen(module->hdr.xml_description)); 
     213  if(!help) { 
     214    nc_printf(ncct, "%s module has invalid XML documentation.\n", 
     215              module->hdr.name); 
     216    return; 
     217  } 
     218 
     219  if(examples) { 
     220    params[0] = "example"; 
     221    params[1] = "'1'"; 
     222    params[2] = NULL; 
     223  } 
     224  output = xsltApplyStylesheet(helpStyle, help, params); 
     225  if(!output) { 
     226    nc_printf(ncct, "formatting failed.\n"); 
     227    goto out; 
     228  } 
     229 
     230  enc = xmlGetCharEncodingHandler(XML_CHAR_ENCODING_UTF8); 
     231  out = xmlOutputBufferCreateIO(noit_console_write_xml, 
     232                                noit_console_close_xml, 
     233                                ncct, enc); 
     234  xmlSaveFormatFileTo(out, output, "utf8", 1); 
     235 
     236 out: 
     237  if(help) xmlFreeDoc(help); 
     238  if(output) xmlFreeDoc(output); 
     239} 
     240 
     241int 
     242noit_module_help(noit_console_closure_t ncct, 
     243                 int argc, char **argv, 
     244                 noit_console_state_t *state, void *closure) { 
     245  if(argc == 0) {  
     246    /* List modules */  
     247    noit_hash_iter iter = NOIT_HASH_ITER_ZERO; 
     248    const char *name; 
     249    int klen; 
     250    noit_image_t *hdr; 
     251 
     252    nc_printf(ncct, "= Loaders and Modules =\n"); 
     253    while(noit_hash_next(&loaders, &iter, (const char **)&name, &klen, 
     254                         (void **)&hdr)) { 
     255      nc_printf(ncct, "  %s\n", hdr->name); 
     256    } 
     257    memset(&iter, 0, sizeof(iter)); 
     258    while(noit_hash_next(&modules, &iter, (const char **)&name, &klen, 
     259                         (void **)&hdr)) { 
     260      nc_printf(ncct, "  %s\n", hdr->name); 
     261    } 
     262    return 0; 
     263  }  
     264  else if(argc == 1 ||  
     265          (argc == 2 && !strcmp(argv[1], "examples"))) {  
     266    /* help for a specific module */  
     267    noit_module_t *mod;  
     268    mod = noit_module_lookup(argv[0]);  
     269    noit_module_print_help(ncct, mod, argc == 2);  
     270    return 0;  
     271  }  
     272  nc_printf(ncct, "help module [ <modulename> [ examples ] ]\n"); 
     273  return -1; 
     274} 
     275 
    174276void noit_module_init() { 
    175277  noit_conf_section_t *sections; 
    176278  int i, cnt = 0; 
     279 
     280  noit_console_add_help("module", noit_module_help); 
    177281 
    178282  /* Load our module loaders */ 
  • src/noit_module.h

    rfc9516a rdb656f3  
    1212 
    1313#define NOIT_LOADER_MAGIC         0xA7AD7104 
    14 #define NOIT_LOADER_ABI_VERSION   3 
     14#define NOIT_LOADER_ABI_VERSION   4 
    1515 
    1616typedef struct _noit_image { 
     
    1919  char *name; 
    2020  char *description; 
     21  char *xml_description; 
    2122  int (*onload)(struct _noit_image *); 
    2223  void *opaque_handle; 
     
    4243 
    4344#define NOIT_MODULE_MAGIC         0x4017DA7A 
    44 #define NOIT_MODULE_ABI_VERSION   2 
     45#define NOIT_MODULE_ABI_VERSION   3 
    4546 
    4647typedef struct _noit_module { 
     
    8586API_EXPORT(void) 
    8687  noit_module_set_userdata(noit_module_t *mod, void *newdata); 
    87  
     88API_EXPORT(void) 
     89  noit_module_print_help(noit_console_closure_t ncct, 
     90                         noit_module_t *module, int examples); 
    8891 
    8992#endif