/* Update Homepage Rexx script * by Jan M. Danielsson (os2@telia.com) on 2000-07-01 * Resistance is futile. */ /* OS/2 API-functions */ call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs" call SysLoadFuncs /* OS/2 Rexx-Ftp-API */ call RxFuncAdd "FtpLoadFuncs", "rxFtp", "FtpLoadFuncs" call FtpLoadFuncs /* * Configuration variables */ FTPSERVER="your.isp.ftp.server" FTPUSER="youruser" FTPPASSWORD="yourpass" HOMEPAGEBASE = "c:\internet\homepage\OS!2" HPBASELEN = LENGTH(HOMEPAGEBASE) LOGFILE = "work.log" fWriteLog = "yes" if fWriteLog = "yes" then do '@del 'LOGFILE call LINEOUT LOGFILE, '*** 'DATE()' 'TIME()' Begin session', 1 end /* do */ /* dirs.0 dirs.n "<1> <2> <3> <4>" <1> parent directory (1 - root) <2> directory exists locally (0 - doesn't exist, 1 - exists) <3> directory exists remotely (0 - doesn't exist, 1 - exists) <4> name of directory files.0 files.n "<1> <2> <3> <4> <5> <1> which directory file belogs to (1 - root) <2> local file size ("-" if it doesn't exist locally) <3> remote file size ("-" if it doesn't exist remotely) <4> Archive flag for local file ('-' archived flag is not set, 'A' archived flag is set) <5> filename dirs.n " " files.n " " */ /* Login */ if FtpSetUser(FTPSERVER, FTPUSER, FTPPASSWORD) then do say 'Logged in' /* Set binary mode */ rc = FtpSetBinary("Binary") if rc = 0 then do say 'ERROR: Could not set binary mode.' call WriteLog '*** ERROR: Could not set binary mode.' exit end /* There is always a root */ dirs.0 = 1 dirs.1 = "0 1 1 " files.0 = 0 icurrentdir = 0 say '- Gathering data' do while icurrentdir < dirs.0 idir = icurrentdir+1 say ' - Processing directory 'idir' of 'dirs.0 /* Start scanning for existing files and directories here */ ifilestart = files.0 idirstart = dirs.0 /* Start by checking the ftp files */ if WORD(dirs.idir, 3) = "1" then do call chftpdir idir rc=FtpDir(".", "ftpfilelist.") do i=1 to ftpfilelist.0 /* say ftpfilelist.i */ if SUBSTR(ftpfilelist.i,1,1) = "d" then do /* Add directory to list */ dirs.0 = dirs.0 + 1 imax = dirs.0 dirs.imax = idir' 0 1 'WORD(ftpfilelist.i,9) call WriteLog ' Dir('imax'): 'dirs.imax end else if SUBSTR(ftpfilelist.i,1,1) = "-" then do /* Add file to list */ files.0 = files.0 + 1 imax = files.0 files.imax = idir' - 'WORD(ftpfilelist.i,5)' - 'WORD(ftpfilelist.i,9) call WriteLog 'File('imax'): 'files.imax end end end /* Check local files */ if WORD(dirs.idir, 2) = "1" then do currentpath = getlocaldir(idir) call SysFileTree currentpath'\*', 'localfilelist', , '*****' do i=1 to localfilelist.0 /* say localfilelist.i */ ichar = LASTPOS("\", localfilelist.i) parsedname = SUBSTR(localfilelist.i, ichar+1) if SUBSTR(localfilelist.i,32,1) = "D" then do /* A local directory */ /* Attempt to locate directory in list */ ifound = LocateDirInDir(idir, idirstart, parsedname) if ifound <> 0 then do /* Mark directory as 'local' */ call WriteLog '! Directory "'parsedname'" is already in list' dirs.ifound = ReplaceWord(dirs.ifound, 2, "1") call WriteLog ' Dir('ifound'): 'dirs.ifound end else do /* Add directory */ dirs.0 = dirs.0 + 1 imax = dirs.0 dirs.imax = idir' 1 0 'parsedname call WriteLog ' Dir('imax'): 'dirs.imax end end else do /* A local file */ ifound = LocateFileInDir(idir, ifilestart, parsedname) if ifound <> 0 then do /* Mark local file */ files.ifound = ReplaceWord(files.ifound, 2, WORD(localfilelist.i,3)) files.ifound = ReplaceWord(files.ifound, 4, SUBSTR(localfilelist.i,31,1)) call WriteLog 'File('ifound'): 'files.ifound end /* do */ else do /* File hasn't been added before -- add a new entry */ files.0 = files.0 + 1 imax = files.0 files.imax = idir' 'WORD(localfilelist.i,3)' - 'SUBSTR(localfilelist.i,31,1)' 'parsedname call WriteLog 'File('imax'): 'files.imax end end end end icurrentdir = icurrentdir + 1 end /* do while icurrentdir < dirs.0 */ /* Dump directories */ call WriteLog '' call WriteLog '** Directory list' do i = 1 to dirs.0 call WriteLog 'Dir('i'): 'dirs.i end /* Dump files */ call WriteLog '' call WriteLog '** File list' do i = 1 to files.0 call WriteLog 'File('i'): 'files.i end /* Create remote directories */ say '- Create remote directories' call WriteLog '' call WriteLog '** Create remote directories' do i = 1 to dirs.0 if WORD(dirs.i, 2) = 1 then do /* Check if directory exists locally */ if WORD(dirs.i,3) = 0 then do /* Check is directory DOESN'T exist on ftp server */ call chftpdir WORD(dirs.i,1) /* Change to parent directory on ftp server */ say ' - Creating remote directory "'WORD(dirs.i,4)'".' rc = FtpMkDir(WORD(dirs.i,4)) if rc = 0 then do call WriteLog 'Directory "'WORD(dirs.i,4)'" created on server' end else do call WriteLog '*** ERROR: Could not create directory "'WORD(dirs.i,4)'" on server' end end end end say '- Upload new/updated files, and remove unused files.' call WriteLog '' call WriteLog '** Upload new/updated files and remove unused files.' do i = 1 to files.0 if (WORD(files.i, 2) <> "-") & ((WORD(files.i, 2) <> WORD(files.i, 3)) | (WORD(files.i, 4) = "A")) then do /* Change to target directory on server */ call chftpdir WORD(files.i,1) /* Upload file */ local = getlocaldir(WORD(files.i,1)) local = local'\'WORD(files.i, 5) say ' - Uploading file "'local'".' rc = FtpPut(local, WORD(files.i, 5)) if rc = 0 then do call WriteLog 'File "'WORD(files.i,5)'" uploaded to server' /* If successful; reset archived attribute for file*/ call SysFileTree local, 'localfilelist', F, '*****', '-****' end else do call WriteLog '*** ERROR: Could not upload file "'WORD(files.i,5)'" to server' end end else if WORD(files.i, 2) = '-' then do /* File is unused (does not exist locally) -- remove it */ call chftpdir WORD(files.i,1) call WriteLog 'Delete file "'WORD(files.i, 5)'" from server because it is unused' rc = FtpDelete(WORD(files.i, 5)) if rc = 0 then do call WriteLog 'File "'WORD(files.i,5)'" was deleted from server.' end else do call WriteLog '*** ERROR: Could not delete file "'WORD(files.i,5)'" from server.' end end else do call WriteLog 'Skipping file "'WORD(files.i,5)'"; probably unchanged.' end end say '- Remove unused directories.' call WriteLog '' call WriteLog '** Remove empty/unused directories' i = dirs.0 do while i > 1 if WORD(dirs.i, 2) = "0" then do call WriteLog 'Directory "'WORD(dirs.i,4)'" will be removed since it is unused.' call chftpdir WORD(dirs.i,1) say ' - Removing remote directory "'WORD(dirs.i,4)'".' rc = FtpRmDir(WORD(dirs.i,4)) if rc = 0 then call WriteLog 'Directory "'WORD(dirs.i,4)'" successfully removed.' else call WriteLog '*** ERROR: Could not remove directory "'WORD(dirs.i,4)'".' end i = i - 1 end rc = FtpLogoff() if rc = 0 then say '*** Logout successful!' else say '*** Logout failed!' end if fWriteLog = "yes" then do call WriteLog '*** 'DATE()' 'TIME()' End session' end /* do */ exit Terminate: rc = FtpLogoff() if rc = 0 then do say 'Logoff successful' call WriteLog 'Logged out' end else do say 'Logout failed!' call WriteLog '*** ERROR: FtpLogoff() failed' end call WriteLog '*** 'DATE()' 'TIME()' End session' exit /* * Find out if a directory exists in dirs.n * Parameters: * indir - in which directory to look * istartsearch - serach range dirs.istartsearch to dirs.0 * findname - name to search for * * returns: * 0 - directory doesn't exist * n - directory exists at index */ LocateDirInDir: parse arg indir, istartsearch, finddirname do ifnd = istartsearch to dirs.0 if WORD(dirs.ifnd, 1) = indir then do if WORD(dirs.ifnd, 4) = finddirname then return ifnd end end return 0 LocateFileInDir: parse arg indir, istartsearch, findfilename do ifnd = istartsearch to files.0 /* Loop though the last couple of entries */ if WORD(files.ifnd, 1) = indir then do /* Check if directories match */ if WORD(files.ifnd, 5) = findfilename then do /* Check if filenames match */ return ifnd end end end return 0 /* * Patameters: * str - The string on which the word to replace is in * iWord - Word index * newWord - String to replace with */ ReplaceWord: PROCEDURE parse arg str, iWord, newWord iwrdndx = WORDINDEX(str, iWord) str = DELWORD(str, iWord, 1) str = INSERT(newWord' ', str, iwrdndx-1) return str WriteLog: parse arg str if fWriteLog = "yes" then do call LINEOUT LOGFILE, str end return /* * Change directory on FTP server */ chftpdir: parse arg dirnum if dirnum = 1 then do gotodir = "/" end else do gotodir = '/'WORD(dirs.dirnum,4) iparent = WORD(dirs.dirnum,1) do while iparent <> 1 parentdir = WORD(dirs.iparent,4) gotodir = '/'parentdir''gotodir iparent = WORD(dirs.iparent,1) end end call WriteLog 'Change server directory to "'gotodir'".' rc = FtpChDir(gotodir) if rc = 0 then call WriteLog 'Server directory changed to "'gotodir'".' else do call WriteLog '*** ERROR: Could not change directory to "'gotodir'".' end return rc getlocaldir: parse arg dirnum if dirnum = 1 then do gotodir = '' end else do gotodir = '' do while dirnum <> 1 gotodir = '\'WORD(dirs.dirnum,4)''gotodir dirnum = WORD(dirs.dirnum,1) end end call WriteLog 'getlocaldir returning: "'HOMEPAGEBASE''gotodir'"' return HOMEPAGEBASE''gotodir