Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Westi on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

BACK UP code 3

Status
Not open for further replies.

boomerangboi

IS-IT--Management
Apr 23, 2008
11
PH
I'm having problems on how to make back up files in my desired path using VISUAL foxpro. My code is this:

PROCEDURE BackUp

bdrive = "C:\bak\"+SUBSTR(DTOS(DATE()),3,6)+".zip"

WAIT "Back-uping Database and tables..." WINDOW NOWAIT NOCLEAR

*! wzzip &bdrive data\sapmis_dbf.dbc data\*.dbf
! pkzip &bdrive data\sapmis.* data\*.dbf data\*.cdx

WAIT "Back-up process completed. Press anykey to close window or wait to close automatically..." WINDOW TIMEOUT 5
ENDPROC


I tried to set the default in my desired path BUT it just make a backup zip once. After that, it don't update the zip file. Is there something wrong with my code? THX in advance.

 
I have used a similar approach, but would probably err on the side of safety:

Code:
instruction = "pkzip c:\bak"+SUBSTR(DTOS(DATE()),3,6)+".zip data\sapmis.* data\*.dbf data\*.cdx"
strtofile(instruction,"c:\bak\backup.bat")
! c:\bak\backup.bat

Regards

Griff
Keep [Smile]ing
 
uhmm how can I put it in my code??? I am a little bit of lost here. is it the real code itself??? or those "instruction" be filled up by me.
 
Hi boomerangboi

You would do something like this:

Code:
Function BackUp
  private instruction
  instruction = "pkzip c:\bak"+SUBSTR(DTOS(DATE()),3,6)+".zip data\sapmis.* data\*.dbf data\*.cdx"
  strtofile(instruction,"c:\bak\backup.bat")
  WAIT "Backing up Database and tables..." WINDOW NOWAIT NOCLEAR
  ! c:\bak\backup.bat
  WAIT "Back-up process completed. Press any key to close window or wait to close automatically..." WINDOW TIMEOUT 5

return(.t.)

You might want to include *.fpt files as well

Regards

Griff
Keep [Smile]ing
 
My BU/restore code
Note Azip AUnzip is shareware.
KR
-Bart

Code:
Function BackupData
	LOCAL  lnDag, lnMaand, lcMaand, lnJaar, lcTijd, lnCounter, lnProjects,;
	 	lcWhat2Backup, llOK, lcArchiefNaam, lnFilesInZip, lcMessage

	* external array zoals hieronder voorkomt foutmelding bij compileren
	EXTERNAL ARRAY gaMaand
	
	lcArchiefNaam 	= '' 
	lnDag			= day(date())
	lcDag			= allt(str(lnDag))
	lnMaand			= month(date())
	lcMaand			= gaMaand(lnMaand)
	lnJaar			= year(date())
	lcJaar			= allt(str(lnJaar))
	lcTijd			= trans(time())
	lcTijd			= CHRTRAN(lcTijd, ':', '-')
	
	lcWhat2Backup 	= IIF(!EMPTY(gcDatadir),gcDataDir + '*.*', 'data\*.*') 
	lnFilesInZip	= 0
	lcUser			= ''
*****
* not required for every application	
	 =CloseAllWindows()	&& close all windows currently open
  	DO FORM GetBackUpName TO lcArchiefNaam  && get a name for the archive
