apt.in 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. #! @PERL@
  2. #
  3. # 1999 (c) Piotr Roszatycki <dexter@debian.org>
  4. # This software is under GNU license
  5. # last modification: 1999-12-08
  6. #
  7. # apt
  8. sub bt
  9. {
  10. my ($dt) = @_;
  11. my (@time);
  12. @time = localtime($dt);
  13. $bt = sprintf "%02d-%02d-%02d %02d:%02d", $time[4]+1, $time[3], $time[5], $time[2], $time[1];
  14. return $bt;
  15. }
  16. sub ft
  17. {
  18. my ($f) = @_;
  19. return "d" if -d $f;
  20. return "l" if -l $f;
  21. return "p" if -p $f;
  22. return "S" if -S $f;
  23. return "b" if -b $f;
  24. return "c" if -c $f;
  25. return "-";
  26. }
  27. sub fm
  28. {
  29. my ($n) = @_;
  30. my ($m);
  31. if( $n & 0400 ) {
  32. $m .= "r";
  33. } else {
  34. $m .= "-";
  35. }
  36. if( $n & 0200 ) {
  37. $m .= "w";
  38. } else {
  39. $m .= "-";
  40. }
  41. if( $n & 04000 ) {
  42. $m .= "s";
  43. } elsif( $n & 0100 ) {
  44. $m .= "x";
  45. } else {
  46. $m .= "-";
  47. }
  48. if( $n & 0040 ) {
  49. $m .= "r";
  50. } else {
  51. $m .= "-";
  52. }
  53. if( $n & 0020 ) {
  54. $m .= "w";
  55. } else {
  56. $m .= "-";
  57. }
  58. if( $n & 02000 ) {
  59. $m .= "s";
  60. } elsif( $n & 0010 ) {
  61. $m .= "x";
  62. } else {
  63. $m .= "-";
  64. }
  65. if( $n & 0004 ) {
  66. $m .= "r";
  67. } else {
  68. $m .= "-";
  69. }
  70. if( $n & 0002 ) {
  71. $m .= "w";
  72. } else {
  73. $m .= "-";
  74. }
  75. if( $n & 01000 ) {
  76. $m .= "t";
  77. } elsif( $n & 0001 ) {
  78. $m .= "x";
  79. } else {
  80. $m .= "-";
  81. }
  82. return $m;
  83. }
  84. sub ls {
  85. my ($file,$path,$mode) = @_;
  86. my @stat = stat($file);
  87. # mode, nlink, uid, gid, size, mtime, filename
  88. printf "%s %d %d %d %d %s %s\n", $mode || ft($file).fm($stat[2] & 07777),
  89. $stat[3], $stat[4], $stat[5], $stat[7], bt($stat[9]), $path;
  90. }
  91. $DATE=bt(time());
  92. sub list
  93. {
  94. my ($pkg, $fn, $dn, $sz, $bt);
  95. my($check,$stats,$config);
  96. chop($check = `apt-get -q check 2>/dev/null`);
  97. chop($available = `apt-cache dumpavail 2>/dev/null`);
  98. chop($stats = `apt-cache stats 2>/dev/null`);
  99. chop($config = `apt-config dump 2>&1`);
  100. $sz = length($check);
  101. print "-r--r--r-- 1 root root $sz $DATE CHECK\n";
  102. $sz = length($available);
  103. print "-r--r--r-- 1 root root $sz $DATE AVAILABLE\n";
  104. $sz = length($stats);
  105. print "-r--r--r-- 1 root root $sz $DATE STATS\n";
  106. $sz = length($config);
  107. print "-r--r--r-- 1 root root $sz $DATE CONFIG\n";
  108. $sz = length($pressupdate);
  109. print "-r-xr--r-- 1 root root $sz $DATE UPDATE\n";
  110. $sz = length($pressupgrade);
  111. print "-r-xr--r-- 1 root root $sz $DATE UPGRADE\n";
  112. print "-r-xr--r-- 1 root root $sz $DATE DIST-UPGRADE\n";
  113. ls("/etc/apt/sources.list","sources.list");
  114. ls("/etc/apt/apt.conf","apt.conf");
  115. print "drwxr-xr-x 1 root root 0 $DATE all\n";
  116. if ( open(PIPEIN, "find /var/cache/apt/archives -type f |") ) {
  117. while(<PIPEIN>) {
  118. chop;
  119. next if /\/lock$/;
  120. my $file = $_;
  121. s%/var/cache/apt/archives/%CACHE/%;
  122. ls($file, $_);
  123. }
  124. close PIPEIN;
  125. }
  126. my %sects = ();
  127. my %debd = ();
  128. my %deba = ();
  129. open STAT, "/var/lib/dpkg/status"
  130. or exit 1;
  131. while( <STAT> ) {
  132. chop;
  133. if( /^([\w-]*): (.*)/ ) {
  134. $pkg = $2 if( lc($1) eq 'package' );
  135. $debd{$pkg}{lc($1)} = $2;
  136. }
  137. }
  138. close STAT;
  139. foreach $pkg (sort keys %debd) {
  140. next if $debd{$pkg}{status} =~ /not-installed/;
  141. $fn = $debd{$pkg}{package}. "_". $debd{$pkg}{version};
  142. $dn = $debd{$pkg}{section};
  143. if( ! $dn ) {
  144. $dn = "unknown";
  145. } elsif( $dn =~ /^(non-us)$/i ) {
  146. $dn .= "/main";
  147. } elsif( $dn !~ /\// ) {
  148. $dn = "main/". $dn;
  149. }
  150. unless( $sects{$dn} ) {
  151. my $sub = $dn;
  152. while( $sub =~ s!^(.*)/[^/]*$!$1! ) {
  153. unless( $sects{$sub} ) {
  154. print "drwxr-xr-x 1 root root 0 $DATE $sub/\n";
  155. $sects{$sub} = 1;
  156. }
  157. }
  158. print "drwxr-xr-x 1 root root 0 $DATE $dn/\n";
  159. $sects{$dn} = 1;
  160. }
  161. $sz = $debd{$pkg}{'status'} =~ /config-files/ ? 0 : $debd{$pkg}{'installed-size'} * 1024;
  162. @stat = stat("/var/lib/dpkg/info/".$debd{$pkg}{package}.".list");
  163. $bt = bt($stat[9]);
  164. print "-rw-r--r-- 1 root root $sz $bt $dn/$fn.debd\n";
  165. print "lrwxrwxrwx 1 root root $sz $bt all/$fn.debd -> ../$dn/$fn.debd\n";
  166. }
  167. open STAT, "apt-cache dumpavail |"
  168. or exit 1;
  169. while( <STAT> ) {
  170. chop;
  171. if( /^([\w-]*): (.*)/ ) {
  172. $pkg = $2 if( lc($1) eq 'package' );
  173. $deba{$pkg}{lc($1)} = $2;
  174. }
  175. }
  176. close STAT;
  177. foreach $pkg (sort keys %deba) {
  178. next if $deba{$pkg}{version} eq $debd{$pkg}{version};
  179. $fn = $deba{$pkg}{package}. "_". $deba{$pkg}{version};
  180. $dn = $deba{$pkg}{section};
  181. if( ! $dn ) {
  182. $dn = "unknown";
  183. } elsif( $dn =~ /^(non-us)$/i ) {
  184. $dn .= "/main";
  185. } elsif( $dn !~ /\// ) {
  186. $dn = "main/". $dn;
  187. }
  188. unless( $sects{$dn} ) {
  189. my $sub = $dn;
  190. while( $sub =~ s!^(.*)/[^/]*$!$1! ) {
  191. unless( $sects{$sub} ) {
  192. print "drwxr-xr-x 1 root root 0 $DATE $sub/\n";
  193. $sects{$sub} = 1;
  194. }
  195. }
  196. print "drwxr-xr-x 1 root root 0 $DATE $dn/\n";
  197. $sects{$dn} = 1;
  198. }
  199. $sz = $deba{$pkg}{'status'} =~ /config-files/ ? 0 : $deba{$pkg}{'installed-size'} * 1024;
  200. print "-rw-r--r-- 1 root root $sz $DATE $dn/$fn.deba\n";
  201. print "lrwxrwxrwx 1 root root $sz $DATE all/$fn.deba -> ../$dn/$fn.deba\n";
  202. }
  203. }
  204. sub copyout
  205. {
  206. my($archive,$filename) = @_;
  207. if( $archive eq 'CHECK' ) {
  208. system("apt-get -q check > $filename");
  209. } elsif( $archive eq 'AVAILABLE' ) {
  210. system("apt-cache dumpavail > $filename");
  211. } elsif( $archive eq 'STATS' ) {
  212. system("apt-cache stats > $filename");
  213. } elsif( $archive eq 'CONFIG' ) {
  214. system("(apt-config dump 2>&1) > $filename");
  215. } elsif( $archive eq 'UPDATE' ) {
  216. open O, ">$filename";
  217. print O $pressupdate;
  218. close O;
  219. } elsif( $archive eq 'UPGRADE' || $archive eq 'DIST-UPGRADE' ) {
  220. open O, ">$filename";
  221. print O $pressupgrade;
  222. close O;
  223. } elsif( $archive eq 'apt.conf' ) {
  224. system("cp /etc/apt/apt.conf $filename");
  225. } elsif( $archive eq 'sources.list' ) {
  226. system("cp /etc/apt/sources.list $filename");
  227. } elsif( $archive =~ /^CACHE\// ) {
  228. $archive =~ s%^CACHE/%/var/cache/apt/archives/%;
  229. system("cp $archive $filename");
  230. } else {
  231. open O, ">$filename";
  232. print O $archive, "\n";
  233. close O;
  234. }
  235. }
  236. sub copyin
  237. {
  238. my($archive,$filename) = @_;
  239. if( $archive =~ /\.deb$/ ) {
  240. system("dpkg -i $filename>/dev/null");
  241. } elsif( $archive eq 'apt.conf' ) {
  242. system("cp $filename /etc/apt/apt.conf");
  243. } elsif( $archive eq 'sources.list' ) {
  244. system("cp $filename /etc/apt/sources.list");
  245. } elsif( $archive =~ /^CACHE\// ) {
  246. $archive =~ s%^CACHE/%/var/cache/apt/archives/%;
  247. system("cp $filename $archive");
  248. } else {
  249. die "extfs: cannot create regular file \`$archive\': Permission denied\n";
  250. }
  251. }
  252. sub run
  253. {
  254. my($archive,$filename) = @_;
  255. if( $archive eq 'UPDATE' ) {
  256. system("apt-get update");
  257. } elsif( $archive eq 'UPGRADE' ) {
  258. system("apt-get upgrade -u");
  259. } elsif( $archive eq 'DIST-UPGRADE' ) {
  260. system("apt-get dist-upgrade -u");
  261. } else {
  262. die "extfs: $archive: command not found\n";
  263. }
  264. }
  265. sub rm
  266. {
  267. my($archive) = @_;
  268. if( $archive =~ /^CACHE\// ) {
  269. $archive =~ s%^CACHE/%/var/cache/apt/archives/%;
  270. system("rm -f $archive");
  271. } elsif( $archive eq 'apt.conf' ) {
  272. system("rm -f /etc/apt/apt.conf");
  273. } elsif( $archive eq 'sources.list' ) {
  274. system("rm -f /etc/apt/sources.list");
  275. } elsif( $archive =~ /\.debd?$/ ) {
  276. # uncommented and changed to use dpkg - alpha
  277. my $name = $archive;
  278. $name =~ s%.*/%%g;
  279. $name =~ s%_.*%%g;
  280. system("dpkg --remove $name >/dev/null");
  281. die("extfs: $archive: Operation not permitted\n") if $? != 0;
  282. } else {
  283. die "extfs: $archive: Operation not permitted\n";
  284. }
  285. }
  286. $pressupdate=<<EOInstall;
  287. WARNING
  288. Don\'t use this method if you don't want to retrieve new lists of packages.
  289. ==========================================================================
  290. This is not a real file. It is a way to retrieve new lists of packages.
  291. To update this information go back to the panel and press Enter on this file.
  292. EOInstall
  293. $pressupgrade=<<EOInstall;
  294. WARNING
  295. Don\'t use this method if you are not willing to perform an upgrade.
  296. ===================================================================
  297. This is not a real file. It is a way to perform an upgrade.
  298. To upgrade this information go back to the panel and press Enter on this file.
  299. EOInstall
  300. # override any locale for dates
  301. $ENV{"LC_ALL"}="C";
  302. if ($ARGV[0] eq "list") { list(); exit(0); }
  303. elsif ($ARGV[0] eq "copyout") { copyout($ARGV[2], $ARGV[3]); exit(0); }
  304. elsif ($ARGV[0] eq "copyin") { copyin($ARGV[2], $ARGV[3]); exit(0); }
  305. elsif ($ARGV[0] eq "run") { run($ARGV[2]); exit(0); }
  306. elsif ($ARGV[0] eq "rm") { rm($ARGV[2]); exit(0); }
  307. exit(1);