00001 #include "reGlobalsExtern.h"
00002 #include "dataObjChksum.h"
00003 #include "objMetaOpr.h"
00004 #include "resource.h"
00005 #include "specColl.h"
00006 #include "dataObjOpr.h"
00007 #include "physPath.h"
00008 #include "rsApiHandler.h"
00009 #include "modDataObjMeta.h"
00010 #include "getRemoteZoneResc.h"
00011
00012
00013
00014 #include "eirods_resource_backport.h"
00015
00016
00017 int
00018 rsDataObjChksum (rsComm_t *rsComm, dataObjInp_t *dataObjChksumInp,
00019 char **outChksum)
00020 {
00021 int status;
00022 dataObjInfo_t *dataObjInfoHead;
00023 int remoteFlag;
00024 rodsServerHost_t *rodsServerHost;
00025 specCollCache_t *specCollCache = NULL;
00026
00027 resolveLinkedPath (rsComm, dataObjChksumInp->objPath, &specCollCache,&dataObjChksumInp->condInput);
00028
00029 remoteFlag = getAndConnRemoteZone (rsComm, dataObjChksumInp, &rodsServerHost, REMOTE_OPEN);
00030
00031 if (remoteFlag < 0) {
00032 return (remoteFlag);
00033 } else if (remoteFlag == REMOTE_HOST) {
00034 status = rcDataObjChksum (rodsServerHost->conn, dataObjChksumInp,
00035 outChksum);
00036 return status;
00037 } else {
00038 status = _rsDataObjChksum (rsComm, dataObjChksumInp, outChksum,
00039 &dataObjInfoHead);
00040 }
00041 freeAllDataObjInfo (dataObjInfoHead);
00042 rodsLog( LOG_NOTICE, "rsDataObjChksum - returning status %d", status );
00043 return (status);
00044 }
00045
00046 int
00047 _rsDataObjChksum (rsComm_t *rsComm, dataObjInp_t *dataObjInp,
00048 char **outChksumStr, dataObjInfo_t **dataObjInfoHead)
00049 {
00050 int status;
00051 dataObjInfo_t *tmpDataObjInfo;
00052 int allFlag;
00053 int verifyFlag;
00054 int forceFlag;
00055
00056 if (getValByKey (&dataObjInp->condInput, CHKSUM_ALL_KW) != NULL) {
00057 allFlag = 1;
00058 } else {
00059 allFlag = 0;
00060 }
00061
00062 if (getValByKey (&dataObjInp->condInput, VERIFY_CHKSUM_KW) != NULL) {
00063 verifyFlag = 1;
00064 } else {
00065 verifyFlag = 0;
00066 }
00067
00068 if (getValByKey (&dataObjInp->condInput, FORCE_CHKSUM_KW) != NULL) {
00069 forceFlag = 1;
00070 } else {
00071 forceFlag = 0;
00072 }
00073
00074 *dataObjInfoHead = NULL;
00075 *outChksumStr = NULL;
00076 status = getDataObjInfoIncSpecColl (rsComm, dataObjInp, dataObjInfoHead);
00077
00078 if (status < 0) {
00079 return status;
00080 } else if (allFlag == 0) {
00081
00082 status = sortObjInfoForOpen (rsComm, dataObjInfoHead, &dataObjInp->condInput, 0);
00083
00084 if (status < 0)
00085 return status;
00086
00087 tmpDataObjInfo = *dataObjInfoHead;
00088 if (tmpDataObjInfo->next == NULL) {
00089
00090 if (strlen (tmpDataObjInfo->chksum) > 0) {
00091 if (verifyFlag == 0 && forceFlag == 0) {
00092 *outChksumStr = strdup (tmpDataObjInfo->chksum);
00093 return (0);
00094 }
00095 }
00096 } else {
00097 while (tmpDataObjInfo != NULL) {
00098 if (tmpDataObjInfo->replStatus > 0 &&strlen (tmpDataObjInfo->chksum) > 0) {
00099 if (verifyFlag == 0 && forceFlag == 0) {
00100 *outChksumStr = strdup (tmpDataObjInfo->chksum);
00101 return (0);
00102 } else {
00103 break;
00104 }
00105 }
00106
00107 tmpDataObjInfo = tmpDataObjInfo->next;
00108 }
00109 }
00110
00111 if (tmpDataObjInfo == NULL) {
00112 tmpDataObjInfo = *dataObjInfoHead;
00113 }
00114 if (verifyFlag > 0 && strlen (tmpDataObjInfo->chksum) > 0) {
00115 status = verifyDatObjChksum (rsComm, tmpDataObjInfo,
00116 outChksumStr);
00117 } else {
00118 status = dataObjChksumAndRegInfo (rsComm, tmpDataObjInfo,outChksumStr);
00119
00120 }
00121
00122 return (status);
00123
00124 }
00125
00126
00127 tmpDataObjInfo = *dataObjInfoHead;
00128 while (tmpDataObjInfo != NULL) {
00129 char *tmpChksumStr;
00130 dataObjInfo_t *outDataObjInfo = NULL;
00131
00132 std::string resc_class;
00133 eirods::error err = eirods::get_resource_property< std::string >( tmpDataObjInfo->rescInfo->rescName, "class", resc_class );
00134 if( !err.ok() ) {
00135 eirods::log( PASSMSG( "failed in get_resource_property [class]", err ) );
00136 }
00137
00138 #if 0 // JMC - legacy resource
00139 if (rescClass == COMPOUND_CL) {
00140
00141 if ((status = getCacheDataInfoForRepl (rsComm, *dataObjInfoHead,
00142 NULL, tmpDataObjInfo, &outDataObjInfo)) >= 0) {
00143 tmpDataObjInfo = tmpDataObjInfo->next;
00144 status = 0;
00145 continue;
00146 }
00147 } else
00148 #endif // JMC - legacy resource
00149 if ( resc_class == "bundle" ) {
00150
00151 tmpDataObjInfo = tmpDataObjInfo->next;
00152 status = 0;
00153 continue;
00154 }
00155 if (strlen (tmpDataObjInfo->chksum) == 0) {
00156
00157 status = dataObjChksumAndRegInfo (rsComm, tmpDataObjInfo,
00158 &tmpChksumStr);
00159 } else if (verifyFlag > 0) {
00160 status = verifyDatObjChksum (rsComm, tmpDataObjInfo,
00161 &tmpChksumStr);
00162 } else if (forceFlag > 0) {
00163 status = dataObjChksumAndRegInfo (rsComm, tmpDataObjInfo,
00164 &tmpChksumStr);
00165 } else {
00166 tmpChksumStr = strdup (tmpDataObjInfo->chksum);
00167 status = 0;
00168 }
00169
00170 if (status < 0) {
00171 return (status);
00172 }
00173 if (tmpDataObjInfo->replStatus > 0 && *outChksumStr == NULL) {
00174 *outChksumStr = tmpChksumStr;
00175 } else {
00176
00177 if (strlen (tmpDataObjInfo->chksum) == 0) {
00178 rstrcpy (tmpDataObjInfo->chksum, tmpChksumStr, NAME_LEN);
00179 }
00180 free (tmpChksumStr);
00181 }
00182 tmpDataObjInfo = tmpDataObjInfo->next;
00183 }
00184 if (*outChksumStr == NULL) {
00185 *outChksumStr = strdup ((*dataObjInfoHead)->chksum);
00186 }
00187
00188 return (status);
00189 }
00190
00191 int
00192 dataObjChksumAndRegInfo (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00193 char **outChksumStr)
00194 {
00195 int status;
00196 keyValPair_t regParam;
00197 modDataObjMeta_t modDataObjMetaInp;
00198
00199 status = _dataObjChksum (rsComm, dataObjInfo, outChksumStr);
00200
00201 if (status < 0) {
00202 rodsLog( LOG_ERROR,"dataObjChksumAndRegInfo: _dataObjChksum error for %s, status = %d",
00203 dataObjInfo->objPath, status );
00204 return status;
00205 }
00206
00207 if (dataObjInfo->specColl != NULL) {
00208 return (status);
00209 }
00210
00211 memset (®Param, 0, sizeof (regParam));
00212 addKeyVal (®Param, CHKSUM_KW, *outChksumStr);
00213 modDataObjMetaInp.dataObjInfo = dataObjInfo;
00214 modDataObjMetaInp.regParam = ®Param;
00215 status = rsModDataObjMeta (rsComm, &modDataObjMetaInp);
00216 rodsLog( LOG_NOTICE, "dataObjChksumAndRegInfo - rsModDataObjMeta status %d", status );
00217 clearKeyVal (®Param);
00218
00219 return (status);
00220 }
00221
00222 int
00223 verifyDatObjChksum (rsComm_t *rsComm, dataObjInfo_t *dataObjInfo,
00224 char **outChksumStr)
00225 {
00226 int status;
00227
00228 status = _dataObjChksum (rsComm, dataObjInfo, outChksumStr);
00229 if (status < 0) {
00230 rodsLog (LOG_ERROR,
00231 "verifyDatObjChksum:_dataObjChksum error for %s, stat=%d",
00232 dataObjInfo->objPath, status);
00233 return (status);
00234 }
00235
00236 if (strcmp (*outChksumStr, dataObjInfo->chksum) != 0) {
00237 rodsLog (LOG_ERROR,
00238 "verifyDatObjChksum: computed chksum %s != icat value %s for %s",
00239 *outChksumStr, dataObjInfo->chksum, dataObjInfo->objPath);
00240 return (USER_CHKSUM_MISMATCH);
00241 } else {
00242 return status;
00243 }
00244 }
00245
00246