*****  	
  	  	IF !EMPTY(lcArchiefNaam) 
			lcArchiefnaam = "Backup\"+ALLTRIM(lcArchiefNaam)+"_" + ccAppName + "_" + gcUser + "_" + lcDag + lcMaand + lcJaar + "_" + lcTijd

			* Tijdens ontwikkelen
			* Close project when in developmode as always DBC is open than.
			* Open DBC will not get backed-up
			
			IF !glRuntime  && flag for running not in develop-mode
				lnProjects = application.Projects.count
				IF lnProjects > 0
					DIMENSION aryProjects(lnProjects)
					STORE "" TO aryProjects
					FOR lnCounter = 1 TO lnProjects
			  			aryProjects(lnCounter) = application.Projects(1).name
			  			Application.Projects(1).Close
			   		ENDFOR
				ENDIF
			ENDIF

			CLOSE DATABASES all
			
	    	_screen.mousepointer = 11 	&&sandglass
	    	
				lnFilesInZip = Azip(.T. ,lcArchiefnaam , lcWhat2Backup) 
	    	
	    	_screen.mousepointer = 0 	&& normal	
	    	
			IF lnFilesInZip > 0
				lcMessage = "Backup gemaakt ( " + ALLTRIM(STR(lnFilesInZip)) + " files) :" + chr(13) + gcDefaultdir + lcArchiefnaam + ".ZIP"
	      		=messagebox( lcMessage , 0 , _screen.caption)
	    	ELSE 
	    		lcMessage = "Het is niet gelukt een backup te maken van uw gegevens."+ chr(13)+;
	      					"raadpleeg uw systeem beheerder."
	      		=messagebox(lcMessage , 0 , _screen.caption)
			ENDIF 
			
			* reopen projects which were close because of back-up
			IF !glRuntime  && not runtime
				IF lnProjects > 0
					FOR lnCounter = 1 TO lnProjects
						IF LEFT(gcDataDir,2) == '\\'
							=MESSAGEBOX(gcdatadir,0,'gcdatadir')
							=MESSAGEBOX('projectmanager kan niet worden geopend omdat bestanden niet op -C- staan')
							lnCounter = lnProjects
							EXIT
						ENDIF 		
						MODIFY PROJECT (aryProjects(lnCounter)) NOWAIT
					ENDFOR
				ENDIF
			ENDIF
			
		ENDIF 	
ENDFUNC
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
FUNCTION RestoreData
# INCLUDE MARLOC.h
	IF !glRuntime
		IF MESSAGEBOX("HUIDIGE DATABASE WORDT GEWIST. DAT KAN DE NU GEBRUIKTE ONTWIKKELVERSIE ZIJN. DOORGAAN MET WISSEN ?",4+256+48)=7
	    	RETURN
		ENDIF
	ENDIF

	LOCAL lcBackUpDir, lcBackUpName, lcDataDir, lnSessionCount, lnDatasession, lnI, llOK
	llOK 			= .T.
	lcBackUpName 	= ''
	lcBackUpDir 	= gcdefaultdir + '\backup'
	lcDataDir   	= gcdefaultdir + '\data'
	
	SET DEFAULT TO (lcBackUpDir)
	lcBackUpName  	= getfile("zip","Kies backup","",0)

	SET DEFAULT TO (gcdefaultdir)
	
	IF empty(lcBackUpName)
	  	RETURN
	ELSE 
		IF messagebox("Let op !"+chr(13)+chr(13)+"U gaat oude informatie terugzetten"+chr(13)+;
	  		chr(13)+"Bent u er absoluut zeker van dat dit gewenst is?"+chr(13)+chr(13)+;
	  		"Deze aktie kan NIET teruggedraaid worden!!",4+32+256,"Attentie")=6
	  		
	  		lnDatasession =SET('datasession')

			lnSessionCount = ASESSIONS(laSessions)
			
			FOR lnI = 1 TO lnSessionCount  
				SET DATASESSION TO laSessions(lnI)
			  	* Do whatever you want to do here
			  	CLOSE DATABASES ALL 
			ENDFOR 

			SET DATASESSION TO lnDatasession
			
		    * zeker zijn dat ALLE bestanden worden gewist
		    SET DEFAULT TO (lcDataDir)
			TRY 
			
				DELETE FILE *.dbc
				DELETE FILE *.bak
				DELETE FILE *.tbk
				DELETE FILE *.fpt    
				DELETE FILE *.cdx
				DELETE FILE *.dbf
				DELETE FILE *.h
				DELETE FILE *.ini
				DELETE FILE *.jpg
				DELETE FILE *.fxp
				
				DELETE FILE *.tmp
				DELETE FILE *.dct
				DELETE FILE *.dcx
			CATCH
				llOK = .F. 
			ENDTRY
			IF llOK					
			    SET DEFAULT TO (gcDefaultDir)
				=AUNZIP(.T., lcBackUpName, gcDefaultDir+"\data")
	
			    SET DEFAULT TO (lcDataDir)
			    
			 * oude metadata verwijderen
				=delfile('coremeta')
				=delfile('DBCXreg')
				=delfile('sdtmeta')
				=delfile('sdtuser')
				
			    SET DEFAULT TO (gcDefaultDir)

				=Update_SDT_and_DBC()	&& metadata en/of dbc vervangen voor meest aktuele versie
				=Update_with_SDT()		&& tabellen, indexen etc. updaten met meest recente metadata
			  
			    =messagebox(MSG_RESTORE_DONE, 0, _screen.caption)
			ELSE 
				=MESSAGEBOX(MSG_RESTORE_FAIL, 16, _screen.Caption)
			ENDIF
			
	    ENDIF 
	    
	ENDIF 

