WEBPART.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:14k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <rtos.h>
  2. #include <net.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include <graph.h>
  7. #include <httpd.h>
  8. #include <time.h>
  9. #include <inifile.h>
  10. #include <syslog.h>
  11. #include <smtpcli.h>
  12. #include <snmp.h>
  13. #include <stdlib.h>
  14. extern char *emailuserid;
  15. extern char *syslogname;
  16. extern DWORD oursysloghost;
  17. extern char *snmptrapname;
  18. extern DWORD snmptraphost;
  19. extern char ftpdpassword[];
  20. extern char *loginuserid;   /* for web */
  21. extern char *loginpassword;
  22. /***************************************************************************
  23.  * general support code                                                    *
  24.  ***************************************************************************/
  25. void replacestr( char *src, char **dest )
  26. {
  27.     char *p;
  28.     /* trim start and end */
  29.     while ( isspace( *src ) )
  30.         src++;
  31.     for ( p = strchr( src, 0 ) ; p != src ; p-- ) {
  32.         if ( !isspace( *p ) ) break;
  33.         *p = 0;
  34.     }
  35.     if ( *dest ) kfree( *dest );
  36.     if ( *src ) *dest = kstrdup( src );
  37.     else *dest = NULL;
  38. }
  39. /***************************************************************************
  40.  * Code to generate graphs                                                 *
  41.  ***************************************************************************/
  42. /*
  43.  * Sample Data Collector
  44.  *
  45.  * This code is mostly in charge of aging the data history
  46.  * every 5 seconds.
  47.  *
  48.  * It is placed in a separate thread so it is easy to read
  49.  */
  50. #define POINTS 20
  51. static int last_n_points[ POINTS ];    /* this is the series over time */
  52. crit_x *collector_cs;
  53. #pragma argsused
  54. void collector( DWORD param )
  55. {
  56.     int i;
  57.     int bytes = 0;
  58.     /* clear history */
  59.     memset( last_n_points, 0, sizeof( last_n_points ));
  60.     /* we will use a critical section so that collector and
  61.      * reporter are not interrupting each other
  62.      */
  63.     collector_cs = cs_alloc();
  64.     do {
  65.         rt_sleep( 500 );    /* collect data for 0.5 seconds */
  66.         /* react to that collected data
  67.          * start by locking it
  68.          */
  69.         cs_enter( collector_cs );
  70.         /* remove the last one from history */
  71.         for ( i = 0 ; i < POINTS - 2 ; ++i )
  72.             last_n_points[ i ] = last_n_points[ i + 1 ];
  73.         /* and include the most recent */
  74.         last_n_points[ POINTS - 2 ] = bytes;
  75.         /* and reset the input to 0 for next round */
  76.         bytes += 1;
  77.         if ( bytes == 5 ) bytes = 0;
  78.         cs_exit( collector_cs );
  79.     } while ( 1 );
  80. }
  81. /* graph code */
  82. crit_x *graph_cs = NULL;
  83. void web_graph( tcp_Socket *s )
  84. {
  85.     graph_x *g;
  86.     kblock();
  87.     if ( graph_cs == NULL )
  88.         graph_cs = cs_alloc();
  89.     kunblock();
  90.     cs_enter( graph_cs );
  91. #define GRWIDTH 200
  92. #define GRHEIGHT 50
  93.     g = gr_alloc( GRWIDTH, GRHEIGHT);
  94.     if ( g != NULL ) {
  95.         gr_background( g, 7 );
  96.         /* put a title on the graph */
  97.         gr_text_at( g , "Bytes per 5 second internval", GRWIDTH/5, GRHEIGHT - 10, 0 );
  98.         /* we need to lock the data for this time */
  99.         cs_enter( collector_cs );
  100.         gr_linegraph( g, POINTS, last_n_points, NULL, NULL, 0, 1 );
  101.         /* we don't need the lock on the data anymore */
  102.         cs_exit( collector_cs );
  103.         sock_mode( s, TCP_MODE_BINARY );
  104.         sock_mode( s, TCP_MODE_BINARY | TCP_MODE_NONAGLE );
  105.         gr_gif( s, g );     /* write the graph out as a GIF file */
  106.         gr_free( g );
  107.     }
  108.     cs_exit( graph_cs );
  109. }
  110. /***************************************************************************
  111.  * Server Side Include Code - answer details from SHTML web pages          *
  112.  ***************************************************************************/
  113. void sh_randvalue( tcp_Socket *s, stringlist *unused )
  114. {
  115.     char buffer[64];
  116.     sprintf( buffer, "%lu", (rand() * 25L) / RAND_MAX );
  117.     sock_write( s, buffer, strlen( buffer ) );
  118. }
  119. #pragma argsused
  120. void sh_testsyslog( tcp_Socket *s, stringlist *unused )
  121. {
  122.     if  (oursysloghost == 0 ) sock_puts( s, "not sent, no syslog host defined");
  123.     else {
  124.         syslog( oursysloghost, LOG_DAEMON, LOG_ERR, "user requested test message");
  125.         sock_puts( s, "sent");
  126.     }
  127. }
  128. #pragma argsused
  129. void sh_testemail( tcp_Socket *s, stringlist *unused )
  130. {
  131.     extern char *emailuserid;
  132.     char buffer[128];
  133.     if  (emailuserid == NULL ) sock_puts( s, "not sent, no email userid defined");
  134.     else {
  135.         smtp_client( 0, "thisbox", emailuserid, "AUTOSEND: TermServer test message",
  136.             "Client requested test Email message be sent");
  137.         sprintf( buffer, "Sent to %s, as long as SMTP.GATEWAY is defined in TCP.CFG", emailuserid );
  138.         sock_puts( s, buffer);
  139.     }
  140. }
  141. #pragma argsused
  142. void sh_header( tcp_Socket *s, stringlist *cookies )
  143. {
  144.     http_dump( s, "web", "header","htm");
  145. }
  146. #pragma argsused
  147. void sh_tail( tcp_Socket *s, stringlist *cookies )
  148. {
  149.     http_dump( s, "web", "tail","htm");
  150. }
  151. #pragma argsused
  152. void sh_uptime( tcp_Socket *s, stringlist *cookies )
  153. {
  154.     char buffer[ 128 ];
  155.     DWORD secs, days, hours;
  156.     /* we can get this from the kernel clock */
  157.     secs = ktime / 1000;
  158.     days = secs / (24*60*60L);
  159.     if ( ktime2 > 0 ) {
  160.         days = (ktime2 * 50) + days;
  161.         sprintf( buffer, "%lu months", days / 30 );
  162.     } else {
  163.         secs = secs - (days * 24*60*60L);
  164.         sprintf( buffer, " %lu days, %lu seconds ", days, secs );
  165.     }
  166.     sock_puts( s, buffer );
  167. }
  168. #pragma argsused
  169. void sh_memfree( tcp_Socket *s, stringlist *cookies )
  170. {
  171.     char buffer[ 128 ];
  172.     sprintf( buffer , " %lu kB ", kcorefree() / 1024 );
  173.     sock_puts( s, buffer );
  174. }
  175. #pragma argsused
  176. void sh_sessions( tcp_Socket *s, stringlist *cookies )
  177. {
  178.     extern WORD inuse[];
  179.     int i, count = 0;
  180.     char buffer[ 128];
  181.     for ( i = 1 ; i < 5 ; ++i ) {
  182.         sprintf( buffer, "TELNET session %u: %s<br>", i, inuse[i] ? "in use" : "available");
  183.         sock_puts( s, buffer );
  184.         count++;
  185.     }
  186.     if ( count == 0 ) sock_puts( s, "no telnet sessions open");
  187. }
  188. #pragma argsused
  189. void sh_smtp( tcp_Socket *s, stringlist *cookies )
  190. {
  191.     sock_puts( s, emailuserid ? emailuserid : "" );
  192. }
  193. #pragma argsused
  194. void sh_syslog( tcp_Socket *s, stringlist *cookies )
  195. {
  196.     sock_puts( s, syslogname ? syslogname : "");
  197. }
  198. #pragma argsused
  199. void sh_ftppass( tcp_Socket *s, stringlist *cookies )
  200. {
  201.     sock_puts( s, ftpdpassword );
  202. }
  203. #pragma argsused
  204. void sh_snmp( tcp_Socket *s, stringlist *cookies )
  205. {
  206.     sock_puts( s, snmptrapname ? snmptrapname : "");
  207. }
  208. void sh_testsnmp( tcp_Socket *s, stringlist *unused )
  209. {
  210.     char *community = "public";
  211.     DWORD agent = 0;
  212.     char *entOID = "1.3.6.1";
  213.     char *fromOID = "1.3.6.1.2.1";
  214.     int genTrapType = SNMP_TRAP_WARMSTART; // generic trap type, 1-6 see RFC 1157
  215.     int specTrapType = 0;   // specific trap type, 0 if using genTrapType
  216.     int type = SNMP_OCTETSTR;
  217.     char *value = "user requested SNMP trap";
  218.     if  (snmptraphost == 0 ) sock_puts( s, "not sent, no SNMP trap host defined");
  219.     else {
  220.         snmp_trap( snmptraphost, community, entOID, fromOID, agent,
  221.             genTrapType, specTrapType,
  222.             type, value, strlen( value ) );
  223.         sock_puts( s, "sent");
  224.     }
  225. }
  226. static ssi_type ssi_list[] =
  227.     {   { "header",   sh_header },
  228.         { "tail",     sh_tail },
  229.         { "uptime",   sh_uptime },
  230.         { "memfree",  sh_memfree },
  231.         { "sessions", sh_sessions },
  232.         { "smtp",     sh_smtp },
  233.         { "trap",     sh_snmp },
  234.         { "syslog",   sh_syslog },
  235.         { "ftppass",  sh_ftppass },
  236.         { "RandValue", sh_randvalue },
  237.         { "testsyslog", sh_testsyslog },
  238.         { "testemail", sh_testemail },
  239.         { "testsnmp", sh_testsnmp },
  240.         NULL };
  241. /***************************************************************************
  242.  * Code to handle user authentication                                      *
  243.  * It works by creating a web cookie with a special ticket.  The ticket    *
  244.  * string is regenerated at each reboot.                                   *
  245.  * odds of a guess are 1/16^63 or one in 2^252                             *
  246.  ***************************************************************************/
  247. char ticket[ 64 ] = "";
  248. void init_ticket( void )
  249. {
  250.     int i;
  251.     /* dream up a ticket */
  252.     randomize();
  253.     for ( i = 0 ; i < sizeof( ticket ) - 1 ; ++i )
  254.         ticket[i] = 'A'+ rand()/(RAND_MAX/16);
  255.     ticket[i] = 0;
  256. }
  257. #pragma startup init_ticket 100
  258. void web_ticket( tcp_Socket *s , char *userid)
  259. {
  260.     char buffer[ 128 ];
  261.     sprintf( buffer, "Set-Cookie: ticket=%s", ticket);
  262.     sock_puts( s, buffer );
  263.     sprintf( buffer, "Set-Cookie: userid=%s", userid);
  264.     sock_puts( s, buffer );
  265. }
  266. /* routine to test if userid is logged in already */
  267. int web_trusted( tcp_Socket *s, stringlist *cookies )
  268. {
  269.     char *p, *q;
  270.     int success = 0;
  271.     if ( strlst_findfirst( cookies, "ticket", NULL, &q ) != NULL )
  272.         if ( *ticket != 0 )
  273.             if ( !strcmp( ticket, q ))
  274.                 success = 1;
  275.     if ( success == 0 )
  276.         http_shtml( s, "web", "nologged","sht", ssi_list, cookies );
  277.     return( success );
  278. }
  279. void do_login( tcp_Socket *s, stringlist *cookies )
  280. {
  281.     stringlist *sl;
  282.     char *p, *userid, *password;
  283.     int success = 0;
  284.     /* need to get userid + password */
  285.     sl = cgi_getstrings( s );
  286.     /* look for a valid userid and password */
  287.     if ( NULL != strlst_findfirst( sl, "Userid", NULL, &userid ) ) {
  288.         if (  strlst_findfirst( sl, "Password", NULL, &password ) != NULL ) {
  289.             /* compare these passwords to known ones */
  290.             if ( !strcmp( loginuserid,  userid )) {
  291.                 if ( !strcmp( loginpassword, password ))
  292.                     success = 1;
  293.             }
  294.         }
  295.     }
  296.     /* important, free strings !!! */
  297.     cgi_freestrings( sl );
  298.     /* report success or failure to userid */
  299.     if ( success ) {
  300.         web_ticket( s, userid );    /* grant a ticket to allow access to functions */
  301.         http_shtml( s, "web", "logged","sht", ssi_list, cookies );
  302.     } else {
  303.         http_shtml( s, "web", "nologged","sht", ssi_list, cookies );
  304.     }
  305. }
  306. /*
  307.  * web_logout - erase the password cookie and go back to login screen
  308.  */
  309. void do_logout( tcp_Socket *s, stringlist *cookies )
  310. {
  311.     sock_puts( s, "Set-Cookie: ticket=" );
  312.     sock_puts( s, "Set-Cookie: userid=" );
  313.     http_shtml( s, "web", "unlogged","sht", ssi_list, cookies );
  314. }
  315. /***************************************************************************
  316.  * Code to handle changes to system settings                               *
  317.  ***************************************************************************/
  318. void do_set( tcp_Socket *s, stringlist *cookies )
  319. {
  320.     stringlist *sl;
  321.     char *p, *q;
  322.     if ( web_trusted( s, cookies )) {
  323.         /* need to get userid + password */
  324.         sl = cgi_getstrings( s );
  325.         /* replace local contents, and save in config file */
  326.         if ( (p = strlst_findfirst( sl, "smtp", NULL, &q )) != NULL ) {
  327.             replacestr( q, &emailuserid );
  328.             SetIniString( "tcp.cfg","settings","email.notify",q );
  329.         }
  330.         if ( (p = strlst_findfirst( sl, "snmp", NULL, &q )) != NULL ) {
  331.             SetIniString("tcp.cfg","settings","snmptrap.host",q);
  332.             replacestr( q, &snmptrapname );
  333.             snmptraphost = resolve( snmptrapname );
  334.         }
  335.         if ( (p = strlst_findfirst( sl, "syslog", NULL, &q )) != NULL ) {
  336.             SetIniString( "tcp.cfg","settings","syslog.host",q );
  337.             replacestr( q, &syslogname);
  338.             oursysloghost = resolve( syslogname );
  339.         }
  340.         if ( (p = strlst_findfirst( sl, "ftppass", NULL, &q )) != NULL ) {
  341.             SetIniString( "tcp.cfg","settings","ftpd.password",q );
  342.             strncpy( ftpdpassword, q, 64 );
  343.             ftpdpassword[64] = 0;
  344.         }
  345.         /* important, free strings !!! */
  346.         cgi_freestrings( sl );
  347.         http_shtml( s, "web", "settings","sht", ssi_list, cookies );
  348.     }
  349. }
  350. /***************************************************************************
  351.  * Code to handle all web requests                                         *
  352.  ***************************************************************************/
  353. /*
  354.  * - the web server calls this proc for each web request
  355.  * - it is called in the context of *one* of the HTTPD threads,
  356.  *   though which is not known or important
  357.  * - multiple threads may be in the same proc at the same time
  358.  */
  359. #pragma argsused
  360. void user_proc( tcp_Socket *s, char *cmd, char *file, char *ext, stringlist *cookies )
  361. {
  362.     /* prepare output */
  363.     if ( !stricmp( ext, "gif"))  
  364.     {
  365.         sock_puts( s, "Content-Type: image/gif");
  366.         if ( !stricmp( file, "/graph")) 
  367.         {
  368.             /* short expiry (1 sec) so it re-loads */
  369.             html_datestring( s, "Expires: content="%s"nr", 1);
  370.             web_graph( s );
  371.         }
  372.         else 
  373.         {
  374.             sock_puts(s, "");   /* need a blank line */
  375.             http_dump( s, "web", file,ext );
  376.         }
  377.     } 
  378.     else if ( !stricmp( ext, "cgi" )) 
  379.     {
  380.         /* do userid/password validation */
  381.         if ( !stricmp( file, "/dologin" ))
  382.             do_login( s, cookies );
  383.         if ( !stricmp( file, "/dologout" ))
  384.             do_logout( s, cookies );
  385.         if ( !stricmp( file, "/set" ))
  386.             do_set( s, cookies );
  387.     } 
  388.     else 
  389.     {
  390.         /* non gif stuff */
  391.         if ( !stricmp( file, "/" ))
  392.             http_shtml( s, "web", "index","sht", ssi_list, cookies );
  393.         else if ( !stricmp( file, "/login" ))
  394.             http_shtml( s, "web", "login","sht", ssi_list, cookies );
  395.         /* remaining pages only if trusted */
  396.         else if ( web_trusted( s, cookies )) 
  397.         {
  398.          if ( !stricmp(ext,"SHT"))
  399.                  http_shtml( s, "web", file, ext, ssi_list, cookies );
  400.              else 
  401.         {
  402.                  sock_puts(s, "");       /* need a blank line */
  403.              http_dump( s, "web", file, ext );
  404.          }
  405.         }
  406.     }
  407. }