Changes in devel/pb/lib/distro.pm [24:18] in ProjectBuilder
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
devel/pb/lib/distro.pm
r24 r18 10 10 sub distro_init { 11 11 12 my $ddir = shift || undef;13 my $dver = shift || undef;12 my $ddir = shift; 13 my $dver = shift; 14 14 my $dfam = "unknown"; 15 15 my $dtype = "unknown"; … … 17 17 18 18 # If we don't know which distribution we're on, then guess it 19 ($ddir, $dver) = get_distro() if ((not defined $ddir) || (not defined $dver));19 ($ddir, $dver) = distro_get() if ((not defined $ddir) || (not defined $dver)); 20 20 21 21 # There shold be unicity of names between ddir dfam and dtype … … 82 82 } 83 83 84 sub get_distro { 85 86 # Cf: http://linuxmafia.com/faq/Admin/release-files.html 87 # Ideas taken from 88 # http://search.cpan.org/~kerberus/Linux-Distribution-0.14/lib/Linux/Distribution.pm 89 90 my $base="/etc"; 91 92 # List of files that unambiguously indicates what distro we have 93 my %single_rel_files = ( 94 # Tested 95 'gentoo' => 'gentoo-release', # >= 1.6 96 'debian' => 'debian_version', # >= 3.1 97 'slackware' => 'slackware-version', # >= 10.2 98 'mandriva' => 'mandriva-release', # >=2006.0 99 'fedora' => 'fedora-release', # >= 4 100 'sles' => 'sles-release', # ??? 101 # Untested 102 'knoppix' => 'knoppix_version', # 103 'yellowdog' => 'yellowdog-release', # 104 'esmith' => 'e-smith-release', # 105 'turbolinux' => 'turbolinux-release', # 106 'blackcat' => 'blackcat-release', # 107 'aurox' => 'aurox-release', # 108 'annvix' => 'annvix-release', # 109 'cobalt' => 'cobalt-release', # 110 'redflag' => 'redflag-release', # 111 'ark' => 'ark-release', # 112 'pld' => 'pld-release', # 113 'nld' => 'nld-release', # 114 'lfs' => 'lfs-release', # 115 'mk' => 'mk-release', # 116 'conectiva' => 'conectiva-release', # 117 'immunix' => 'immunix-release', # 118 'tinysofa' => 'tinysofa-release', # 119 'trustix' => 'trustix-release', # 120 'adamantix' => 'adamantix_version', # 121 'yoper' => 'yoper-release', # 122 'arch' => 'arch-release', # 123 'libranet' => 'libranet_version', # 124 'valinux' => 'va-release', # 125 'yellowdog' => 'yellowdog-release', # 126 'ultrapenguin' => 'ultrapenguin-release', # 127 ); 128 129 # List of files that ambiguously indicates what distro we have 130 my %ambiguous_rel_files = ( 131 'mandrake' => 'mandrake-release', # >= 10.1 132 'suse' => 'SuSE-release', # >= 10.0 133 'redhat' => 'redhat-release', # >= 7.3 134 'lsb' => 'lsb-release', # ??? 135 ); 136 137 # Should have the same keys as the previous one. 138 # If ambiguity, which other distributions should be checked 139 my %distro_similar = ( 140 'mandrake' => ['mandrake'], 141 'suse' => ['suse', 'sles'], 142 'redhat' => ['redhat', 'rhel', 'centos', 'mandrake'], 143 'lsb' => ['ubuntu', 'debian', 'lsb'], 144 ); 145 146 my %distro_match = ( 147 # Tested 148 'gentoo' => '.* version (.+)', 149 'debian' => '([^/]+)[/]*.*', 150 'slackware' => 'S[^ ]* (.+)$', 151 # There should be no ambiguity between potential ambiguous distro 152 'mandrake' => 'Mandr[^ ]* release (.+) \(', 153 'mandriva' => 'Mandr[^ ]* [^ ]* release (.+) \(', 154 'fedora' => 'Fedora .*release (\d+) \(', 155 'rhel' => 'Red Hat Enterprise Linux .*release (.+) \(', 156 'centos' => '.*CentOS .*release (.+) ', 157 'redhat' => 'Red Hat Linux release (.+) \(', 158 'sles' => '.* Enterprise .*\nVERSION = (.+)', 159 'suse' => '.* [^Enterpis] .*\nVERSION = (.+)', 160 'lsb' => '.*[^Ubunt].*\nDISTRIB_RELEASE=(.+)', 161 'ubuntu' => '.*Ubuntu.*\nDISTRIB_RELEASE=(.+)', 162 # Not tested 163 'arch' => '.* ([0-9.]+) .*', 164 'redflag' => 'Red Flag (?:Desktop|Linux) (?:release |\()(.*?)(?: \(.+)?\)', 165 ); 166 167 my $release; 168 my $distro; 169 170 # Begin to test presence of non-amiguous files 171 # that way we reduce the choice 172 my ($d,$r); 173 while (($d,$r) = each %single_rel_files) { 174 if (-f "$base/$r" && !-l "$base/$r") { 175 my $tmp=get_content("$base/$r"); 176 # Found the only possibility. 177 # Try to get version and return 178 if (defined ($distro_match{$d})) { 179 ($release) = $tmp =~ m/$distro_match{$d}/m; 180 } else { 181 print STDERR "Unable to find $d version in $r\n"; 182 print STDERR "Please report to the maintainer bruno_at_project-builder.org\n"; 183 $release = "unknown"; 184 } 185 return($d,$release); 186 } 187 } 188 189 while (($d,$r) = each %ambiguous_rel_files) { 190 if (-f "$base/$r" && !-l "$base/$r"){ 191 # Found one possibility. 192 # Get all distros concerned by that file 193 my $tmp=get_content("$base/$r"); 194 my $found = 0; 195 my $ptr = $distro_similar{$d}; 196 print $LOG "amb: ".Dumper($ptr)."\n" if ($debug >= 1); 197 $release = "unknown"; 198 foreach my $dd (@$ptr) { 199 print $LOG "check $dd\n" if ($debug >= 1); 200 # Try to check pattern 201 if (defined $distro_match{$dd}) { 202 print $LOG "cmp: $distro_match{$dd} - vs - $tmp\n" if ($debug >= 1); 203 ($release) = $tmp =~ m/$distro_match{$dd}/m; 204 if ((defined $release) && ($release ne "unknown")) { 205 $distro = $dd; 206 $found = 1; 207 last; 208 } 209 } 210 } 211 if ($found == 0) { 212 print STDERR "Unable to find $d version in $r\n"; 213 print STDERR "Please report to the maintainer bruno_at_project-builder.org\n"; 214 $release = "unknown"; 215 } else { 216 return($distro,$release); 217 } 218 } 219 } 220 return("unknown","unknown"); 221 } 222 223 sub get_content { 224 225 my $file=shift; 226 227 my $bkp = $/; 228 undef $/; 229 open(R,$file) || die "Unable to open $file: $!"; 230 my $content=<R>; 231 close(R); 232 chomp($content); 233 $/ = $bkp; 234 return($content); 84 sub distro_get { 235 85 } 236 86 1;
Note:
See TracChangeset
for help on using the changeset viewer.