From 1c9d167f86bbbb108b96e9bc30efaf8de65d82ff Mon Sep 17 00:00:00 2001 From: Sabir Hassan Date: Wed, 2 Nov 2022 20:05:12 +0500 Subject: [PATCH 1/2] feat: Enable DRIVE_LOCATION setting for deploying multiple instances of SASjs Server --- api/.env.example | 1 + api/src/app.ts | 9 +++++++-- api/src/types/system/process.d.ts | 1 + api/src/utils/copySASjsCore.ts | 2 +- api/src/utils/file.ts | 12 +++++++----- api/src/utils/index.ts | 1 + api/src/utils/setProcessVariables.ts | 15 ++++++++++++--- api/src/utils/setupFolders.ts | 18 +++--------------- api/src/utils/setupUserAutoExec.ts | 11 +++++++++++ 9 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 api/src/utils/setupUserAutoExec.ts diff --git a/api/.env.example b/api/.env.example index dc88534..e36399c 100644 --- a/api/.env.example +++ b/api/.env.example @@ -30,6 +30,7 @@ PYTHON_PATH=/usr/bin/python R_PATH=/usr/bin/Rscript SASJS_ROOT=./sasjs_root +DRIVE_LOCATION=./sasjs_root/drive LOG_FORMAT_MORGAN=common LOG_LOCATION=./sasjs_root/logs \ No newline at end of file diff --git a/api/src/app.ts b/api/src/app.ts index 073b311..0d2d908 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -11,6 +11,7 @@ import { ReturnCode, setProcessVariables, setupFolders, + setupUserAutoExec, verifyEnvVariables } from './utils' import { @@ -62,8 +63,12 @@ export default setProcessVariables().then(async () => { // Currently only place we use it is SAS9 Mock - POST /SASLogon/login app.use(express.urlencoded({ extended: true })) - await setupFolders() - await copySASjsCore() + await setupUserAutoExec() + + if (process.driveLoc === path.join(process.sasjsRoot, 'drive')) { + await setupFolders() + await copySASjsCore() + } // loading these modules after setting up variables due to // multer's usage of process var process.driveLoc diff --git a/api/src/types/system/process.d.ts b/api/src/types/system/process.d.ts index 1c2077d..be120a2 100644 --- a/api/src/types/system/process.d.ts +++ b/api/src/types/system/process.d.ts @@ -5,6 +5,7 @@ declare namespace NodeJS { pythonLoc?: string rLoc?: string driveLoc: string + sasjsRoot: string logsLoc: string logsUUID: string sessionController?: import('../../controllers/internal').SessionController diff --git a/api/src/utils/copySASjsCore.ts b/api/src/utils/copySASjsCore.ts index 42e040e..d45a72e 100644 --- a/api/src/utils/copySASjsCore.ts +++ b/api/src/utils/copySASjsCore.ts @@ -12,7 +12,7 @@ import { getMacrosFolder, sasJSCoreMacros, sasJSCoreMacrosInfo } from '.' export const copySASjsCore = async () => { if (process.env.NODE_ENV === 'test') return - console.log('Copying Macros from container to drive(tmp).') + console.log('Copying Macros from container to drive.') const macrosDrivePath = getMacrosFolder() diff --git a/api/src/utils/file.ts b/api/src/utils/file.ts index 2d0ac65..497fe09 100644 --- a/api/src/utils/file.ts +++ b/api/src/utils/file.ts @@ -20,22 +20,24 @@ export const getSasjsHomeFolder = () => path.join(homedir(), '.sasjs-server') export const getDesktopUserAutoExecPath = () => path.join(getSasjsHomeFolder(), 'user-autoexec.sas') -export const getSasjsRootFolder = () => process.driveLoc +export const getSasjsRootFolder = () => process.sasjsRoot + +export const getSasjsDriveFolder = () => process.driveLoc export const getLogFolder = () => process.logsLoc export const getAppStreamConfigPath = () => - path.join(getSasjsRootFolder(), 'appStreamConfig.json') + path.join(getSasjsDriveFolder(), 'appStreamConfig.json') export const getMacrosFolder = () => - path.join(getSasjsRootFolder(), 'sas', 'sasautos') + path.join(getSasjsDriveFolder(), 'sas', 'sasautos') export const getPackagesFolder = () => - path.join(getSasjsRootFolder(), 'sas', 'sas_packages') + path.join(getSasjsDriveFolder(), 'sas', 'sas_packages') export const getUploadsFolder = () => path.join(getSasjsRootFolder(), 'uploads') -export const getFilesFolder = () => path.join(getSasjsRootFolder(), 'files') +export const getFilesFolder = () => path.join(getSasjsDriveFolder(), 'files') export const getWeboutFolder = () => path.join(getSasjsRootFolder(), 'webouts') diff --git a/api/src/utils/index.ts b/api/src/utils/index.ts index f13da3d..7758dd9 100644 --- a/api/src/utils/index.ts +++ b/api/src/utils/index.ts @@ -26,6 +26,7 @@ export * from './saveTokensInDB' export * from './seedDB' export * from './setProcessVariables' export * from './setupFolders' +export * from './setupUserAutoExec' export * from './upload' export * from './validation' export * from './verifyEnvVariables' diff --git a/api/src/utils/setProcessVariables.ts b/api/src/utils/setProcessVariables.ts index 574508b..e573998 100644 --- a/api/src/utils/setProcessVariables.ts +++ b/api/src/utils/setProcessVariables.ts @@ -19,7 +19,8 @@ export const setProcessVariables = async () => { } if (process.env.NODE_ENV === 'test') { - process.driveLoc = path.join(process.cwd(), 'sasjs_root') + process.sasjsRoot = path.join(process.cwd(), 'sasjs_root') + process.driveLoc = path.join(process.cwd(), 'sasjs_root', 'drive') return } @@ -41,11 +42,19 @@ export const setProcessVariables = async () => { const { SASJS_ROOT } = process.env const absPath = getAbsolutePath(SASJS_ROOT ?? 'sasjs_root', process.cwd()) await createFolder(absPath) - process.driveLoc = getRealPath(absPath) + process.sasjsRoot = getRealPath(absPath) + + const { DRIVE_LOCATION } = process.env + const absDrivePath = getAbsolutePath( + DRIVE_LOCATION ?? path.join(process.sasjsRoot, 'drive'), + process.cwd() + ) + await createFolder(absDrivePath) + process.driveLoc = getRealPath(absDrivePath) const { LOG_LOCATION } = process.env const absLogsPath = getAbsolutePath( - LOG_LOCATION ?? `sasjs_root${path.sep}logs`, + LOG_LOCATION ?? path.join(process.sasjsRoot, 'logs'), process.cwd() ) await createFolder(absLogsPath) diff --git a/api/src/utils/setupFolders.ts b/api/src/utils/setupFolders.ts index 8f52bbc..fd7977e 100644 --- a/api/src/utils/setupFolders.ts +++ b/api/src/utils/setupFolders.ts @@ -1,19 +1,7 @@ -import { createFile, createFolder, fileExists } from '@sasjs/utils' -import { - getDesktopUserAutoExecPath, - getFilesFolder, - getPackagesFolder -} from './file' -import { ModeType } from './verifyEnvVariables' +import { createFolder } from '@sasjs/utils' +import { getFilesFolder, getPackagesFolder } from './file' export const setupFolders = async () => { - const drivePath = getFilesFolder() - await createFolder(drivePath) + await createFolder(getFilesFolder()) await createFolder(getPackagesFolder()) - - if (process.env.MODE === ModeType.Desktop) { - if (!(await fileExists(getDesktopUserAutoExecPath()))) { - await createFile(getDesktopUserAutoExecPath(), '') - } - } } diff --git a/api/src/utils/setupUserAutoExec.ts b/api/src/utils/setupUserAutoExec.ts new file mode 100644 index 0000000..791de58 --- /dev/null +++ b/api/src/utils/setupUserAutoExec.ts @@ -0,0 +1,11 @@ +import { createFile, fileExists } from '@sasjs/utils' +import { getDesktopUserAutoExecPath } from './file' +import { ModeType } from './verifyEnvVariables' + +export const setupUserAutoExec = async () => { + if (process.env.MODE === ModeType.Desktop) { + if (!(await fileExists(getDesktopUserAutoExecPath()))) { + await createFile(getDesktopUserAutoExecPath(), '') + } + } +} From 66f8e7840ba47dca6b2c7fa78d7616eb01ac13de Mon Sep 17 00:00:00 2001 From: Sabir Hassan Date: Wed, 2 Nov 2022 20:18:28 +0500 Subject: [PATCH 2/2] chore: update readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4a1d1a6..2fa03b9 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,10 @@ R_PATH=/usr/bin/Rscript SASJS_ROOT=./sasjs_root +# This location is for files, sasjs packages and appStreamConfig.json +DRIVE_LOCATION=./sasjs_root/drive + + # options: [http|https] default: http PROTOCOL=