ENDFUNC
*******************************************************************************************	
**************
* Azip procedure to zip files for Visual FoxPro using the
* AddZip AZIP32.DLL from shareware
* [URL unfurl="true"]http://ourworld.compuserve.com/homepages/Stephen_Darlington/addzip.htm[/URL]
* Requirements: AZIP32.DLL in your Windows\system directory or current directory
*
* USAGE: AZIP(lInitialize, sArchive, sInclFiles[, ZipParams])
*
* Example: AZIP(.T., "ZIPFILE", "*.DBF *.TXT Customer.doc")
*
* PARAMETERS:
*-- lInitialize: .T. first time & Done only once before or when starting file zip - .F. afterward
*-              Calling azip() with no params also initializes
*-- sArchive: Archive FileName with extension - Example "C:\THISFILE.ZIP"
*-- sInclFiles: String repr. file(s) to include
*--		Example1 "D:\CUSTDATA.DBF"
*--     Example2 "C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*" - only single spaces in between
*--     ZIPparams: Some compression parameters [Optional]
*                  e(x) x = 'X' maximum compression
*                       x = '0' no compression (digital 0 not O)
*                       x = 'S' minimal compression
*                       x = 'N' normal compression (default)
*                  P include directory entries
*                  Spassword must be last part
*
* Return Values: the number of files archived or -1 if archive name not specified.


********************************************************************************************
FUNCTION aZip
PARAMETERS lInitialize, sArchive, sInclFiles, ZIPparams
PRIVATE Params, sTemp


Params = PARAMETERS()
* declare needed DLL functions & pass current window
IF Params = 0 OR lInitialize
	PRIVATE HWND
	DECLARE INTEGER GetActiveWindow IN win32api
	HWND = GetActiveWindow()
	DECLARE addZIP_Initialise IN AZIP32
	DECLARE SHORT addZIP_SetParentWindowHandle IN AZIP32 SHORT @ HWindow
	DECLARE SHORT addZIP_ArchiveName IN AZIP32 STRING @ sArchName
	DECLARE SHORT addZIP_Include IN AZIP32 STRING @ sFileName
	DECLARE SHORT addZIP_Recurse IN AZIP32 SHORT @ nRecurse
	DECLARE SHORT addZIP_SetCompressionLevel IN AZIP32 SHORT @ nComprLvl
	DECLARE SHORT addZIP_IncludeDirectoryEntries IN AZIP32 SHORT @ nInclDir
	DECLARE SHORT addZIP_IncludeEmptyDirectoryEntries IN AZIP32 SHORT @ nInclEDir
	DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
	DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
	DECLARE SHORT addZIP IN AZIP32
	DECLARE SHORT addZIP_Register IN AZIP32 String @ RegName, Integer @ RegNum
	DECLARE SHORT addZIP_Encrypt IN AZIP32 STRING @ sPassw
	addZIP_Initialise()
	addZIP_SetParentWindowHandle(HWND)
	* addZIP_Register("RegistrationName", RegistrationNumber)
	* Do above line if you have registered the software - it permits passwords

	IF Params < 2
    	RETURN 0
	ENDIF
ENDIF

IF Params < 3
	?? CHR(7)
	MESSAGEBOX('Missing parameters!',0, 'AZip Notice!')
	RETURN 0
ENDIF

