home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / rxdynd06.zip / watchppp.cmd < prev    next >
OS/2 REXX Batch file  |  2003-03-07  |  13KB  |  270 lines

  1. /* REXX: watch etc/ppp0.pid and if this file is changed determine */
  2. /*       actual dynamic IP.  If IP is new update DynDNS host with */
  3. /*       RXDYNDNS IFCONFIG, HOSTNAME, USERNAME, PASSWORD.  Please */
  4. /*       edit these variables below to reflect your DynDNS host.  */
  5.  
  6. /* Usage: WATCHPPP seconds|*                                      */
  7. /* where seconds (e.g. 10) is a poll interval used to check file  */
  8. /* mptn/etc/ppp0.pid for changes.  Use WATCHPPP * to (re)create a */
  9. /* WPS object for WATCHPPP 10.  Maybe add an icon to this object, */
  10. /* and/or put a shadow in the start folder <WP_START>.            */
  11.  
  12.    signal on syntax name TRAP ;  signal on novalue  name TRAP
  13.    signal on halt   name TRAP ;  signal on failure  name TRAP
  14.  
  15.    IFCONFIG = 'ppp0'             /* interface ppp0 using ppp0.pid */
  16.    HOSTNAME =  'test.dnsalias.org'
  17.    USERNAME =  'test'            /* DynDNS login for RXDYNDNS.CMD */
  18.    PASSWORD =  'test'            /* DynDNS password               */
  19.  
  20.    call UTIL 'SysSleep'          /*********************************/
  21.    NSU = IFCONFIG || '.daemon'   /* private RxQueue PPP0.daemon   */
  22.    ETC = value( 'ETC',, 'OS2ENVIRONMENT' )
  23.    ETC = ETC || '\' || IFCONFIG || '.pid'
  24.    OLD = stream( ETC, 'C', 'QUERY DATETIME' )
  25.  
  26.    EOL = x2c( 0D0A )          ;  if PROC() = 3 then EOL = x2c( 0D )
  27.    NSU = translate( NSU )     ;  if QINI() then exit TRAP( NSU )
  28.    signal on syntax name QERR ;  signal on novalue  name QERR
  29.    signal on halt   name QERR ;  signal on failure  name QERR
  30.    OIP = HOST()
  31.  
  32.    if datatype( arg( 1 ), 'W' ) = 0 then do
  33.       parse source . . NIP
  34.       NEW =               'usage:' NIP 'seconds|*'
  35.       NEW = NEW || EOL || 'checks' ETC 'and hostid'
  36.       NEW = NEW || EOL || OIP 'cyclically with specified'
  37.       NEW = NEW || EOL || 'delay. If changed and' IFCONFIG 'shows'
  38.       NEW = NEW || EOL || 'a new inet number (IP), then DynDNS'
  39.       NEW = NEW || EOL || 'host' HOSTNAME 'is updated'
  40.       NEW = NEW || EOL || 'for user' USERNAME 'with RXDYNDNS.CMD.'
  41.  
  42.       if arg( 1 ) <> '*' then exit QINI( NEW )
  43.       NEW = NEW || EOL || 'Press ENTER to (re)create WPS object:'
  44.       if QINI( NEW ) = 0 then exit 0
  45.  
  46.       exit WAIT( 'WPS object' MAKE( NSU, 10 ) 'updated, have fun' )
  47.    end
  48.  
  49.    do while POLL( arg( 1 ))
  50.       NEW = stream( ETC, 'C', 'QUERY DATETIME' )
  51.       if OLD = NEW   then  iterate     /* known OLD ppp session   */
  52.  
  53.       NIP = INET( IFCONFIG )           /* new session: get new IP */
  54.       if OIP =  NIP  then  iterate     /* still the same known IP */
  55.       if  '' =  NIP  then  iterate     /* new IP not yet known    */
  56.       OLD = NEW
  57.  
  58.       OIP = LOOK( HOSTNAME )           /* caveat: RXDYNDNS checks */
  59.       if OIP =  NIP  then  iterate     /* HOSTNAME more seriously */
  60.       if OIP =  ''   then  exit QERR( NSU 'cannot lookup' HOSTNAME )
  61.  
  62.       call RXDYNDNS IFCONFIG, HOSTNAME, USERNAME, PASSWORD
  63.       if WAIT( 'DynDNS update result' result ) = 0 then leave
  64.    end
  65.    exit QINI( NSU 'terminated' )
  66.  
  67. POLL: procedure expose NSU       /* delay using loaded SysSleep() */
  68.    if queued() > 0 then return 0 ;  signal on syntax name POLL.TRAP
  69.    call SysSleep arg( 1 )        ;  return queued() = 0
  70. POLL.TRAP:                       /* if SysSleep() lost load again */
  71.    signal on syntax name QERR    ;  call UTIL 'SysSleep'
  72.    if WAIT( NSU 'POLL error:' rc errortext( rc )) = 0 then return 0
  73.    call SysSleep arg( 1 )        ;  return queued() = 0
  74.  
  75. INET: procedure expose NSU       /* try to get new current ppp IP */
  76.    signal on error name QERR
  77.    address CMD '@ifconfig' arg( 1 ) '2>&1 | RxQueue' NSU
  78.    if queued() = 0 then exit QERR( NSU 'error: ifconfig' arg( 1 ))
  79.    if queued() = 2 then pull     /* remove 1st line for interface */
  80.    if queued() > 1 then exit QINI( NSU 'terminated' )
  81.    parse pull 'inet' IP .     ;  return strip( IP )
  82.  
  83. LOOK: procedure expose NSU       /* simple DNS lookup using host: */
  84.    signal on error name QERR
  85.    address CMD '@host' arg( 1 ) '| RxQueue' NSU
  86.    if queued() = 0 then exit QERR( NSU 'cannot use host' arg( 1 ))
  87.    if queued() > 1 then exit QINI( NSU 'terminated' )
  88.    parse pull . '=' IP        ;  return strip( IP )
  89.  
  90. HOST: procedure expose NSU       /* try to get the current hostid */
  91.    signal on error name QERR
  92.    address CMD '@hostid | RxQueue' NSU
  93.    if queued() = 0 then exit QERR( NSU 'cannot get hostid' )
  94.    if queued() > 1 then exit QINI( NSU 'terminated' )
  95.    parse pull . '=' IP        ;  return strip( IP )
  96.  
  97. QINI: procedure expose NSU       /* manage private daemon queue   */
  98.    QUE = RxQueue( 'Get' )
  99.    if QUE = NSU then do
  100.       call RxQueue 'Delete', QUE
  101.       if result <> 0
  102.          then exit TRAP( 'delete' QUE 'result' result )
  103.          else return WAIT( arg( 1 ))
  104.    end
  105.    else do forever
  106.       QUE = RxQueue( 'Create', NSU )   ;  call RxQueue 'Set'   , NSU
  107.       if QUE = NSU then return 0       ;  call RxQueue 'Delete', QUE
  108.       if result <> 0 then exit TRAP( 'delete' QUE 'result' result )
  109.       QUE = 'sent to' NSU              ;  queue QUE
  110.       if WAIT( 'termination request' queued() QUE ) = 0 then exit 0
  111.    end
  112.  
  113. /* -------------- procedures updated by REXXTRAP.KEX ------------ */
  114.  
  115. WAIT: procedure                  /* get OKay resp. CANCEL answer: */
  116.    KEY = PROC()                  ;  OUT = 'STDERR'
  117.  
  118.    select
  119.       when KEY = 1 then do       /* 1 (real) obsolete: here DOS   */
  120.          parse version KEY . .   /* REXX/Personal has no STDERR:  */
  121.          if KEY <> 'REXXSAA' then OUT = '\dev\con'
  122.       end
  123.       when KEY = 3 then do       /* 3 (PM) RxMessageBox() output  */
  124.          parse source KEY  ;  KEY = centre( KEY, 100 )   /* HACK  */
  125.          KEY = RxMessageBox( arg( 1 ), KEY, 'OKCANCEL', 'ASTERISK' )
  126.          return KEY = 1 | KEY = 6 | KEY = 8
  127.       end                        /* 0 (fullscreen) and 2 (window) */
  128.       when KEY < 4 then call UTIL 'SysGetKey'
  129.       otherwise nop              /* 4 (detached) tested in AKEY() */
  130.    end
  131.    call charout OUT, arg( 1 ) || x2c( 7 )
  132.  
  133.    do until c2d( KEY ) <> 0 & c2d( KEY ) <> 224
  134.       KEY = AKEY()
  135.    end
  136.    call lineout OUT, ''          /* hardwiring F3 '=', Alt-F4 'k' */
  137.    return KEY <> x2c( 1B ) & KEY <> '=' & KEY <> 'k'
  138.  
  139. AKEY: procedure                  /* keyboard char. input function */
  140.    KEY = PROC()
  141.    if KEY == 4          then return x2c( 1B )      /* 4: detached */
  142.    if KEY <> 1          then return SysGetKey( 'NoEcho' )
  143.    parse version KEY . .                           /* 1: DOS REXX */
  144.    if KEY == 'REXXSAA'  then return  RxGetKey( 'NoEcho' )
  145.                         else return right( INKEY(), 1 )
  146.  
  147. PROC: procedure                  /* avoid "unknown function" TRAP */
  148.    parse source OS .             /* for REXXSAA portability abuse */
  149.    if OS <> 'OS/2' then return 1 /* the now obsolete 1: real mode */
  150.  
  151.    OS = 'ProcessType'            /* assume Sys... = RxProcessType */
  152.    if RxFuncQuery( 'Sys' || OS ) = 0 then return SysProcessType()
  153.    if RxFuncAdd(   'Sys' || OS, 'RxUtils', 'Rx' || OS ) = 0 then do
  154.       signal on syntax name PROC.TRAP  ;  return SysProcessType()
  155.    end                           /* tries RxUtils only once, else */
  156. PROC.TRAP:                       /* force RexxUtil SysProcessType */
  157.    call  RxFuncDrop 'SysProcessType'   ;  signal on syntax name TRAP
  158.    call        UTIL 'SysProcessType'   ;  return SysProcessType()
  159.  
  160. MAKE: procedure                  /* recreate or update WPS object */
  161.    /* 1st arg: optional object title, default name of source      */
  162.    /* 2nd arg: optional start arg.s,  use '[txt]' if interactive  */
  163.    /* 3rd arg: optional start directory, default TMP environment  */
  164.    TMP = value( 'TMP',, 'OS2ENVIRONMENT' )
  165.    if TMP = '' then TMP = directory()
  166.    call UTIL 'SysCreateObject'      ;  call UTIL 'SysGetEA'
  167.    parse upper source . . SRC       ;  POS = lastpos( '\', SRC )
  168.    TXT = substr( SRC, POS + 1 )     ;  DIR = left( SRC, POS )
  169.    OBJ = '<' || TXT || '>'          ;  POS = lastpos( '.', TXT )
  170.    TXT = left( TXT, POS - 1 )       ;  NEW = 0
  171.  
  172.    ICO = stream( DIR || TXT || '.ICO', 'c', 'query exists' )
  173.    if ICO = '' & SysGetEA( SRC, '.ICON', 'POS' ) = 0 then do
  174.       call UTIL 'SysTempFileName'   ;  call UTIL 'SysFileDelete'
  175.       signal on notready name TRAP  ;  SET = substr( POS, 5 )
  176.       NEW = ( length( SET ) = c2d( reverse( substr( POS, 3, 2 ))))
  177.       NEW = NEW & abbrev( POS, x2c( 'F9FF' ))
  178.       if NEW then do             /* SysTempFileName error ignored */
  179.          ICO = SysTempFileName( TMP || '\TMP?????.ICO' )
  180.          call charout ICO, SET      ;  call charout ICO
  181.       end
  182.    end
  183.  
  184.    if arg( 3, 'O' ) then DIR = TMP  ;  else DIR = arg( 3 )
  185.    if arg( 1, 'E' ) then TXT = arg( 1 )
  186.  
  187.    SET = 'EXENAME=*;PARAMETERS=/C' strip( SRC arg( 2 ))
  188.    SET = SET || ';MINIMIZED=YES;PROGTYPE=PM'
  189.    if ICO <> '' then SET = SET || ';ICONFILE=' || ICO
  190.    SET = SET || ';STARTUPDIR=' || DIR || ';OBJECTID=' || OBJ || ';'
  191.  
  192.    POS = '<WP_DESKTOP>'
  193.    POS = SysCreateObject( 'WPProgram', TXT, POS, SET, 'Update' )
  194.    if NEW then call SysFileDelete ICO
  195.    if POS then return OBJ        /* ready to create shadow etc.   */
  196.           else exit TRAP( 'fatal - cannot update' OBJ )
  197.  
  198. UTIL: procedure                  /* load necessary RexxUtil entry */
  199.    if RxFuncQuery(  arg( 1 )) then
  200.       if RxFuncAdd( arg( 1 ), 'RexxUtil', arg( 1 )) then
  201.          exit TRAP( "can't add RexxUtil"  arg( 1 ))
  202.    return 0
  203.  
  204. QERR:                            /* delete queue and handle TRAP: */
  205.    signal on novalue name TRAP   ;  signal on syntax name TRAP
  206.    signal on failure name TRAP   ;  signal on halt   name TRAP
  207.    QERR = RxQueue( 'Delete', RxQueue( 'Get' ))
  208.  
  209. TRAP:                            /* select REXX exception handler */
  210.    call trace 'O' ;  trace N           /* don't trace interactive */
  211.    parse source TRAP                   /* source on separate line */
  212.    TRAP = x2c( 0D ) || right( '+++', 10 ) TRAP || x2c( 0D0A )
  213.    TRAP = TRAP || right( '+++', 10 )   /* = standard trace prefix */
  214.    TRAP = TRAP strip( condition( 'c' ) 'trap:' condition( 'd' ))
  215.    select
  216.       when wordpos( condition( 'c' ), 'ERROR FAILURE' ) > 0 then do
  217.          if condition( 'd' ) > ''      /* need an additional line */
  218.             then TRAP = TRAP || x2c( 0D0A ) || right( '+++', 10 )
  219.          TRAP = TRAP '(RC' rc || ')'   /* any system error codes  */
  220.          if condition( 'c' ) = 'FAILURE' then rc = -3
  221.       end
  222.       when wordpos( condition( 'c' ), 'HALT SYNTAX'   ) > 0 then do
  223.          if condition( 'c' ) = 'HALT' then rc = 4
  224.          if condition( 'd' ) > '' & condition( 'd' ) <> rc then do
  225.             if condition( 'd' ) <> errortext( rc ) then do
  226.                TRAP = TRAP || x2c( 0D0A ) || right( '+++', 10 )
  227.                TRAP = TRAP errortext( rc )
  228.             end                        /* future condition( 'd' ) */
  229.          end                           /* may use errortext( rc ) */
  230.          else  TRAP = TRAP errortext( rc )
  231.          rc = -rc                      /* rc < 0: REXX error code */
  232.       end
  233.       when condition( 'c' ) = 'NOVALUE'  then rc = -2 /* dubious  */
  234.       when condition( 'c' ) = 'NOTREADY' then rc = -1 /* dubious  */
  235.       otherwise                        /* force non-zero whole rc */
  236.          if datatype( value( 'RC' ), 'W' ) = 0 then rc = 1
  237.          if rc = 0                             then rc = 1
  238.          if condition() = '' then TRAP = TRAP arg( 1 )
  239.    end                                 /* direct: TRAP( message ) */
  240.  
  241.    TRAP = TRAP || x2c( 0D0A ) || format( sigl, 6 )
  242.    signal on syntax name TRAP.SIGL     /* throw syntax error 3... */
  243.    if 0 < sigl & sigl <= sourceline()  /* if no handle for source */
  244.       then TRAP = TRAP '*-*' strip( sourceline( sigl ))
  245.       else TRAP = TRAP '+++ (source line unavailable)'
  246. TRAP.SIGL:                             /* ...catch syntax error 3 */
  247.    if abbrev( right( TRAP, 2 + 6 ), x2c( 0D0A )) then do
  248.       TRAP = TRAP '+++ (source line unreadable)'   ;  rc = -rc
  249.    end
  250.    select
  251.       when 0 then do                   /* in pipes STDERR: output */
  252.          parse version TRAP.REXX . .   /* REXX/Personal: \dev\con */
  253.          signal on syntax name TRAP.FAIL
  254.          if TRAP.REXX = 'REXXSAA'      /* fails if no more handle */
  255.             then call lineout 'STDERR'  , TRAP
  256.             else call lineout '\dev\con', TRAP
  257.       end
  258.       when 1 then do                   /* OS/2 PM: RxMessageBox() */
  259.          signal on syntax name TRAP.FAIL
  260.          call RxMessageBox ,           /* fails if not in PMREXX  */
  261.             translate( TRAP, ' ', x2c( 0D )), , 'CANCEL', 'WARNING'
  262.       end                              /* replace any CR by blank */
  263.       otherwise   say TRAP ; trace ?L  /* interactive Label trace */
  264.    end
  265.  
  266.    if condition() = 'SIGNAL' then signal TRAP.EXIT
  267. TRAP.CALL:  return rc                  /* continue after CALL ON  */
  268. TRAP.FAIL:  say TRAP ;  rc = 0 - rc    /* force TRAP error output */
  269. TRAP.EXIT:  exit   rc                  /* exit for any SIGNAL ON  */
  270.