Enabled Digest calculations for data going to TSM - useful for verification
This commit is contained in:
parent
b3334a2401
commit
0046a593ab
@ -1,5 +1,9 @@
|
||||
TSMAPIDIR=/opt/tivoli/tsm/client/api/bin/sample
|
||||
TSMLIB=-lApiDS
|
||||
|
||||
# ** For Digest Calculations, we need to link to openssl libraries, and enable USE_DIGEST in tsmpipe.h **
|
||||
#TSMLIB=-lApiDS
|
||||
TSMLIB=-lApiDS -lssl
|
||||
|
||||
CC=gcc
|
||||
CFLAGS=-g -W -Wall -Wextra -O -m32 -I$(TSMAPIDIR)
|
||||
LDFLAGS=
|
||||
|
@ -1,5 +1,9 @@
|
||||
TSMAPIDIR=/opt/tivoli/tsm/client/api/bin64/sample
|
||||
TSMLIB=-lApiTSM64
|
||||
|
||||
# ** For Digest Calculations, we need to link to openssl libraries, and enable USE_DIGEST in tsmpipe.h **
|
||||
#TSMLIB=-lApiTSM64
|
||||
TSMLIB=-lApiTSM64 -lssl
|
||||
|
||||
CC=gcc
|
||||
CFLAGS=-g -W -Wall -Wextra -O -m64 -I$(TSMAPIDIR)
|
||||
LDFLAGS=
|
||||
|
@ -28,6 +28,10 @@
|
||||
|
||||
#include "../tsmpipe.h"
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
#include <openssl/evp.h>
|
||||
#endif
|
||||
|
||||
int tsm_matchone_cb(dsmQueryType qType, DataBlk *qResp, void *userdata) {
|
||||
struct matchone_cb_data *cbdata = userdata;
|
||||
|
||||
@ -118,7 +122,11 @@ int tsm_regfs(dsUint32_t dsmHandle, char *fsname) {
|
||||
}
|
||||
|
||||
/* Send data to TSM for storage */
|
||||
#ifdef USE_DIGEST
|
||||
int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype, char *digest) {
|
||||
#else
|
||||
int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype) {
|
||||
#endif
|
||||
extern int verbose;
|
||||
char *buffer;
|
||||
dsInt16_t rc=0;
|
||||
@ -138,6 +146,24 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l
|
||||
exit(255);
|
||||
}
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
EVP_MD_CTX mdctx;
|
||||
const EVP_MD *md=NULL;
|
||||
unsigned char md_value[EVP_MAX_MD_SIZE];
|
||||
unsigned int md_len, i;
|
||||
|
||||
if (digest) {
|
||||
OpenSSL_add_all_digests();
|
||||
|
||||
md = EVP_get_digestbyname(digest);
|
||||
|
||||
if (! md) {
|
||||
printf("tsm_sendfile: Unknown message digest %s\n", digest);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Register our filespace
|
||||
if (! tsm_regfs(dsmHandle,fsname))
|
||||
exit(3);
|
||||
@ -210,6 +236,13 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l
|
||||
return(0);
|
||||
}
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
if (digest) {
|
||||
EVP_MD_CTX_init(&mdctx);
|
||||
EVP_DigestInit_ex(&mdctx, md, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
memset(&dataBlk,0x00,sizeof(DataBlk));
|
||||
dataBlk.stVersion = DataBlkVersion;
|
||||
|
||||
@ -224,6 +257,11 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
if (digest)
|
||||
EVP_DigestUpdate(&mdctx, buffer, nbytes);
|
||||
#endif
|
||||
|
||||
dataBlk.bufferLen = nbytes;
|
||||
dataBlk.numBytes = 0;
|
||||
dataBlk.bufferPtr = buffer;
|
||||
@ -274,6 +312,17 @@ int tsm_sendfile(dsUint32_t dsmHandle, char *fsname, char *filename, long long l
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
if (digest) {
|
||||
EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
|
||||
EVP_MD_CTX_cleanup(&mdctx);
|
||||
|
||||
fprintf(stderr,"%s: ",digest);
|
||||
for(i=0; i<md_len; i++) fprintf(stderr,"%02x",md_value[i]);
|
||||
fprintf(stderr,"\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
17
tsmpipe.c
17
tsmpipe.c
@ -65,7 +65,7 @@ void usage(void) {
|
||||
fprintf(stderr,
|
||||
"tsmpipe %s, usage:\n"
|
||||
"\n"
|
||||
"tsmpipe [-i] [-A|-B] [-c|-x|-d|-t] -s fsname -f filepath [-l len]\n"
|
||||
"tsmpipe [-i]|[[-A|-B] [-c|-x|-d|-t] -s fsname -f filepath [-l len] ...]\n"
|
||||
" -i Show session information:\n"
|
||||
" -A and -B are mutually exclusive:\n"
|
||||
" -A Use Archive objects\n"
|
||||
@ -87,6 +87,9 @@ void usage(void) {
|
||||
" -e expdate Expire Date lower bound (mmddYYYY[:HHMMSS]) (ARCHIVE Objects)\n"
|
||||
" -E expdate Expire Date upper bound (mmddYYYY[:HHMMSS]) (ARCHIVE Objects)\n"
|
||||
" -O options Extra options to pass to dsmInitEx\n"
|
||||
#ifdef USE_DIGEST
|
||||
" -m digest Calculate digest for data being stored in TSM, eg: md5, sha1, sha512..."
|
||||
#endif
|
||||
" -v Verbose. More -v's gives more verbosity\n"
|
||||
,_TSMPIPE_VERSION);
|
||||
|
||||
@ -112,8 +115,11 @@ int main(int argc, char *argv[]) {
|
||||
qryBackupData qbData;
|
||||
dsmObjName objName;
|
||||
int rc=0;
|
||||
#ifdef USE_DIGEST
|
||||
char *digest=NULL;
|
||||
#endif
|
||||
|
||||
while ((c = getopt(argc, argv, "hiABcxdtve:E:f:l:n:N:s:D:O:P:")) != -1) {
|
||||
while ((c = getopt(argc, argv, "hiABcxdtve:E:f:l:m:n:N:s:D:O:P:")) != -1) {
|
||||
switch(c) {
|
||||
case 'h': usage(); break;
|
||||
case 'A': qType = qtArchive; break;
|
||||
@ -131,6 +137,9 @@ int main(int argc, char *argv[]) {
|
||||
case 'l': lenstr = optarg; break;
|
||||
case 'D': desc = optarg; break;
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
case 'm': digest = optarg; break;
|
||||
#endif
|
||||
case 'O': options = optarg; break;
|
||||
|
||||
case 'P': pitdate = optarg; break;
|
||||
@ -224,7 +233,11 @@ int main(int argc, char *argv[]) {
|
||||
if (length <= 0)
|
||||
debugLog(0,stderr,"tsmpipe: ERROR: Provide positive length, overestimate if guessing",1);
|
||||
|
||||
#ifdef USE_DIGEST
|
||||
rc = tsm_sendfile(dsmHandle,space,filename,length,desc,((qType == qtArchive) ? stArchiveMountWait : stBackupMountWait),digest);
|
||||
#else
|
||||
rc = tsm_sendfile(dsmHandle,space,filename,length,desc,((qType == qtArchive) ? stArchiveMountWait : stBackupMountWait));
|
||||
#endif
|
||||
break;
|
||||
|
||||
case ACTION_DELETE:
|
||||
|
@ -6,6 +6,9 @@
|
||||
#define ACTION_DELETE 4
|
||||
#define ACTION_LIST 5
|
||||
|
||||
// If you want to use MD5/SHA1 calculations as the data goes in here, ensure this is defined.
|
||||
#define USE_DIGEST
|
||||
|
||||
typedef int (*tsm_query_callback)(dsmQueryType, DataBlk *, void *);
|
||||
|
||||
struct matchone_cb_data { int numfound; dsStruct64_t objId; dsUint32_t copyGroup; };
|
||||
@ -22,7 +25,11 @@ extern dsBool_t compressEnabled;
|
||||
extern int tsm_deletefile (dsUint32_t dsmHandle, dsmQueryType qType, qryArchiveData qaData, qryBackupData qbData);
|
||||
extern int tsm_listfile (dsUint32_t dsmHandle, dsmQueryType qType, qryArchiveData qaData, qryBackupData qbData);
|
||||
extern int tsm_restorefile(dsUint32_t dsmHandle, dsmQueryType qType, qryArchiveData qaData, qryBackupData qbData);
|
||||
#ifdef USE_DIGEST
|
||||
extern int tsm_sendfile (dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype, char *digest);
|
||||
#else
|
||||
extern int tsm_sendfile (dsUint32_t dsmHandle, char *fsname, char *filename, long long length, char *description, dsmSendType sendtype);
|
||||
#endif
|
||||
extern int tsm_sessioninfo(dsUint32_t dsmHandle);
|
||||
|
||||
extern char *dsmDateToStr(dsmDate date);
|
||||
|
Reference in New Issue
Block a user