Skip to content

Commit 1f2ad79

Browse files
authored
Merge pull request #2345 from nagilson/nagilson-release-distro-backup
Add fallback for /usr/lib/os-release to detect distro
2 parents 16e11a7 + 4401a49 commit 1f2ad79

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

vscode-dotnet-runtime-library/src/Acquisition/LinuxVersionResolver.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@ import { FileUtilities } from '../Utils/FileUtilities';
2020
import { ICommandExecutor } from '../Utils/ICommandExecutor';
2121
import { getInstallFromContext } from '../Utils/InstallIdUtilities';
2222
import { IUtilityContext } from '../Utils/IUtilityContext';
23-
import { SYSTEM_INFORMATION_CACHE_DURATION_MS } from './CacheTimeConstants';
2423
import { DebianDistroSDKProvider } from './DebianDistroSDKProvider';
2524
import { DotnetInstallMode } from './DotnetInstallMode';
2625
import { GenericDistroSDKProvider } from './GenericDistroSDKProvider';
2726
import { IAcquisitionWorkerContext } from './IAcquisitionWorkerContext';
2827
import { IDistroDotnetSDKProvider } from './IDistroDotnetSDKProvider';
2928
import { RedHatDistroSDKProvider } from './RedHatDistroSDKProvider';
29+
import { DEBIAN_DISTRO_INFO_KEY, RED_HAT_DISTRO_INFO_KEY, UBUNTU_DISTRO_INFO_KEY } from './StringConstants';
3030
import { VersionResolver } from './VersionResolver';
3131
import * 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;

vscode-dotnet-runtime-library/src/test/unit/LinuxVersionResolver.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
import * as chai from 'chai';
77
import * as os from 'os';
88
import { DistroVersionPair, LinuxVersionResolver } from '../../Acquisition/LinuxVersionResolver';
9+
import { RED_HAT_DISTRO_INFO_KEY, UBUNTU_DISTRO_INFO_KEY } from '../../Acquisition/StringConstants';
910
import { LocalMemoryCacheSingleton } from '../../LocalMemoryCacheSingleton';
1011
import { WebRequestWorkerSingleton } from '../../Utils/WebRequestWorkerSingleton';
1112
import { MockCommandExecutor, MockDistroProvider } from '../mocks/MockObjects';
1213
import * as util from './TestUtility';
1314
import { getMockAcquisitionContext, getMockUtilityContext } from './TestUtility';
14-
import { RED_HAT_DISTRO_INFO_KEY, UBUNTU_DISTRO_INFO_KEY } from '../../Acquisition/StringConstants';
1515
const assert = chai.assert;
1616

1717

@@ -43,7 +43,6 @@ suite('Linux Version Resolver Tests', function ()
4343
if (shouldRun)
4444
{
4545
const distroVersion = await resolver.getRunningDistro();
46-
assert.equal(mockExecutor.attemptedCommand, 'cat /etc/os-release');
4746
assert.exists(distroVersion.distro);
4847
assert.exists(distroVersion.version);
4948
}

0 commit comments

Comments
 (0)