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

Last change on this file since 203 was 203, checked in by Bruno Cornec, 17 years ago

use make and not the macro not portable
document Ubuntu 6.06 distribution detection hack
fix some VMs handling pb

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