IF Params > 3 && ZIPparams exist
	ZIPparams = ALLT(ZIPparams)
	PRIVATE LastPos, PASSWORD, nCurPos
	LastPos = LEN(ZIPparams) + 1

	* check for password
	nCurPos = ATC('S', ZIPparams)
	IF nCurPos > 0
    	cPassWord = SUBSTR(ZIPparams, nCurPos+1)
    	addZIP_Encrypt(cPassWord)
    	ZIPparams = LEFT(ZIPparams, nCurPos -1) && now remove password part - it may have other code
	ENDIF

	* check for storing subdirectory information
	nCurPos = ATC('P', ZIPparams)
	IF nCurPos > 0
    	addZIP_Recurse(1)
    	addZIP_IncludeDirectoryEntries(1)
    	* addZIP_IncludeEmptyDirectoryEntries(1)
	ENDIF

	* check for compresion level
	nCurPos = ATC('E', ZIPparams)
	IF nCurPos > 0
    	PRIVATE cCompLevel, nCompLevel
    	cCompLevel = SUBSTR(ZIPparams, nCurPos + 1, 1)
    	DO CASE
    	CASE cCompLevel = 'X' && max compression
      		nCompLevel = 3
    	CASE cCompLevel = 'S' && min compression
      		nCompLevel = 1
    	CASE cCompLevel = '0' && no compression
      		nCompLevel = 0
    	OTHERWISE && normal/default compression
      		nCompLevel = 2
    	ENDCASE
    	addZIP_SetCompressionLevel(nCompLevel)
	ENDIF
ELSE
	addZIP_SetCompressionLevel(2)
ENDIF

addZIP_ArchiveName(sArchive) && specify archive filepath
sInclFiles = ALLT(STRTRAN(sInclFiles, ' ', '|')) && file(s) to zip
addZIP_Include(sInclFiles) && (sInclFiles)


Return addZIP() && do it & return # of files compressed

***************************************************************************************
Function aUnzip
* Azip procedure to unzip files for Visual FoxPro using the
* AddZip AUNZIP.DLL's from shareware
* [URL unfurl="true"]http://ourworld.compuserve.com/homepages/Stephen_Darlington/addzip.htm[/URL]
*
* Requirements: AUNZIP32.DLL in your Windows\system directory or current directory
*
* USAGE: AUNZIP(lInitialize, sArchive sDir[, sExtractFiles[, UnZIPparams]])
*
* PARAMETERS:
*-- lInitialize: .T. first time & Done only once beforeor when starting file zip - .F. afterward
*-              Calling azip() with no params also initializes
*-- sArchive: Archive FileName with extension - Example "C:\THISFILE.ZIP"
*-- sDir: destination directory string
*--		Example1 "D:\TEMP"
*-- sExtractFiles(optional): string repr. file(s) or types to extract
*--     Default is "*.*"
*--     Example1 "C:\CUSTOMER.DBF"
*--     Example2 "C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*" - only single spaces in between
*-- UnZIPparams: Some compression parameters [Optional]
*                F freshen files - over older date/time or not existing
*                D include directory information
*                Overwrite: !!!!
*                   !!!! This does not seem to work except OverwriteNone - as of Aug. 1998 version.
*                        OA: overwrite all (default)
*                        O0: do not overwrite (letter O, digit 0)
*                        OU: ask user
*                Spassword (Must be last part - works only with registered version)
*
* Return Values: the number of files archived or -1 if archive name not specified.

PARAMETERS Initialize, sArchive, sDir, sExtractFiles, UnZIPparams
PRIVATE Params, sTemp
Params = PARAMETERS()
* declare needed DLL functions & pass current window
IF Params = 0 OR Initialize
  PRIVATE HWND
  DECLARE INTEGER GetActiveWindow IN win32api
  HWND = GetActiveWindow()
  DECLARE addUNZIP_Initialise IN AUNZIP32
  DECLARE SHORT addUNZIP_SetParentWindowHandle IN AUNZIP32 SHORT @ HWindow
  DECLARE SHORT addUNZIP_ArchiveName IN AUNZIP32 STRING @ sArchName
  DECLARE SHORT addUNZIP_RestoreStructure IN AUNZIP32 SHORT @ nResStr
  DECLARE SHORT addUNZIP_Freshen IN AUNZIP32 SHORT @ nFreshn
  DECLARE SHORT addUNZIP_Include IN AUNZIP32 STRING @ sFileName && default is *.*
  DECLARE SHORT addUNZIP_ExtractTo IN AUNZIP32 STRING @ sExtrTo
  DECLARE SHORT addUNZIP_Register IN AUNZIP32 STRING @ RegName, INTEGER @ RegNum
  DECLARE SHORT addUNZIP_Decrypt IN AUNZIP32 STRING @ sPassw
  DECLARE SHORT addUNZIP_Overwrite IN AUNZIP32 SHORT @ nOvLevel
  DECLARE SHORT addUNZIP IN AUNZIP32
  addUNZIP_Initialise()
  addUNZIP_SetParentWindowHandle(HWND)
