source: ProjectBuilder/devel/pb/lib/ProjectBuilder/Distribution.pm@ 315

Last change on this file since 315 was 315, checked in by Bruno Cornec, 16 years ago

Backup of local dev. cms2pkg compiles but doesn't work and even remove the SVN :-(
pb_log added

File size: 6.9 KB
RevLine 
[11]1#!/usr/bin/perl -w
[2]2#
[11]3# Creates common environment for distributions
[2]4#
5# $Id$
6#
7
[11]8use strict;
[2]9
[74]10sub pb_distro_init {
[2]11
[23]12my $ddir = shift || undef;
13my $dver = shift || undef;
[11]14my $dfam = "unknown";
15my $dtype = "unknown";
16my $dsuf = "unknown";
[2]17
[11]18# If we don't know which distribution we're on, then guess it
[74]19($ddir,$dver) = pb_get_distro() if ((not defined $ddir) || (not defined $dver));
[2]20
[171]21# There should be unicity of names between ddir dfam and dtype
[13]22# In case of duplicate, bad things can happen
[11]23if (($ddir =~ /debian/) ||
24 ($ddir =~ /ubuntu/)) {
[13]25 $dfam="du";
[11]26 $dtype="deb";
27 $dsuf=".$ddir$dver";
28} elsif ($ddir =~ /gentoo/) {
[13]29 $dfam="gen";
[11]30 $dtype="ebuild";
[226]31 $dver="nover";
32 $dsuf=".$ddir";
[11]33} elsif ($ddir =~ /slackware/) {
[13]34 $dfam="slack";
[11]35 $dtype="tgz";
36 $dsuf=".$dfam$dver";
37} elsif (($ddir =~ /suse/) ||
38 ($ddir =~ /sles/)) {
[185]39 if ($ddir =~ /opensuse/) {
40 $ddir = "suse";
41 }
[13]42 $dfam="novell";
[11]43 $dtype="rpm";
44 $dsuf=".$ddir$dver";
45} elsif (($ddir =~ /redhat/) ||
46 ($ddir =~ /rhel/) ||
47 ($ddir =~ /fedora/) ||
[146]48 ($ddir =~ /vmware/) ||
[11]49 ($ddir =~ /centos/)) {
[13]50 $dfam="rh";
[11]51 $dtype="rpm";
52 my $dver1 = $dver;
53 $dver1 =~ s/\.//;
54 if ($ddir =~ /fedora/) {
55 $dsuf=".fc$dver1";
56 } elsif ($ddir =~ /redhat/) {
57 $dsuf=".rh$dver1";
[146]58 } elsif ($ddir =~ /vmware/) {
59 $dsuf=".vwm$dver1";
[11]60 } else {
61 $dsuf=".$ddir$dver1";
62 }
63} elsif (($ddir =~ /mandrake/) ||
[171]64 ($ddir =~ /mandrakelinux/) ||
[11]65 ($ddir =~ /mandriva/)) {
[13]66 $dfam="md";
[11]67 $dtype="rpm";
[171]68 if ($ddir =~ /mandrakelinux/) {
69 $ddir = "mandrake";
70 }
[11]71 if ($ddir =~ /mandrake/) {
72 my $dver1 = $dver;
73 $dver1 =~ s/\.//;
74 $dsuf=".mdk$dver1";
75 } else {
76 $dsuf=".mdv$dver";
77 }
78} elsif ($ddir =~ /freebsd/) {
[13]79 $dfam="bsd";
[11]80 $dtype="port";
81 my $dver1 = $dver;
82 $dver1 =~ s/\.//;
83 $dsuf=".$dfam$dver1";
84} else {
85 $dfam="unknown";
86 $dtype="unknown";
87 $dsuf="unknown";
88}
89
90return($ddir, $dver, $dfam, $dtype, $dsuf);
91}
[23]92
[74]93sub pb_get_distro {
[23]94
95# Cf: http://linuxmafia.com/faq/Admin/release-files.html
96# Ideas taken from
97# http://search.cpan.org/~kerberus/Linux-Distribution-0.14/lib/Linux/Distribution.pm
98
99my $base="/etc";
100
101# List of files that unambiguously indicates what distro we have
102my %single_rel_files = (
103# Tested
104 'gentoo' => 'gentoo-release', # >= 1.6
105 'debian' => 'debian_version', # >= 3.1
106 'slackware' => 'slackware-version', # >= 10.2
107 'mandriva' => 'mandriva-release', # >=2006.0
[171]108 'mandrakelinux' => 'mandrakelinux-release',# = 10.2
[23]109 'fedora' => 'fedora-release', # >= 4
[146]110 'vmware' => 'vmware-release', # >= 3
[181]111 'sles' => 'sles-release', # Doesn't exist as of 10
[23]112# Untested
113 'knoppix' => 'knoppix_version', #
114 'yellowdog' => 'yellowdog-release', #
115 'esmith' => 'e-smith-release', #
116 'turbolinux' => 'turbolinux-release', #
117 'blackcat' => 'blackcat-release', #
118 'aurox' => 'aurox-release', #
119 'annvix' => 'annvix-release', #
120 'cobalt' => 'cobalt-release', #
121 'redflag' => 'redflag-release', #
122 'ark' => 'ark-release', #
123 'pld' => 'pld-release', #
124 'nld' => 'nld-release', #
125 'lfs' => 'lfs-release', #
126 'mk' => 'mk-release', #
127 'conectiva' => 'conectiva-release', #
128 'immunix' => 'immunix-release', #
129 'tinysofa' => 'tinysofa-release', #
130 'trustix' => 'trustix-release', #
131 'adamantix' => 'adamantix_version', #
132 'yoper' => 'yoper-release', #
133 'arch' => 'arch-release', #
134 'libranet' => 'libranet_version', #
135 'valinux' => 'va-release', #
136 'yellowdog' => 'yellowdog-release', #
137 'ultrapenguin' => 'ultrapenguin-release', #
138 );
139
140# List of files that ambiguously indicates what distro we have
141my %ambiguous_rel_files = (
[171]142 'mandrake' => 'mandrake-release', # <= 10.1
[23]143 'suse' => 'SuSE-release', # >= 10.0
144 'redhat' => 'redhat-release', # >= 7.3
145 'lsb' => 'lsb-release', # ???
146 );
147
148# Should have the same keys as the previous one.
149# If ambiguity, which other distributions should be checked
150my %distro_similar = (
[171]151 'mandrake' => ['mandrake', 'mandrakelinux'],
[185]152 'suse' => ['suse', 'sles', 'opensuse'],
[146]153 'redhat' => ['redhat', 'rhel', 'centos', 'mandrake', 'vmware'],
[24]154 'lsb' => ['ubuntu', 'debian', 'lsb'],
155 );
[23]156
157my %distro_match = (
158# Tested
159 'gentoo' => '.* version (.+)',
[24]160 'slackware' => 'S[^ ]* (.+)$',
[23]161# There should be no ambiguity between potential ambiguous distro
[171]162 'mandrakelinux' => 'Mandrakelinux release (.+) \(',
[24]163 'mandrake' => 'Mandr[^ ]* release (.+) \(',
164 'mandriva' => 'Mandr[^ ]* [^ ]* release (.+) \(',
165 'fedora' => 'Fedora .*release (\d+) \(',
[146]166 'vmware' => 'VMware ESX Server (\d+) \(',
[24]167 'rhel' => 'Red Hat Enterprise Linux .*release (.+) \(',
168 'centos' => '.*CentOS .*release (.+) ',
169 'redhat' => 'Red Hat Linux release (.+) \(',
[185]170 'sles' => 'SUSE .* Enterprise Server (\d+) \(',
[188]171 'suse' => 'SUSE LINUX (\d.+) \(',
[185]172 'opensuse' => 'openSUSE (\d.+) \(',
[287]173 'debian' => '(.+)',
[23]174 'lsb' => '.*[^Ubunt].*\nDISTRIB_RELEASE=(.+)',
[203]175# Ubuntu 6.06 includes a /etc/debian_version file that needs to be
176# renamed to /etc/debian_version.sav as there is no way to distinguish
177# Ubuntu 6.06 from debian testing otherwise
[265]178# Same is true for Ubuntu 7.10 :-(
[23]179 'ubuntu' => '.*Ubuntu.*\nDISTRIB_RELEASE=(.+)',
180# Not tested
181 'arch' => '.* ([0-9.]+) .*',
182 'redflag' => 'Red Flag (?:Desktop|Linux) (?:release |\()(.*?)(?: \(.+)?\)',
183);
184
185my $release;
186my $distro;
187
188# Begin to test presence of non-amiguous files
189# that way we reduce the choice
[24]190my ($d,$r);
191while (($d,$r) = each %single_rel_files) {
[171]192 if (-f "$base/$r" && ! -l "$base/$r") {
[74]193 my $tmp=pb_get_content("$base/$r");
[23]194 # Found the only possibility.
195 # Try to get version and return
[24]196 if (defined ($distro_match{$d})) {
197 ($release) = $tmp =~ m/$distro_match{$d}/m;
[23]198 } else {
[24]199 print STDERR "Unable to find $d version in $r\n";
[23]200 print STDERR "Please report to the maintainer bruno_at_project-builder.org\n";
201 $release = "unknown";
202 }
203 return($d,$release);
204 }
205}
206
[24]207while (($d,$r) = each %ambiguous_rel_files) {
[23]208 if (-f "$base/$r" && !-l "$base/$r"){
209 # Found one possibility.
210 # Get all distros concerned by that file
[74]211 my $tmp=pb_get_content("$base/$r");
[24]212 my $found = 0;
213 my $ptr = $distro_similar{$d};
[315]214 #pb_log(2,$LOG "amb: ".Dumper($ptr)."\n" if ($debug >= 1);
[24]215 $release = "unknown";
216 foreach my $dd (@$ptr) {
[315]217 #pb_log(2,$LOG "check $dd\n" if ($debug >= 1);
[23]218 # Try to check pattern
[24]219 if (defined $distro_match{$dd}) {
[315]220 #pb_log(2,$LOG "cmp: $distro_match{$dd} - vs - $tmp\n" if ($debug >= 1);
[24]221 ($release) = $tmp =~ m/$distro_match{$dd}/m;
222 if ((defined $release) && ($release ne "unknown")) {
223 $distro = $dd;
224 $found = 1;
225 last;
226 }
[23]227 }
228 }
229 if ($found == 0) {
[24]230 print STDERR "Unable to find $d version in $r\n";
[23]231 print STDERR "Please report to the maintainer bruno_at_project-builder.org\n";
232 $release = "unknown";
233 } else {
234 return($distro,$release);
235 }
236 }
237}
238return("unknown","unknown");
[24]239}
[23]240
[74]241# get content of a file in a variable
242sub pb_get_content {
[23]243
244my $file=shift;
245
246my $bkp = $/;
247undef $/;
248open(R,$file) || die "Unable to open $file: $!";
249my $content=<R>;
250close(R);
[24]251chomp($content);
[23]252$/ = $bkp;
253return($content);
254}
[11]2551;
Note: See TracBrowser for help on using the repository browser.