home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #3 / amigamamagazinepolishissue1998.iso / bazy / ax / rexx / ftp_ncftp.ax < prev    next >
Text File  |  1997-10-04  |  9KB  |  376 lines

  1. /*
  2.  * Ax ARexx-FTP interface script
  3.  * FTP client: ncFTP
  4.  * $VER: FTP_ncFTP.ax 1.0 (6.12.96)
  5.  *
  6.  * Version 1.0
  7.  * by Paul A. Schifferer
  8.  * Copyright 1996 © Isengard Developments
  9.  *
  10.  * This script is freely distributable and modifiable.  You are authorized to
  11.  * modify it to suit your needs.  Isengard Developments makes no warranty,
  12.  * express or implied, for its usability or reliability in its original or
  13.  * modified form.
  14.  *
  15.  * This script takes an optional list of files to retrieve with the FTP client
  16.  * program noted above.  If 'files' aren't specified on the command line, the
  17.  * script will attempt to interface with Ax, using the ARexx port name "AXFTP"
  18.  * to get files.  Alternatively, 'files' can be "LIST=filename", which
  19.  * specifies the list of files to use (see below).  If files are specified on
  20.  * the command line for this script, then the first parameter must be the site
  21.  * name, the second the base directory, and all subsequent parameters are
  22.  * files in the form of 'path/filename' (relative to the base path).
  23.  *
  24.  * The file list is in the following format:
  25.  *
  26.  * The first line is the site from which to retrieve the files.  The second
  27.  * line is the base directory to use, e.g., '/pub/aminet', without the
  28.  * trailing slash.  This dir should always be an absolute path, i.e., with
  29.  * the beginning slash.
  30.  *
  31.  * All subsequent lines are files to retrieve in the form of 'path/filename',
  32.  * e.g., "biz/dbase/Ax.lha".  'path' need not be specified, if the file is
  33.  * located in the base directory.  Note that all paths should be specified
  34.  * relative to the base directory, but this is not a requirement.  Absolute
  35.  * pathnames may be used.
  36.  *
  37.  * A line with three hashes ('###') ends the filelist.  Everything thereafter
  38.  * is ignored.
  39.  */
  40.  
  41. options results
  42. signal on syntax
  43. signal on error
  44.  
  45. parse arg files
  46.  
  47. /*
  48.  * Is Ax running?
  49.  */
  50. if (length(files) = 0) & ~show('P',"AX") then do
  51.   say "Ax must be running to use this script!"
  52.   exit 20
  53.   end
  54.  
  55. /*
  56.  * Set up some variables.
  57.  */
  58. clientname = "ncFTP"
  59. scriptname = "FTP_"clientname".ax"
  60. cmdfile = "T:"clientname"_"pragma('I')
  61. clientpath = "AmiTCP:bin/ncFTP"
  62. clientopts = "<"cmdfile
  63. clientport = ""
  64. ftpport = ""
  65.  
  66. /*
  67.  * Command variables.
  68.  *
  69.  * The following variables are commands that would be issued to the FTP client
  70.  * program.  The construct is simple:  "command parameter options".  Place
  71.  * the client's command portion in the variable <a-cmd>cmd, where <a-cmd> is
  72.  * the type of command.  This script will place after the command any parameters
  73.  * that are necessary.  If the command has options to be specified, place them
  74.  * in the variable <a-cmd>opts.  These will be placed at the end of the command,
  75.  * after the parameters.
  76.  *
  77.  * For example, the "GET" command for DaFTP allows you to specify the transfer
  78.  * mode.  To set up this command, you would put "GET" in the variable 'getcmd',
  79.  * and "BINARY" in the variable 'getopts'.  When the command is issued, it
  80.  * will be sent to DaFTP as "GET <filename> BINARY".
  81.  *
  82.  * It's really very simple.  If you are having problems with it, just send me
  83.  * e-mail <gandalf@hughes.net>, and we'll work it out, okay?
  84.  */
  85. sitecmd = "open -a"
  86. siteopts = ""
  87. connectcmd = ""
  88. connectopts = ""
  89. portcmd = ""
  90. portopts = ""
  91. binarycmd = "binary"
  92. binaryopts = ""
  93. cdcmd = "cd"
  94. cdopts = ""
  95. lcdcmd = "lcd"
  96. lcdopts = ""
  97. getcmd = "get"
  98. getopts = ""
  99. quitcmd = "quit"
  100. quitopts = ""
  101.  
  102. /*
  103.  * Check if environment var for FTPCLIENT is set and use it.  The first line
  104.  * in the var would be the full path of the FTP client to use.  The second
  105.  * line, which is optional, specifies any options to use on the command line
  106.  * when starting the client program.
  107.  */
  108. if exists("ENV:FTPCLIENT") then do
  109.   if open('fc',"ENV:FTPCLIENT",'R') then do
  110.     line = strip(readln('fc'))
  111.     if length(line) > 0 then clientpath = line
  112.     line = strip(readln('fc'))
  113.     if length(line) > 0 then clientopts = line
  114.     end
  115.   call close('fc')
  116.   end
  117.  
  118. /*
  119.  * Tell Ax to start FTP thread, if not running.
  120.  */
  121. address AX
  122. "StartFTP"
  123. if result = "0" then do
  124.   say scriptname": Unable to start Ax's FTP thread!"
  125.   exit 10
  126.   end
  127. call time('R')
  128. do forever
  129.   if show('P',"AXFTP") then leave
  130.   call Delay(250)
  131.   if time('E') > 120 then do
  132.     say scriptname": Timeout waiting for port 'AXFTP'!"
  133.     exit 10
  134.     end
  135.   end
  136.  
  137. /*
  138.  * Get site name & base dir.
  139.  */
  140. address AXFTP
  141. "Site"
  142. site = result
  143. "BaseDir"
  144. basedir = result
  145. "DownloadDir"
  146. dldir = result
  147.  
  148. /*
  149.  * Reset file list.
  150.  */
  151. "ResetFileList"
  152.  
  153. /*
  154.  * Main file retrieval loop.
  155.  */
  156. do forever
  157.  
  158.   /*
  159.    * Open the command file.
  160.    */
  161.   if ~open('cf',cmdfile,'W') then do
  162.     say scriptname": Unable to open command file '"cmdfile"' for writing!"
  163.     address AX "ErrorReq" scriptname": Unable to open command file '"cmdfile"' for writing!"
  164.     address AXFTP "Status" scriptname": Unable to open command file '"cmdfile"' for writing!"
  165.     exit 10
  166.     end
  167.  
  168.   /*
  169.    * Set up port #.
  170.    */
  171.   if length(ftpport) > 0 then do
  172.     call writeln('cf',portcmd ftpport portopts)
  173.     end
  174.  
  175.   /*
  176.    * Connect to site.
  177.    */
  178.   call writeln('cf',sitecmd site siteopts)
  179.  
  180.   /*
  181.    * Set transfer mode.
  182.    */
  183.   if length(binarycmd) > 0 then do
  184.     call writeln('cf',binarycmd binaryopts)
  185.     end
  186.  
  187.   /*
  188.    * Set local directory for downloads.
  189.    */
  190.   if length(lcdcmd) > 0 then do
  191.     call writeln('cf',lcdcmd dldir lcdopts)
  192.     end
  193.  
  194.   /*
  195.    * Were files or a filelist specified?
  196.    */
  197.   filelist = ""
  198.   if length(files) > 0 then do
  199.     if upper(substr(files,1,5)) = "LIST=" then do
  200.       filelist = word(substr(files,6),1)
  201.       c = usefilelist(filelist)
  202.       if c ~= 0 then exit c
  203.       signal doit
  204.       end
  205.     else do
  206.       c = usefiles(files)
  207.       if c ~= 0 then exit c
  208.       signal doit
  209.       end
  210.     end
  211.  
  212.   /*
  213.    * Grab the next file.
  214.    */
  215.   "GetFilename"
  216.   file = result
  217.   if file = "" then leave
  218.   "GetPath ABSOLUTE"
  219.   path = result
  220.  
  221.   if path ~= lastpath then do
  222.     call writeln('cf',cdcmd path cdopts)
  223.     lastpath = path
  224.     end
  225.   call writeln('cf',getcmd file getopts)
  226.  
  227.   /*
  228.    * Tell FTP client to shut down.
  229.    */
  230.   if length(quitcmd) > 0 then do
  231.     call writeln('cf',quitcmd quitopts)
  232.     end
  233.  
  234.   /*
  235.    * Close the command file.
  236.    */
  237.   call close('cf')
  238.  
  239.   /*
  240.    * Start FTP client.
  241.    */
  242.   "Status Retrieving '"file"'..."
  243.   address command clientpath clientopts
  244.  
  245.   /*
  246.    * Set the downloaded flag on the file and remove
  247.    * it from the queue.
  248.    */
  249.   address AXFTP
  250.   "SetFile DOWNLOADED"
  251.   if rc = 5 then address AX "ErrorReq Unabled to update file ('"file"') in database."
  252.   "RemoveFile"
  253.   "NextFile"
  254.   end
  255.  
  256. /*
  257.  * This section is only for retrieving file specified via file list
  258.  * or on the command line.
  259.  */
  260. doit:
  261.  
  262. /*
  263.  * Tell FTP client to shut down.
  264.  */
  265. if length(quitcmd) > 0 then do
  266.   call writeln('cf',quitcmd quitopts)
  267.   end
  268.  
  269. call close('cf')
  270.  
  271. /*
  272.  * Start FTP client.
  273.  *
  274.  * This one is different in that the command-file (i.e., all cd's and file
  275.  * retrieval commands) must be set up BEFORE the client is started.  This way
  276.  * the entire command script is passed to the client to essentially automate
  277.  * the process.
  278.  */
  279. address command clientpath clientopts
  280.  
  281. /*
  282.  * Tell the user that we're done.
  283.  */
  284. address AX "ErrorReq ncFTP has completed the transfer."
  285.  
  286. /*
  287.  * Delete the temporary command file.
  288.  */
  289. address command "Delete >NIL: "cmdfile "QUIET"
  290.  
  291. exit 0
  292.  
  293. /*
  294.  * This procedure lets the script grab files via the FTP client using a file
  295.  * list.
  296.  */
  297. usefilelist:
  298.   parse arg flist
  299.  
  300. error = 0
  301.  
  302. if open('fl',flist,'R') then do
  303.   site = strip(readln('fl'))
  304.   basedir = strip(readln('fl'))
  305.   do while ~eof('fl')
  306.     fpath = readln('fl')
  307.     if fpath = "###" then leave
  308.     if substr(fpath,1,1) = "/" then do /* absolute pathname */
  309.    fpath = reverse(fpath)
  310.    parse fpath fname "/" fpath
  311.    fpath = reverse(fpath)
  312.    fname = reverse(fname)
  313.    end
  314.     else if index(fpath,"/") > 0 then do /* relative pathname is specified */
  315.    fpath = reverse(basedir"/"fpath)
  316.    parse fpath fname "/" fpath
  317.    fpath = reverse(fpath)
  318.    fname = reverse(fname)
  319.    end
  320.     else do
  321.    fname = fpath
  322.    fpath = basedir
  323.    end
  324.     call writeln('cf',cdcmd fpath cdopts)
  325.     call writeln('cf',getcmd fname getopts)
  326.     end
  327.   call close('fl')
  328.   end
  329.  
  330. return error
  331.  
  332. /*
  333.  * This procedure lets the script grab files via the FTP client using files
  334.  * specified on the command line.
  335.  */
  336. usefiles:
  337.   parse arg site basedir flist
  338.  
  339. error = 0
  340.  
  341. do forever
  342.   parse var flist fpath flist
  343.   if fpath = "" then leave
  344.   if substr(fpath,1,1) = "/" then do /* absolute pathname */
  345.     fpath = reverse(fpath)
  346.     parse fpath fname "/" fpath
  347.     fpath = reverse(fpath)
  348.     fname = reverse(fname)
  349.     end
  350.   else if index(fpath,"/") > 0 then do /* relative pathname is specified */
  351.     fpath = reverse(basedir"/"fpath)
  352.     parse fpath fname "/" fpath
  353.     fpath = reverse(fpath)
  354.     fname = reverse(fname)
  355.     end
  356.   else do
  357.     fname = fpath
  358.     fpath = basedir
  359.     end
  360.   end
  361.   call writeln('cf',cdcmd fpath cdopts)
  362.   call writeln('cf',getcmd fname getopts)
  363.   end
  364.  
  365. return error
  366.  
  367. syntax:
  368. err = rc
  369. parse source . . . me .
  370. address AX "ErrorReq ARexx error" err "in line" sigl "of" me"."
  371. exit
  372.  
  373. error:
  374. parse source . . . me .
  375. address AX "ErrorReq Error" rc "in line" sigl "of" me"."
  376.