You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.6 KiB
96 lines
2.6 KiB
import { execSync, exec } from 'child_process' |
|
import { isFolder } from '../files.js' |
|
import path from 'path' |
|
import { unlink } from 'node:fs' |
|
import SystemServiceManager from '../services.js' |
|
|
|
const AO_SERVER_PATH = path.join(process.env.HOME, 'ao-server') |
|
|
|
const aoServerServiceTemplate = |
|
`[Unit] |
|
Description=ao-server daemon |
|
|
|
[Service] |
|
WorkingDirectory=${process.env.HOME}/ao-server |
|
ExecStart=npm run build && node --loader ts-node/esm ${process.env.HOME}/ao-server/src/server/app.ts |
|
User=${process.env.USER} |
|
Type=simple |
|
Restart=on-failure |
|
PrivateTmp=true |
|
|
|
[Install] |
|
WantedBy=multi-user.target` |
|
|
|
const aoServerServiceManager = new SystemServiceManager('ao-server', aoServerServiceTemplate) |
|
|
|
// Returns one of: off, installed, enabled, running, synced, error |
|
function serviceStatus() { |
|
if(!aoIsInstalled()) { |
|
return 'off' |
|
} |
|
if(aoServerServiceManager.isInstalled()) { |
|
const isRunning = aoServerServiceManager.isRunning() |
|
switch(isRunning) { |
|
case true: |
|
return 'running' |
|
case 'error': |
|
return 'error' |
|
} |
|
return 'enabled' |
|
} else { |
|
return 'installed' |
|
} |
|
} |
|
|
|
// Downloads ao-server to ~/ao-server. Returns false if it fails, which usually means the folder already exists (update instead). |
|
export function downloadAoServer() { |
|
try { |
|
execSync('git clone http://git.coalitionofinvisiblecolleges.org:3009/autonomousorganization/ao-server.git 2>&1') |
|
} catch(err) { |
|
switch(err.code) { |
|
case 128: |
|
return false |
|
} |
|
} |
|
return true |
|
} |
|
|
|
// Return true if the ~/ao-server/.git folder exists |
|
export function aoIsInstalled() { |
|
return isFolder(path.join(AO_SERVER_PATH, '.git')) |
|
} |
|
|
|
function installAo(version) { |
|
if(!version) { |
|
version = aoEnv('AO_VERSION') |
|
if(!version) { |
|
version = 'ao-svelte' |
|
setAoEnv('AO_VERSION', 'ao-svelte') |
|
console.log('No AO server/frontend version specified, defaulting to ao-svelte.') |
|
} |
|
} |
|
downloadAoServer() |
|
} |
|
|
|
export function updateAoServer() { |
|
console.log('Updating ao-server. If you are a developer, you may be asked for your SSH key now.') |
|
try { |
|
const stdout = execSync('cd ' + AO_SERVER_PATH + ' && git pull origin main 2>&1') |
|
if(stdout.includes('Already up to date.')) { |
|
console.log('Already up to date.') |
|
return |
|
} |
|
console.log('\nao-server was updated.') |
|
} catch(error) { |
|
console.log('git pull failed with error:', error) |
|
} |
|
} |
|
|
|
export default { |
|
description: 'AO server instance on this computer', |
|
status: serviceStatus, |
|
install: installAo, |
|
isInstalled: aoIsInstalled, |
|
update: updateAoServer, |
|
submodules: [ aoServerServiceManager ] |
|
}
|
|
|