* addUNZIP_Register("RegistrationName", RegistrationNumber)
  IF Params < 2
    RETURN 0
  ENDIF
ENDIF

IF Params < 3
  ?? CHR(7)
  MESSAGEBOX('Missing parameters!',0, 'AUNZip Notice!')
  RETURN 0
ENDIF

IF Params > 3 && UnZIPparams exist
  UnZIPparams = ALLT(UnZIPparams)
  PRIVATE LastPos, PASSWORD, nCurPos
  LastPos = LEN(UnZIPparams) + 1

  * check for password
  nCurPos = ATC('S', UnZIPparams)
  IF nCurPos > 0
    cPassWord = SUBSTR(UnZIPparams, nCurPos+1)
    addUNZIP_Decrypt(cPassWord)
    UnZIPparams = LEFT(UnZIPparams, nCurPos -1) && now remove password part - it may have other code
  ENDIF

  * check for restoring subdirectory information
  nCurPos = ATC('D', UnZIPparams)
  IF nCurPos > 0
    addUNZIP_RestoreStructure(1)
  ENDIF

  * check for freshen
  nCurPos = ATC('F', UnZIPparams)
  IF nCurPos > 0
    addUNZIP_RestoreStructure(1)
  ENDIF

  * check for Overwrite - this does not seem to work except, OverwriteNone
  DO CASE
  CASE 'OA' $ UnZIPparams && Overwrite all
    addUNZIP_Overwrite(0x0b)
  CASE 'O0' $ UnZIPparams && overwrite none
    addUNZIP_Overwrite(0x0c)
  CASE 'OU' $ UnZIPparams && overwrite ask user
    addUNZIP_Overwrite(0x0a)
  ENDCASE

  IF nCurPos > 0
    addUNZIP_RestoreStructure(1)
  ENDIF

ELSE
  addUNZIP_Overwrite(0x000a) && this does not seem to work except OverwriteNone
ENDIF

addUNZIP_ArchiveName(sArchive)
addUNZIP_ExtractTo(ALLT(sDir))
sExtractFiles = IIF(Params<4, "*.*", ALLT(STRTRAN(sExtractFiles, ' ', '|'))) && file(s) to extract
addUNZIP_Include(sExtractFiles) && files to extract - *.txt, *.*, etc.
RETURN addUNZIP()
 
Thanks for the help guys.

Hello Griff

I tried your the code you gave me. It made a file backup.bat but when I tried to open it, there is a DOS window that blinks once and then it is gone. I tried to use .zip and it made a corrupt zip file.
 
Now you have the backup.bat file why not test it by running it manually?

Let me know the result.

Regards

Griff
Keep [Smile]ing
 
boomerangboi,

with DTOS() you create a string for the date, that will only change the next day. So when you run your code or Griffs bat file it will of course fail for the second time, if pkzip is not configured to overwrite existing files.

Either you create a filename which also contains hour,minute and second or you must use a command line option of pkzip to overwrite existing files.

The next problem after that is, that pkzip interprets data\sapmis.* data\*.dbf data\*.cdx as relative to either itself or cmd.exe, I would not expect it to search for a data directory relative to the current dir of VFP. It's a separate process running which knows nothing about what VFPs current directory is. You can also not use SET PATH to change that, but would need to change the windows PATH environment variable to make pkzip search within directories configured within that. Or make it absolute paths like d:\myappsdata\data\sapmis.*

