00001
00002
00003
00004
00005
00006
00007
00008 #include "GeneratorInterface/SherpaInterface/interface/SherpackFetcher.h"
00009
00010
00011
00012 namespace spf {
00013
00014 SherpackFetcher::SherpackFetcher(edm::ParameterSet const& pset)
00015 {
00016 if (!pset.exists("SherpaProcess")) SherpaProcess="";
00017 else SherpaProcess=pset.getParameter<std::string>("SherpaProcess");
00018 if (!pset.exists("SherpackLocation")) SherpackLocation="";
00019 else SherpackLocation=pset.getParameter<std::string>("SherpackLocation");
00020 if (!pset.exists("SherpackChecksum")) SherpackChecksum="";
00021 else SherpackChecksum=pset.getParameter<std::string>("SherpackChecksum");
00022 if (!pset.exists("FetchSherpack")) FetchSherpack=false;
00023 else FetchSherpack=pset.getParameter<bool>("FetchSherpack");
00024 if (!pset.exists("SherpaPath")) SherpaPath="";
00025 else SherpaPath=pset.getParameter<std::string>("SherpaPath");
00026
00027 }
00028
00029 int SherpackFetcher::Fetch()
00030 {
00031
00032 std::string option = "-c";
00033 std::string constr = "`cmsGetFnConnect frontier://smallfiles`";
00034 std::string sherpack = "sherpa_" + SherpaProcess + "_MASTER.tgz";
00035 std::string sherpackunzip = "sherpa_" + SherpaProcess + "_MASTER.tar";
00036 std::string path = SherpackLocation + "/" + sherpack;
00037
00038
00039
00040
00041 if(FetchSherpack == true){
00042 std::cout << "SherpackFetcher: Trying to fetch the Sherpack " << sherpack << std::endl;
00043 int res =FnFileGet(path);
00044 if (res!=1) {
00045 std::cout <<"SherpackFetcher: Fetching of Sherpack did not succeed, terminating" << std::endl;
00046 return -1;
00047 }
00048 std::cout << "SherpackFetcher: Fetching successful" << std::endl;
00049 }
00050
00051 std::ifstream my_file(sherpack.c_str());
00052 if (!my_file.good())
00053 {
00054 std::cout << "SherpackFetcher: No Sherpack found" << std::endl;
00055 return -2;
00056 }
00057 my_file.close();
00058 std::cout << "SherpackFetcher: Sherpack found" << std::endl;
00059
00060 if(SherpackChecksum!=""){
00061 char md5checksum[33];
00062 spu::md5_File(sherpack, md5checksum);
00063 for (int k=0; k<33; k++){
00064 if (md5checksum[k]!= SherpackChecksum[k]) {
00065 std::cout << "SherpackFetcher: failure, calculated and specified checksums differ!" << std::endl;
00066 return -3;
00067 }
00068 }
00069 std::cout << "SherpackFetcher: Calculated checksum of the Sherpack is " << md5checksum << " and matches" << std::endl;
00070 } else {
00071 std::cout << "SherpackFetcher: Ignoring Checksum" << std::endl;
00072 }
00073
00074
00075 std::cout << "SherpackFetcher: Trying to unzip the Sherpack" << std::endl;
00076 int res=spu::Unzip(sherpack,sherpackunzip);
00077 if (res!=0) {
00078 std::cout << "SherpackFetcher: Decompressing failed " << std::endl;
00079 return -4;
00080 }
00081 std::cout << "SherpackFetcher: Decompressing successful " << std::endl;
00082
00083 FILE *file = fopen(const_cast<char*>(sherpackunzip.c_str()),"r");
00084 if( file ) {
00085 std::cout << "SherpackFetcher: Decompressed Sherpack exists with name " << sherpackunzip << " starting to untar it"<<std::endl;
00086 spu::Untar(file,SherpaPath.c_str());
00087 } else {
00088 std::cout << "SherpackFetcher: Could not open decompressed Sherpack" << std::endl;
00089 return -5;
00090 }
00091 fclose(file);
00092 return 0;
00093 }
00094
00095 int SherpackFetcher::FnFileGet(std::string pathstring)
00096 {
00097 int ec;
00098 unsigned long channel;
00099 FrontierConfig *config;
00100
00101 std::string connectstr="";
00102 try {
00103 std::auto_ptr<edm::SiteLocalConfig> slcptr(new edm::service::SiteLocalConfigService(edm::ParameterSet()));
00104 boost::shared_ptr<edm::serviceregistry::ServiceWrapper<edm::SiteLocalConfig> > slc(new edm::serviceregistry::ServiceWrapper<edm::SiteLocalConfig>(slcptr));
00105 edm::ServiceToken slcToken = edm::ServiceRegistry::createContaining(slc);
00106 edm::ServiceRegistry::Operate operate(slcToken);
00107
00108 edm::Service<edm::SiteLocalConfig> localconfservice;
00109 localconfservice->lookupCalibConnect("frontier://smallfiles");
00110 connectstr=localconfservice->lookupCalibConnect("frontier://smallfiles");
00111 } catch(cms::Exception const& e) {
00112 std::cerr << e.explainSelf() << std::endl;
00113 return 2;
00114 }
00115
00116 if(frontier_init(malloc,free)!=0)
00117 {
00118 fprintf(stderr,"Error initializing frontier client: %s\n",frontier_getErrorMsg());
00119 return 2;
00120 }
00121 ec=FRONTIER_OK;
00122
00123 config=frontierConfig_get(connectstr.c_str(),"",&ec);
00124 if(ec!=FRONTIER_OK)
00125 {
00126 fprintf(stderr,"Error getting frontierConfig object: %s\n",frontier_getErrorMsg());
00127 return 2;
00128 }
00129 channel=frontier_createChannel2(config,&ec);
00130 if(ec!=FRONTIER_OK)
00131 {
00132 fprintf(stderr,"Error creating frontier channel: %s\n",frontier_getErrorMsg());
00133 return 2;
00134 }
00135
00136
00137 char uribuf[4096];
00138 FrontierRSBlob *frsb;
00139 int fd;
00140 int n;
00141 char *p;
00142 const char *localname;
00143
00144 const char *path=pathstring.c_str();
00145 snprintf(uribuf,sizeof(uribuf)-1, "Frontier/type=frontier_file:1:DEFAULT&encoding=BLOB&p1=%s",path);
00146 ec=frontier_getRawData(channel,uribuf);
00147 if(ec!=FRONTIER_OK)
00148 {
00149 fprintf(stderr,"Error getting data for %s: %s\n",path,frontier_getErrorMsg());
00150 return 3;
00151 }
00152 frsb=frontierRSBlob_open(channel,0,1,&ec);
00153 if(ec!=FRONTIER_OK)
00154 {
00155 fprintf(stderr,"Error opening result blob for %s: %s\n",path,frontier_getErrorMsg());
00156 return 3;
00157 }
00158
00159 (void)frontierRSBlob_getByte(frsb,&ec);
00160 if(ec!=FRONTIER_OK)
00161 {
00162 fprintf(stderr,"Error getting result type for %s: %s\n",path,frontier_getErrorMsg());
00163 return 3;
00164 }
00165 n=frontierRSBlob_getInt(frsb,&ec);
00166 if(ec!=FRONTIER_OK)
00167 {
00168 fprintf(stderr,"Error getting result size for %s: %s\n",path,frontier_getErrorMsg());
00169 return 3;
00170 }
00171 p=frontierRSBlob_getByteArray(frsb,n,&ec);
00172 if(ec!=FRONTIER_OK)
00173 {
00174 fprintf(stderr,"Error getting result data for %s: %s\n",path,frontier_getErrorMsg());
00175 return 3;
00176 }
00177 localname=strrchr(path,'/');
00178 if(localname==NULL)
00179 localname=pathstring.c_str();
00180 else
00181 localname++;
00182 fd=open(localname,O_CREAT|O_TRUNC|O_WRONLY,0666);
00183 if(fd==-1)
00184 {
00185 fprintf(stderr,"Error creating %s: %s\n",localname,strerror(errno));
00186 ec=-1;
00187 return 3;
00188 }
00189 if(write(fd,p,n)<0)
00190 {
00191 fprintf(stderr,"Error writing to %s: %s\n",localname,strerror(errno));
00192 ec=-1;
00193 close(fd);
00194 return 3;
00195 }
00196 close(fd);
00197 printf("%d bytes written to %s\n",n,localname);
00198 frontierRSBlob_close(frsb,&ec);
00199
00200
00201 frontier_closeChannel(channel);
00202
00203 return (ec==FRONTIER_OK);
00204 }
00205
00206 SherpackFetcher::~SherpackFetcher()
00207 {
00208 }
00209
00210
00211
00212 }
00213
00214
00215