30 #undef ZYPP_BASE_LOGGER_LOGGROUP
31 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp:fetcher"
67 if ( lhs->location.medianr() == rhs->location.medianr() )
68 return lhs->location.filename() < rhs->location.filename();
70 return lhs->location.medianr() < rhs->location.medianr();
118 return str << obj->location;
136 Fetcher::Options
options()
const;
147 void start(
const Pathname &dest_dir,
154 static shared_ptr<Impl> _nullimpl(
new Impl );
175 void readIndex(
const Pathname &index,
const Pathname &basedir );
196 void validate(
const Pathname & localfile_r,
const std::list<FileChecker> & checkers_r );
202 const Pathname &dest_dir, FetcherJob::Flags flags );
210 const Pathname &dest_dir );
217 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
220 {
return new Impl( *
this ); }
223 std::set<FetcherIndex_Ptr,SameFetcherIndex>
_indexes;
237 job.reset(
new FetcherJob(resource, deltafile));
260 job->checkers.push_back(checker);
265 _resources.push_back(job);
275 job->checkers.push_back(checker);
281 _resources.push_back(job);
290 job->checkers.push_back(checker);
291 _resources.push_back(job);
296 MIL <<
"adding index " << resource << endl;
311 PathInfo info(cache_dir);
312 if ( info.isExist() )
316 DBG <<
"Adding fetcher cache: '" << cache_dir <<
"'." << endl;
317 _caches.insert(cache_dir);
322 ERR <<
"Not adding cache: '" << cache_dir <<
"'. Not a directory." << endl;
327 ERR <<
"Not adding cache '" << cache_dir <<
"'. Path does not exists." << endl;
340 Pathname cacheLocation = destDir_r / resource_r.
filename();
341 if ( PathInfo(cacheLocation).isExist() &&
is_checksum( cacheLocation, resource_r.
checksum() ) )
343 swap( ret, cacheLocation );
347 MIL <<
"start fetcher with " << _caches.size() <<
" cache directories." << endl;
348 for(
const Pathname & cacheDir : _caches )
350 cacheLocation = cacheDir / resource_r.
filename();
351 if ( PathInfo(cacheLocation).isExist() &&
is_checksum( cacheLocation, resource_r.
checksum() ) )
353 MIL <<
"file " << resource_r.
filename() <<
" found in cache " << cacheDir << endl;
354 swap( ret, cacheLocation );
366 MIL <<
"Checking job [" << localfile_r <<
"] (" << checkers_r.size() <<
" checkers )" << endl;
371 chkfnc( localfile_r );
373 ERR <<
"Invalid checker for '" << localfile_r <<
"'" << endl;
394 const Pathname &dest_dir )
396 auto fnc_addIfInContent( [&](
const std::string & index_r ) ->
bool
405 downloadAndReadIndexList( media, dest_dir );
411 fnc_addIfInContent(
"CHECKSUMS" ) || fnc_addIfInContent(
"SHA1SUMS" );
415 fnc_addIfInContent(
"content" );
423 if ( _dircontent.find(resource.
filename().asString())
424 != _dircontent.end() )
428 std::copy(filled.begin(), filled.end(), std::back_inserter(content));
437 std::copy(tofill.begin(), tofill.end(), std::back_inserter(content));
438 _dircontent[resource.
filename().asString()] = tofill;
444 const Pathname &dest_dir, FetcherJob::Flags flags )
448 MIL <<
"Adding directory " << resource.
filename() << endl;
451 getDirectoryContent(media, resource, content);
456 WAR <<
"Skiping subtree hidden at " << resource.
filename() << endl;
462 autoaddIndexes(content, media, resource, dest_dir);
464 for ( filesystem::DirContent::const_iterator it = content.begin();
472 Pathname filename = resource.
filename() + it->name;
480 if ( _checksums.find(filename.asString()) != _checksums.end() )
483 chksm = _checksums[filename.asString()];
487 WAR <<
"Resource " << filename <<
" has no checksum in the index either." << endl;
497 addDirJobs(media, filename, dest_dir, flags);
512 scoped_ptr<MediaSetAccess::ReleaseFileGuard> releaseFileGuard;
515 Pathname tmpFile = locateInCache( resource, destDir_r );
516 if ( tmpFile.empty() )
518 MIL <<
"Not found in cache, retrieving..." << endl;
527 if ( tmpFile == destFullPath )
531 validate( tmpFile, jobp_r->checkers );
534 if ( tmpFile == destFullPath )
535 destFullPath.resetDispose();
538 if (
assert_dir( destFullPath->dirname() ) != 0 )
542 ZYPP_THROW(
Exception(
"Can't hardlink/copy " + tmpFile.asString() +
" to " + destDir_r.asString() ) );
550 WAR <<
"optional resource " << resource <<
" could not be transferred." << endl;
569 void consumeIndex(
const parser::susetags::RepoIndex_Ptr & data_r )
570 { _repoindex = data_r; }
578 if ( index.basename() ==
"CHECKSUMS" || index.basename() ==
"SHA1SUMS" )
579 readChecksumsIndex(index, basedir);
580 else if ( index.basename() ==
"content" )
581 readContentFileIndex(index, basedir);
583 WAR << index <<
": index file format not known" << endl;
591 MIL << index <<
" contains " << reader.
_repoindex->mediaFileChecksums.size() <<
" checksums." << endl;
595 _checksums[(basedir + it->first).
asString()] = it->second;
602 std::ifstream in( index.c_str() );
606 while (
getline( in, buffer ) )
609 if ( buffer[0] ==
'#' )
613 if ( checksum.
empty() )
616 if ( buffer.empty() )
618 WAR <<
"Missing filename in CHECKSUMS file: " << index.asString() <<
" (" << checksum <<
")" << endl;
631 MIL <<
"downloading index " << resource << endl;
657 fetcher.
start( dest_dir, media );
659 if ( PathInfo(dest_dir + sigloc.
filename()).isExist() )
666 fetcher.
start( dest_dir, media );
670 if ( PathInfo(dest_dir + keyloc.
filename()).isExist() )
673 WAR <<
"No public key specified by user for index '" << keyloc.
filename() <<
"'"<< endl;
677 fetcher.
start( dest_dir, media );
688 if ( _indexes.empty() )
690 MIL <<
"No indexes to read." << endl;
694 for_( it_idx, _indexes.begin(), _indexes.end() )
696 if ( (*it_idx)->read )
698 DBG <<
"Already read index " << PathInfo(dest_dir + (*it_idx)->location.filename()) << endl;
703 downloadIndex( media, (*it_idx)->location, dest_dir );
705 readIndex( dest_dir + (*it_idx)->location.filename(), (*it_idx)->location.filename().dirname() );
707 MIL <<
"Remember read index " << PathInfo(dest_dir + (*it_idx)->location.filename()) << endl;
708 (*it_idx)->read =
true;
711 MIL <<
"done reading indexes" << endl;
721 progress.
sendTo(progress_receiver);
723 downloadAndReadIndexList(media, dest_dir);
730 addDirJobs(media, location, dest_dir, jobp->flags);
744 getDirectoryContent(media, jobp->location.filename().dirname(), content);
747 MIL <<
"Autodiscovering signed indexes on '"
748 << jobp->location.filename().dirname() <<
"' for '"
749 << jobp->location.filename() <<
"'" << endl;
751 autoaddIndexes(content, media, jobp->location.filename().dirname(), dest_dir);
755 getDirectoryContent(media, Pathname(
"/"), content);
758 MIL <<
"Autodiscovering signed indexes on '"
760 << jobp->location.filename() <<
"'" << endl;
762 autoaddIndexes(content, media, Pathname(
"/"), dest_dir);
767 if ( jobp->location.checksum().empty() )
769 if ( _checksums.find(jobp->location.filename().asString())
770 != _checksums.end() )
772 CheckSum chksm = _checksums[jobp->location.filename().asString()];
774 jobp->checkers.push_back(digest_check);
784 jobp->checkers.push_back(digest_check);
792 jobp->checkers.push_back(digest_check);
797 provideToDest( media, dest_dir, jobp );
799 if ( ! progress.incr() )
807 for ( std::list<FetcherJob_Ptr>::const_iterator it_res = obj.
_resources.begin(); it_res != obj.
_resources.end(); ++it_res )
881 return str << *obj.
_pimpl;