And surely you'd also like to backup fpt files, if there are. The complete structure of a VFP table is stored in dbf (main file), cdx (indexes) and fpt (memo, general, varbinary fields). Plus there might be several idx files and additional cdx files which not always must match the first part of the filename without extension. Perhaps you're best off backing up data/*.*

Bye, Olaf.
 
The first time I run it is a big mistake because I didn't place the .bat file to the programs folder.

Second time, I tried to run it manually using the dos command but it is just updating and deflating. I tested to change or delete dbf files but it didn't do anything.

Sorry for being a beginner. I'm just not so familiar with the codes. Thanks again in advance.
 
You would not need to delete dbf files but the zip file so that pkzip will create the zip again. But it's just fine, if the zip file get's updated, isn't it?

Bye, Olaf.
 
Thanks a lot for the help. I really appreciate all of it... I can now create zip file and unzip it. My mistake is that I have many copies of the files/folders of my program :).

Once again, thanks to Griff, Nif and olas...
 
Another question: When I open the backup.bat file using the dos command, it is making zip file as C:\DOCUMENTS.zip

How can I change the pathname of the zip file??? I tried it on another computer and the zip file now saved in the folder where my executable file of the program is.
 
How the destination fiel is named and in what path it is stored is part of the pkzip options. Now what's the source of your bat file?

Bye, Olaf.
 
boomerangboi (IS/IT--Management) May 7, 2008
Oh, thanks for the reply. I already figured it out myself. My problem NOW is, Let's say, the process of making the batch file for unzipping the zip file created will be saved in "C:\GRUNDER\sapmis\" and the batch filename is "exing.bat". What should I do if I transfer the codes to another computer and there is no existing \GRUNDER\sapmis\ folder?

Here's my code for creating zip file and running it.

Code:
  private instruction
  instruction = "pkunzip -o c:\GRUNDER\sapmis\"+SUBSTR(DTOS(DATE()),3,6)+".zip"
  strtofile(instruction,"c:\GRUNDER\sapmis\exing.bat")
  ! c:\GRUNDER\sapmis\exing.bat
 
Hmm, this code does create a bat file with a pkUNzip command. I doubt that is the bat file you run to create the zip.

Bye, Olaf.
 
Yes, this code is using the pkunzip command. I'm trying to create a backup in another computer where C:\grunder\sapmis does not exists. Here's my code for my pkzip

Code:
  private instruction
  instruction = "pkzip -a c:\GRUNDER\sapmis\"+SUBSTR(DTOS(DATE()),3,6)+".zip data\sapmis.* data\*.dbf data\*.cdx data\*.fpt"
  strtofile(instruction,"c:\GRUNDER\sapmis\backup.bat")
  ! c:\GRUNDER\sapmis\backup.bat

I even try to change the path names. But it doesn't work out. It didn't create a folder.

another question: is it possible to zip a folder using the pkzip command???

Thanks.
 
Yes, pkzip does only create files, not missing folders. So you'd do a mkdir command previous to the bat file.

It's possible to zip a folder, simply use the *.* mask to zip all files, c:\path\to\folder\*.* to zip a folder. There should also be an option to do it recursivly in pkzip, to also zip all subfolders.

Bye, Olaf.
 
I think (dependent on version) it was something like this to recurse and store paths

Code:
pkzip -p -r myzipfile c:\blahblah\*.*

There is a better version out there on the 'net called PKZip25.exe which is much faster and respects long file names... but watch out, the parameters are different, and it does zipping and unzipping.

One other thought, there is a completely free package called FBZip.exe as well - which is not bad and has a command line and windows interface.

Regards

Griff
Keep [Smile]ing
 
The fbzip turned great but I encountered some coding problems.

Code:
instruction = "fbzip -a -p -r "e:\VisualFoxproProjects\sapmis\DTOS(DATE()).zip" "c:\sapmis\data\""

it appears that I can't put quotation marks inside the quotation marks. Like the one before e:\

I tried to separate the string of characters and concatenate it to the STRTOFILE. but it doesn't work out also.
 
One of the lovely things about VFP nested quotes:

Code:
instruction = 'fbzip -a -p -r "e:\VisualFoxproProjects\sapmis\DTOS(DATE()).zip" "c:\sapmis\data\"'

Regards

Griff
Keep [Smile]ing
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top