home *** CD-ROM | disk | FTP | other *** search
/ PC World 2004 April / PCWorld_2004-04_cd.bin / software / temacd / remotany / RemotelyAnywhere.msi / Ping.sma < prev    next >
Text File  |  2003-08-19  |  6KB  |  193 lines

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //                                                                            //
  3. // RemotelyAnywhere Sample 'SMALL' Scripts                                    //
  4. //                                                                            //
  5. // RemotelyAnywhere provides a mechanism for scripting via a built-in         //
  6. // language. The language is called Small, and more information about         //
  7. // it can be found at http://compuphase.com/small.htm.                        //
  8. //                                                                            //
  9. // Before you use these sample scripts, you should tailor their               //
  10. // behavior to better suit your configuration and your needs.                 //
  11. //                                                                            //
  12. // THIS SOFTWARE IS PROVIDED BY 3AM LABS LTD ``AS IS'' AND                    //
  13. // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE      //
  14. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE //
  15. // ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE    //
  16. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL //
  17. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS    //
  18. // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      //
  19. // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT //
  20. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  //
  21. // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF     //
  22. // SUCH DAMAGE.                                                               //
  23. //                                                                            //
  24. ////////////////////////////////////////////////////////////////////////////////
  25.  
  26. //
  27. // Ping.sma
  28. //
  29. // Sample script to execute the built-in ping command and parse its output
  30. // Returns values:
  31. //     0 - at least one of the last MAXFAULT pings' round trip time was
  32. //         smaller than MAXPING
  33. //    >0 - the last MAXFAULT pings were unsuccessful (lost or gt. MAXPING)
  34. //           the actual return value is the maximum round trip time
  35. //           (or LOSTPACKET, if there were lost packets)
  36. //    <0 - an error has occurred
  37. //
  38.  
  39.  
  40. #include <ra>
  41.  
  42. // maximum number of consecutively failed packets
  43. #define MAXFAULT 5
  44.  
  45. // maximum round trip time (in milliseconds)
  46. #define MAXPING 500
  47.  
  48. // round trip time to indicate a lost packet (must be greater than MAXPING)
  49. #define LOSTPACKET 1000000
  50.  
  51. // file name to store status
  52. new STATFILE[] = "%Temp%\\ra_ping.tmp"
  53.  
  54. // log round-trip time of every ping attempt?
  55. new log = true;
  56.  
  57. // log file base name (date and .csv will be appended, for example: C:\Ping2003-08-15.csv
  58. // every line in the log will be formatted like:
  59. // 2003-08-15 21:37:22, 123
  60. // which means that the round-trip time of the ping request at 2003-08-15 21:37:22 were 123 ms
  61. // if the request has timed out, a value of -1 will be written
  62. new LOGFILE[] = "%SystemDrive%\\Ping"
  63.  
  64. public main()
  65. {
  66.     new html;
  67.     new output[1024], num[8];
  68.     new start, end, lost, trip;
  69.     new stats[MAXFAULT], i;
  70.     new f;
  71.     new fail, maxping;
  72.  
  73.     // call ping with 10 seconds timeout
  74.     // replace localhost with the name or IP address of the computer to ping
  75.     if (!raExecuteCmd("ping -n 1 localhost", output, 1024, 10000))
  76.         return -1;
  77.  
  78.     html = htmlBeginOutput();
  79.  
  80.     if (html) {
  81.             htmlWrite("Ping output:<br></center><pre>");
  82.         htmlWrite(output);
  83.             htmlWrite("</pre><center><br>");
  84.     }
  85.  
  86.     // find "Packets: ..." line
  87.     start = strstr(output, "Packets:");
  88.     if (start == -1) return -2;
  89.  
  90.     // extract and convert num of lost packets
  91.     start = strstr(output, "Lost = ", start);
  92.     if (start == -1) return -3;
  93.  
  94.     start += 7; // length of "Lost = "
  95.     end = strstr(output, " (", start);
  96.     if (end == -1) return -4;
  97.     
  98.     strmid(num, output, start, end - start);
  99.     lost = atoi(num);
  100.  
  101.     if (html) {
  102.         htmlWrite("lost = ");
  103.         htmlWrite(num);
  104.         htmlBR();
  105.     }
  106.  
  107.     if (lost) {
  108.         // the packet has been lost
  109.         trip = LOSTPACKET;
  110.     } else {
  111.         // extract and convert round trip time
  112.         start = strstr(output, "time=");
  113.         if (start == -1) {
  114.             start = strstr(output, "time<");
  115.             if (start == -1) return -5;
  116.         }
  117.  
  118.         start += 5; // length of "time="
  119.         end = strstr(output, "ms", start);
  120.         if (end == -1) return -6;
  121.         
  122.         strmid(num, output, start, end - start);
  123.         trip = atoi(num);
  124.  
  125.         if (html) {
  126.             htmlWrite("time = ");
  127.             htmlWrite(num);
  128.             htmlWrite("ms<br>");
  129.         }
  130.     }
  131.  
  132.     // load status file (does not exist: first run or failure)
  133.     for (i = 0; i < MAXFAULT; i++)
  134.         stats[i] = 0;
  135.  
  136.     f = fopen(STATFILE, FILE_READ);
  137.     if (f != 0) {
  138.         fread(f, stats, MAXFAULT * 4);
  139.         fclose(f);
  140.     }
  141.  
  142.     // step values
  143.     for (i = 1; i < MAXFAULT; i++)
  144.         stats[i - 1] = stats[i];
  145.     stats[MAXFAULT - 1] = trip;
  146.  
  147.     // write status file
  148.     f = fopen(STATFILE, FILE_WRITE);
  149.     if (f == 0) return -10;
  150.  
  151.     fwrite(f, stats, MAXFAULT * 4);
  152.     fclose(f);
  153.  
  154.     // determine return value
  155.     fail = 1;
  156.     maxping = 0;
  157.  
  158.     for (i = 0; i < MAXFAULT; i++) {
  159.         if (stats[i] < MAXPING) {
  160.             fail = 0;
  161.             break;
  162.         }
  163.  
  164.         if (maxping < stats[i])
  165.             maxping = stats[i];
  166.     }
  167.  
  168.     if (html) htmlEndOutput();
  169.     
  170.     // write log
  171.     if (log) {
  172.         new name[256];
  173.         new msg[256];
  174.         new msglen;
  175.         
  176.         // format file name
  177.         new t = raGetTime();
  178.         sprintf(name, "%s%Y.csv", LOGFILE, t);
  179.         
  180.         f = fopen(name, FILE_APPEND);
  181.         if (f != 0) {
  182.             // format and write line
  183.             msglen = sprintf(msg, "%Y %t, %d\r\n", t, t, trip == LOSTPACKET ? -1 : trip);
  184.             strize(msg);
  185.             
  186.             fwrite(f, msg, msglen);
  187.             fclose(f);
  188.         }
  189.     }
  190.  
  191.     return (fail ? maxping : 0);
  192. }
  193.