Advertisement
Guest User

Untitled

a guest
Sep 24th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use File::Find::Rule;
  6. use Digest::SHA ();
  7. use Parallel::ForkManager;
  8. use File::Copy;
  9. use File::LibMagic;
  10.  
  11. ########################
  12. # USAGE
  13. my ( $target, $dump ) = @ARGV;
  14. if ( not defined $target ) { die "usage: TARGET ARGV[0] & dump argv[1]"; }
  15. if ( not defined $dump ) { die "usage: target argv[0] & DUMP ARGV[1]"; }
  16.  
  17. #########################
  18. # JOBS
  19. use constant JOBS_PER_WORKER => 1000;
  20. use constant MAX_PROCESSES => 4;
  21.  
  22. ############################
  23. # RETURN ALL FILES RECURSIVE
  24. my $rule = File::Find::Rule->file()->start($target);
  25. my $manager = Parallel::ForkManager->new(MAX_PROCESSES);
  26. my $magic = File::LibMagic->new();
  27.  
  28. $manager->set_waitpid_blocking_sleep(0);
  29.  
  30. my @spool;
  31. while ( defined( my $file = $rule->match ) ) {
  32. push @spool, $file;
  33. run_spooled() if JOBS_PER_WORKER <= @spool;
  34. }
  35.  
  36. run_spooled() if @spool;
  37.  
  38. $manager->wait_all_children;
  39.  
  40. sub run_spooled {
  41. my (@jobs) = splice @spool, 0, JOBS_PER_WORKER, ();
  42.  
  43. my $pid = $manager->start and return;
  44. for my $file (@jobs) {
  45. my ($sha) = file_digest($file);
  46. my $cur = "$dump/meta/$sha";
  47. open my $fh, '>>', $cur or die "Meta File Creation FAIL $file";
  48. printf {$fh} "%s\n%s\n%s\n%s\n",
  49. name($file),
  50. path($file),
  51. file_mime_encoding($file),
  52. size($file);
  53. populate($file);
  54. }
  55.  
  56. $manager->finish;
  57. }
  58.  
  59. sub file_digest {
  60. my ($filename) = @_;
  61. my $digester = Digest::SHA->new('sha256');
  62. $digester->addfile( $filename, 'b' );
  63. return $digester->hexdigest;
  64. }
  65.  
  66. sub name {
  67. my ($filename) = @_;
  68. $filename =~ s#^.*/##;
  69. return $filename;
  70. }
  71.  
  72. sub path {
  73. my ($filename) = @_;
  74. $filename =~ s#/#_#g;
  75. return $filename;
  76. }
  77.  
  78. #sub copy {
  79. # my ($filename) = @_;
  80.  
  81.  
  82. sub file_mime_encoding {
  83. my ($filename) = @_;
  84. my $info = $magic->info_from_filename($filename);
  85. my $des = $info->{description};
  86. $des =~ s#[/ ]#.#g;
  87. $des =~ s/,/_/g;
  88. my $md = $info->{mime_type};
  89. $md =~ s#[/ ]#.#g;
  90. my $enc = sprintf("%s %s %s", $des, $md, $info->{encoding});
  91. return $enc;
  92. }
  93.  
  94. sub size {
  95. my $size = [ stat $_[0] ]->[7];
  96. return $size;
  97. }
  98.  
  99. sub populate {
  100. # Copy file into $dump location
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement