!===============================================================================
! CVS $Id: shr_file_mod.F90,v 1.2.4.1 2004/01/02 18:50:54 mvr Exp $
! CVS $Source: /fs/cgd/csm/models/CVS.REPOS/shared/csm_share/shr/shr_file_mod.F90,v $
! CVS $Name: cam3_0_brnchT_release01 $
!===============================================================================
! put/get local files into/from archival location
!===============================================================================
MODULE shr_file_mod,2
use shr_kind_mod
, only: SHR_KIND_IN
use shr_sys_mod
, only: shr_sys_system ! System calls
IMPLICIT none
CONTAINS
!===============================================================================
SUBROUTINE shr_file_put(rcode,loc_fn,rem_fn,passwd,rtpd,async,remove),2
!----- arguments -----
integer(SHR_KIND_IN),intent(out) :: rcode ! return code
character(len=*) ,intent(in) :: loc_fn ! local filename
character(len=*) ,intent(in) :: rem_fn ! remote filename
character(len=*) ,optional :: passwd ! password
integer(SHR_KIND_IN),optional :: rtpd ! MSS retention period
logical ,optional :: remove ! true <=> rm after put
logical ,optional :: async ! true <=> asynchronous put
!----- local -----
character(len=256) :: passwd2 ! password
integer(SHR_KIND_IN) :: rtpd2 ! MSS retention period
logical :: remove2 ! true <=> rm after put
logical :: async2 ! true <=> asynchronous put
character(len=256) :: rfn ! rem_fn without the destination prefix
character(len=256) :: cmd ! command sent to system call
!----- formats -----
character(len=*),parameter :: F00 = "('(shr_file_put) ',4a)"
character(len=*),parameter :: F01 = "('(shr_file_put) ',a,i3,2a)"
character(len=*),parameter :: F02 = "(a,i4)"
!-------------------------------------------------------------------------------
! PURPOSE:
! a generic, extensible put-local-file-into-archive routine
! USAGE:
! call shr_file_put(rcode,"foo","/home/user/foo")
! call shr_file_put(rcode,"foo","cp:/home/user/foo",remove=.true.)
! call shr_file_put(rcode,"foo","mss:/USER/foo",rtpd=3650)
!-------------------------------------------------------------------------------
remove2 =.false. ; if ( PRESENT(remove )) remove2 = remove
async2 =.true. ; if ( PRESENT(async )) async2 = async
passwd2 = " " ; if ( PRESENT(passwd )) passwd2 = passwd
rtpd2 = 365 ; if ( PRESENT(rtpd )) rtpd2 = rtpd
rcode = 0
if ( index(rem_fn,":") == 0 .or. rem_fn(1:3) == "cp:" ) then
!------------------------------------------------------
! put via unix cp
!------------------------------------------------------
rfn = rem_fn
if ( rem_fn(1:3) == "cp:") rfn = rem_fn(4:len_trim(rem_fn))
cmd = 'cp -f '//trim(loc_fn)//' '//trim(rfn)
if (remove2) cmd = trim(cmd)//' && rm '//trim(loc_fn)
if (async2 ) cmd = trim(cmd)//' & '
call shr_sys_system
(trim(cmd),rcode)
else if ( rem_fn(1:4) == "mss:" ) then
!------------------------------------------------------
! put onto NCAR's MSS
!------------------------------------------------------
if (rtpd2 > 9999) rtpd2 = 9999
write(cmd,F02) '/usr/local/bin/msrcp -period ',rtpd2
if (async2 ) cmd = trim(cmd)//' -async '
if (len_trim(passwd2) > 0 ) cmd = trim(cmd)//' -wpwd '//trim(passwd)
cmd = trim(cmd)//' '//trim(loc_fn)//' '//trim(rem_fn)
if (remove2) cmd = trim(cmd)//' && rm '//trim(loc_fn)
call shr_sys_system
(trim(cmd),rcode)
else if ( rem_fn(1:5) == "hpss:") then
!------------------------------------------------------
! put onto LANL's hpss
!------------------------------------------------------
rcode = -1
cmd = 'rem_fn='//trim(rem_fn)//' loc_fn='//trim(loc_fn)
write(6,F00) 'ERROR: hpss option not yet implemented'
else if ( rem_fn(1:5) == "rcp:" ) then
!------------------------------------------------------
! put via rcp
!------------------------------------------------------
rcode = -1
cmd = 'rem_fn='//trim(rem_fn)//' loc_fn='//trim(loc_fn)
write(6,F00) 'ERROR: rcp option not yet implemented'
else if ( rem_fn(1:5) == "null:" ) then
! do nothing
cmd = "null prefix => no file archival, do nothing"
rcode = 0
else
!------------------------------------------------------
! unrecognized remote file location
!------------------------------------------------------
rcode = -1
cmd = 'rem_fn='//trim(rem_fn)//' loc_fn='//trim(loc_fn)
write(6,F00) 'ERROR: unrecognized archive device = ',trim(rem_fn)
end if
write(6,F01) 'rcode =',rcode,' cmd = ', trim(cmd)
END SUBROUTINE shr_file_put
!===============================================================================
SUBROUTINE shr_file_get(rcode,loc_fn,rem_fn,passwd,async,clobber),2
!----- arguments -----
character(len=*) ,intent(in) :: loc_fn ! local filename
character(len=*) ,intent(in) :: rem_fn ! remote filename
integer(SHR_KIND_IN),intent(out) :: rcode ! return code
character(len=*) ,optional :: passwd ! password
logical ,optional :: async ! true <=> asynchronous get
logical ,optional :: clobber ! true <=> clobber existing file
!----- local -----
character(len=256) :: passwd2 ! password
logical :: async2 ! true <=> asynchronous get
logical :: clobber2 ! true <=> clobber existing file
character(len=256) :: rfn ! rem_fn without the destination prefix
character(len=256) :: cmd ! command sent to system call
logical :: exists ! true <=> local file aready exists
!----- formats -----
character(len=*),parameter :: F00 = "('(shr_file_get) ',4a)"
character(len=*),parameter :: F01 = "('(shr_file_get) ',a,i3,2a)"
!-------------------------------------------------------------------------------
! PURPOSE:
! a generic, extensible get-local-file-from-archive routine
! USAGE:
! call shr_file_get(rcode,"foo","/home/user/foo")
! call shr_file_get(rcode,"foo","cp:/home/user/foo",remove=.true.)
! call shr_file_get(rcode,"foo","mss:/USER/foo",clobber=.true.)
!-------------------------------------------------------------------------------
passwd2 = " " ; if (PRESENT(passwd )) passwd2 = passwd
async2 = .false. ; if (PRESENT(async )) async2 = async
clobber2 = .false. ; if (PRESENT(clobber)) clobber2 = clobber
rcode = 0
inquire(file=trim(loc_fn),exist=exists)
if ( index(rem_fn,":") == 0 .or. rem_fn(1:3) == "cp:" ) then
!------------------------------------------------------
! get via unix cp
!------------------------------------------------------
rfn = rem_fn
if ( rem_fn(1:3) == "cp:") rfn = rem_fn(4:len_trim(rem_fn))
cmd = 'cp '
if (clobber2) cmd = 'cp -f '
cmd = trim(cmd)//' '//trim(rfn)//' '//trim(loc_fn)
if (async2) cmd = trim(cmd)//' & '
call shr_sys_system
(trim(cmd),rcode)
else if ( rem_fn(1:4) == "mss:" ) then
!------------------------------------------------------
! get from NCAR's MSS
!------------------------------------------------------
cmd = '/usr/local/bin/msrcp '
if (.not. clobber2) cmd = trim(cmd)//' -noreplace '
if (async2) cmd = trim(cmd)//' -async '
cmd = trim(cmd)//' '//trim(rem_fn)//' '//trim(loc_fn)
call shr_sys_system
(trim(cmd),rcode)
else if ( rem_fn(1:5) == "hpss:") then
!------------------------------------------------------
! get from LANL's hpss
!------------------------------------------------------
rcode = -1
cmd = 'rem_fn='//trim(rem_fn)//' loc_fn='//trim(loc_fn)
write(6,F00) 'ERROR: hpss option not yet implemented'
else if ( rem_fn(1:5) == "rcp:" ) then
!------------------------------------------------------
! get via rcp
!------------------------------------------------------
rcode = -1
cmd = 'rem_fn='//trim(rem_fn)//' loc_fn='//trim(loc_fn)
write(6,F00) 'ERROR: rcp option not yet implemented'
else if ( rem_fn(1:5) == "null:" ) then
! do nothing
cmd = "null prefix => no file retrieval, do nothing"
rcode = 0
else
!------------------------------------------------------
! unrecognized remote file location
!------------------------------------------------------
rcode = -1
cmd = 'rem_fn='//trim(rem_fn)//' loc_fn='//trim(loc_fn)
write(6,F00) 'ERROR: unrecognized archive device = ',trim(rem_fn)
end if
write(6,F01) 'rcode =',rcode,' cmd = ', trim(cmd)
END SUBROUTINE shr_file_get
!===============================================================================
END MODULE shr_file_mod