NICTar.pm 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package NIC::Formats::NICTar;
  2. use parent NIC::NICBase;
  3. use strict;
  4. use NIC::Formats::NICTar::File;
  5. use NIC::Formats::NICTar::Directory;
  6. use NIC::Formats::NICTar::Symlink;
  7. use Archive::Tar;
  8. use File::Temp;
  9. use File::Path;
  10. use File::Spec;
  11. use NIC::Bridge::Context;
  12. $Archive::Tar::WARN = 0;
  13. sub new {
  14. my $proto = shift;
  15. my $fh_or_tar = shift;
  16. my $class = ref($proto) || $proto;
  17. my $tar = ref($fh_or_tar) eq "Archive::Tar" ? $fh_or_tar : Archive::Tar->new($fh_or_tar);
  18. return undef if(!$tar);
  19. my $control = _fileFromTar(undef, $tar, "NIC/control");
  20. return undef if(!$control);
  21. my $self = NIC::NICBase->new(@_);
  22. $self->{_TAR} = $tar;
  23. bless($self, $class);
  24. $self->_processData($control->get_content);
  25. $self->load();
  26. return $self;
  27. }
  28. sub _fileClass { "NIC::Formats::NICTar::File"; }
  29. sub _directoryClass { "NIC::Formats::NICTar::Directory"; }
  30. sub _symlinkClass { "NIC::Formats::NICTar::Symlink"; }
  31. sub _fileFromTar {
  32. my $self = shift;
  33. my $tar = $self ? $self->{_TAR} : shift;
  34. my $filename = shift;
  35. my @_tarfiles = $tar->get_files("./$filename", $filename);
  36. return (scalar @_tarfiles > 0) ? $_tarfiles[0] : undef;
  37. }
  38. sub _processData {
  39. my $self = shift;
  40. my $data = shift;
  41. for(split /\n\r?/, $data) {
  42. $self->_processLine($_);
  43. }
  44. }
  45. sub _processLine {
  46. my $self = shift;
  47. local $_ = shift;
  48. if(/^name\s+\"(.*)\"$/ || /^name\s+(.*)$/) {
  49. $self->name($1);
  50. } elsif(/^prompt (\w+) \"(.*?)\"( \"(.*?)\")?$/) {
  51. my $key = $1;
  52. my $prompt = $2;
  53. my $default = $4 || undef;
  54. $self->registerPrompt($key, $prompt, $default);
  55. } elsif(/^constrain (file )?\"(.+)\" to (.+)$/) {
  56. my $constraint = $3;
  57. my $filename = $2;
  58. $self->registerFileConstraint($filename, $constraint);
  59. } elsif(/^ignore (\w+)$/) {
  60. $self->ignoreVariable($1);
  61. }
  62. }
  63. sub load {
  64. my $self = shift;
  65. for($self->{_TAR}->get_files()) {
  66. next if !$_->full_path || $_->full_path =~ /^(\.\/)?NIC(\/|$)/;
  67. my $n = $_->full_path;
  68. $n =~ s/^\.\///;
  69. next if length $n == 0;
  70. if($_->is_dir) {
  71. my $ref = $self->registerDirectory($n);
  72. $ref->tarfile($_);
  73. } elsif($_->is_symlink) {
  74. my $target = $_->linkname;
  75. $target =~ s/^\.\///;
  76. my $ref = $self->registerSymlink($n, $target);
  77. $ref->tarfile($_);
  78. } elsif($_->is_file) {
  79. my $ref = $self->registerFile($n);
  80. $ref->tarfile($_);
  81. }
  82. }
  83. $self->resolveSymlinks;
  84. }
  85. sub _execPackageScript {
  86. my $self = shift;
  87. my $script = shift;
  88. my $tarfile = $self->_fileFromTar("NIC/$script");
  89. return if !$tarfile || $tarfile->mode & 0500 != 0500;
  90. my $filename = File::Spec->catfile($self->{_TEMPDIR}, $script);
  91. my $nicfile = NIC::NICType->new($self, $filename);
  92. $self->_fileClass->take($nicfile);
  93. $nicfile->tarfile($tarfile);
  94. $nicfile->create();
  95. my $ret = system $filename $script;
  96. return ($ret >> 8) == 0
  97. }
  98. sub prebuild {
  99. my $self = shift;
  100. return $self->_execPackageScript("prebuild");
  101. }
  102. sub postbuild {
  103. my $self = shift;
  104. return $self->_execPackageScript("postbuild");
  105. }
  106. sub exec {
  107. my $self = shift;
  108. my $_controlpl = $self->_fileFromTar("NIC/control.pl");
  109. if($_controlpl) {
  110. return NIC::Bridge::Context->_execute($self, $_controlpl->get_content);
  111. }
  112. return 1;
  113. }
  114. sub build {
  115. my $self = shift;
  116. for(keys %{$self->{VARIABLES}}) {
  117. $ENV{"NIC_".$_} = $self->variable($_);
  118. }
  119. $self->{_TEMPDIR} = File::Temp::tempdir();
  120. $self->SUPER::build(@_);
  121. File::Path::rmtree($self->{_TEMPDIR});
  122. $self->{_TEMPDIR} = undef;
  123. }
  124. 1;