Changes in devel/pb/lib/distro.pm [24:18] in ProjectBuilder


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • devel/pb/lib/distro.pm

    r24 r18  
    1010sub distro_init {
    1111
    12 my $ddir = shift || undef;
    13 my $dver = shift || undef;
     12my $ddir = shift;
     13my $dver = shift;
    1414my $dfam = "unknown";
    1515my $dtype = "unknown";
     
    1717
    1818# 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));
    2020
    2121# There shold be unicity of names between ddir dfam and dtype
     
    8282}
    8383
    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);
     84sub distro_get {
    23585}
    236861;
Note: See TracChangeset for help on using the changeset viewer.