Skip to content

Commit f73b5ee

Browse files
fix(p2): service-aware proxy install/update (#46)
1 parent 14a3711 commit f73b5ee

File tree

3 files changed

+57
-14
lines changed

3 files changed

+57
-14
lines changed

src/commands/install.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@ import { Command } from 'commander';
22
import { getLatestVersion, downloadProxy } from '../core/updater.js';
33
import { logger } from '../core/logger.js';
44
import { isRunning, stopProxy } from '../core/proxy.js';
5+
import { isServiceInstalled, isServiceRunning, startService, stopService } from '../system/service.js';
56

67
export const installCommand = new Command('install')
78
.description('Download and install Cloud SQL Proxy')
89
.option('-v, --version <version>', 'Specific version to install')
910
.action(async (options) => {
11+
const serviceInstalled = await isServiceInstalled();
12+
const serviceWasRunning = serviceInstalled && await isServiceRunning();
13+
let serviceStopped = false;
14+
1015
try {
16+
if (serviceWasRunning) {
17+
logger.info('Stopping Windows Service before installation...');
18+
await stopService();
19+
serviceStopped = true;
20+
}
21+
1122
if (await isRunning()) {
1223
logger.info('Stopping running proxy before installation...');
1324
await stopProxy();
@@ -25,5 +36,14 @@ export const installCommand = new Command('install')
2536
} catch (error) {
2637
logger.error('Installation failed', error);
2738
process.exit(1);
39+
} finally {
40+
if (serviceStopped) {
41+
try {
42+
logger.info('Restarting Windows Service...');
43+
await startService();
44+
} catch (error) {
45+
logger.warn('Failed to restart Windows Service after installation attempt', error);
46+
}
47+
}
2848
}
2949
});

src/commands/update.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,22 @@ import { Command } from 'commander';
22
import { getLatestVersion, downloadProxy } from '../core/updater.js';
33
import { logger } from '../core/logger.js';
44
import { isRunning, stopProxy } from '../core/proxy.js';
5+
import { isServiceInstalled, isServiceRunning, startService, stopService } from '../system/service.js';
56

67
export const updateCommand = new Command('update')
78
.description('Update Cloud SQL Proxy to the latest version')
89
.action(async () => {
10+
const serviceInstalled = await isServiceInstalled();
11+
const serviceWasRunning = serviceInstalled && await isServiceRunning();
12+
let serviceStopped = false;
13+
914
try {
15+
if (serviceWasRunning) {
16+
logger.info('Stopping Windows Service before update...');
17+
await stopService();
18+
serviceStopped = true;
19+
}
20+
1021
if (await isRunning()) {
1122
logger.info('Stopping running proxy before update...');
1223
await stopProxy();
@@ -20,5 +31,14 @@ export const updateCommand = new Command('update')
2031
} catch (error) {
2132
logger.error('Update failed', error);
2233
process.exit(1);
34+
} finally {
35+
if (serviceStopped) {
36+
try {
37+
logger.info('Restarting Windows Service...');
38+
await startService();
39+
} catch (error) {
40+
logger.warn('Failed to restart Windows Service after update attempt', error);
41+
}
42+
}
2343
}
2444
});

src/core/updater.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,34 +58,37 @@ export async function downloadProxy(version: string, targetPath: string = PATHS.
5858
// Ensure directory exists
5959
await fs.ensureDir(path.dirname(targetPath));
6060

61-
const writer = fs.createWriteStream(targetPath);
61+
const tmpPath = `${targetPath}.download`;
62+
await fs.remove(tmpPath);
63+
64+
const writer = fs.createWriteStream(tmpPath);
6265
const responseStream = await axios({
6366
url: downloadUrl,
6467
method: 'GET',
6568
responseType: 'stream'
6669
});
6770

68-
responseStream.data.pipe(writer);
69-
70-
await new Promise((resolve, reject) => {
71-
writer.on('finish', resolve);
72-
writer.on('error', reject);
73-
});
71+
try {
72+
responseStream.data.pipe(writer);
7473

75-
logger.info('Download complete.');
74+
await new Promise((resolve, reject) => {
75+
writer.on('finish', resolve);
76+
writer.on('error', reject);
77+
});
7678

77-
logger.info('Verifying checksum...');
78-
try {
79-
const isValid = await verifyChecksum(targetPath, expectedChecksum);
79+
logger.info('Download complete.');
8080

81+
logger.info('Verifying checksum...');
82+
const isValid = await verifyChecksum(tmpPath, expectedChecksum);
8183
if (!isValid) {
8284
throw new Error('Checksum verification failed');
8385
}
8486
logger.info('Checksum verified.');
87+
88+
await fs.move(tmpPath, targetPath, { overwrite: true });
8589
} catch (err) {
86-
logger.warn('Failed to verify checksum', err);
87-
// If verification fails, we should probably remove the file
88-
await fs.remove(targetPath);
90+
logger.warn('Failed to download/verify proxy', err);
91+
await fs.remove(tmpPath);
8992
throw err;
9093
}
9194

0 commit comments

Comments
 (0)