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