@@ -20,16 +20,15 @@ import { FileUtilities } from '../Utils/FileUtilities';
2020import { ICommandExecutor } from '../Utils/ICommandExecutor' ;
2121import { getInstallFromContext } from '../Utils/InstallIdUtilities' ;
2222import { IUtilityContext } from '../Utils/IUtilityContext' ;
23- import { SYSTEM_INFORMATION_CACHE_DURATION_MS } from './CacheTimeConstants' ;
2423import { DebianDistroSDKProvider } from './DebianDistroSDKProvider' ;
2524import { DotnetInstallMode } from './DotnetInstallMode' ;
2625import { GenericDistroSDKProvider } from './GenericDistroSDKProvider' ;
2726import { IAcquisitionWorkerContext } from './IAcquisitionWorkerContext' ;
2827import { IDistroDotnetSDKProvider } from './IDistroDotnetSDKProvider' ;
2928import { RedHatDistroSDKProvider } from './RedHatDistroSDKProvider' ;
29+ import { DEBIAN_DISTRO_INFO_KEY , RED_HAT_DISTRO_INFO_KEY , UBUNTU_DISTRO_INFO_KEY } from './StringConstants' ;
3030import { VersionResolver } from './VersionResolver' ;
3131import * as versionUtils from './VersionUtilities' ;
32- import { DEBIAN_DISTRO_INFO_KEY , RED_HAT_DISTRO_INFO_KEY , UBUNTU_DISTRO_INFO_KEY } from './StringConstants' ;
3332
3433
3534/**
@@ -123,18 +122,21 @@ Or, install Red Hat Enterprise Linux 8.0 or Red Hat Enterprise Linux 9.0 from ht
123122 return this . distro ;
124123 }
125124
126- const commandResult = await this . commandRunner . execute ( CommandExecutor . makeCommand ( `cat` , [ `/etc/os-release` ] ) , { dotnetInstallToolCacheTtlMs : SYSTEM_INFORMATION_CACHE_DURATION_MS } ) ;
125+ const mainOSDeclarationFile = `/etc/os-release` ;
126+ // Some distros may not include the os-release file specified by system d, https://0pointer.de/blog/projects/os-release and this is a recommended fallback https://man7.org/linux/man-pages/man5/os-release.5.html
127+ const backupOSDeclarationFile = `/usr/lib/os-release` ;
128+ const osDeclarationFile = await new FileUtilities ( ) . exists ( mainOSDeclarationFile ) ? mainOSDeclarationFile : backupOSDeclarationFile ;
129+
127130 const distroNameKey = 'NAME' ;
128131 const distroVersionKey = 'VERSION_ID' ;
129-
130132 try
131133 {
132- const stdOut = commandResult . stdout . toString ( ) . split ( '\n' ) ;
134+ const osInfo = ( await new FileUtilities ( ) . read ( osDeclarationFile ) ) . split ( '\n' ) ;
133135 // We need to remove the quotes from the KEY="VALUE"\n pairs returned by the command stdout, and then turn it into a dictionary. We can't use replaceAll for older browsers.
134136 // Replace only replaces one quote, so we remove the 2nd one later.
135- const stdOutWithQuotesRemoved = stdOut . map ( x => x . replace ( '"' , '' ) ) ;
136- const stdOutWithSeparatedKeyValues = stdOutWithQuotesRemoved . map ( x => x . split ( '=' ) ) ;
137- const keyValueMap = Object . fromEntries ( stdOutWithSeparatedKeyValues . map ( x => [ x [ 0 ] , x [ 1 ] ] ) ) ;
137+ const infoWithQuotesRemoved = osInfo . map ( x => x . replace ( '"' , '' ) ) ;
138+ const infoWithSeparatedKeyValues = infoWithQuotesRemoved . map ( x => x . split ( '=' ) ) ;
139+ const keyValueMap = Object . fromEntries ( infoWithSeparatedKeyValues . map ( x => [ x [ 0 ] , x [ 1 ] ] ) ) ;
138140
139141 // Remove the 2nd quotes.
140142 const distroName : string = keyValueMap [ distroNameKey ] ?. replace ( '"' , '' ) ?? '' ;
@@ -154,7 +156,7 @@ Or, install Red Hat Enterprise Linux 8.0 or Red Hat Enterprise Linux 9.0 from ht
154156 catch ( error )
155157 {
156158 const err = new DotnetAcquisitionDistroUnknownError ( new EventCancellationError ( 'DotnetAcquisitionDistroUnknownError' ,
157- `${ this . baseUnsupportedDistroErrorMessage } ... does /etc/os-release exist?` ) ,
159+ `${ this . baseUnsupportedDistroErrorMessage } ... does /etc/os-release or /usr/lib/os-release exist?` ) ,
158160 getInstallFromContext ( this . workerContext ) ) ;
159161 this . workerContext . eventStream . post ( err ) ;
160162 throw err . error ;
0 commit comments