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

操作系统开发

开发平台:

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