@harperfast/harper 5.0.0-alpha.10 → 5.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/{resources/ResourceInterfaceV2.js → components/Logger.js} +1 -1
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +17 -10
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/ResourceInterface.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +12 -4
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +265 -73
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +11 -12
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +52 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +2 -1
- package/dist/utility/lmdb/commonUtility.js +20 -13
- package/dist/utility/lmdb/commonUtility.js.map +1 -1
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +35 -16
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4531 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +733 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +596 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-C1G-Jo6n.js +37 -0
- package/studio/web/assets/index-C1G-Jo6n.js.map +1 -0
- package/studio/web/assets/index-D-CahN0-.js +2 -0
- package/studio/web/assets/index-D-CahN0-.js.map +1 -0
- package/studio/web/assets/index-DxlZI0PX.js +235 -0
- package/studio/web/assets/index-DxlZI0PX.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js +266 -0
- package/studio/web/assets/index.lazy-BUXDDqq9.js.map +1 -0
- package/studio/web/assets/profiler-CU93QiSW.js +2 -0
- package/studio/web/assets/profiler-CU93QiSW.js.map +1 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js +6 -0
- package/studio/web/assets/react-redux-B8k9Ep7e.js.map +1 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js +3 -0
- package/studio/web/assets/startRecording-DFeBXGk6.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +130 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/ResourceInterfaceV2.d.ts +0 -21
- package/dist/resources/ResourceInterfaceV2.js.map +0 -1
- package/dist/resources/ResourceV2.d.ts +0 -30
- package/dist/resources/ResourceV2.js +0 -27
- package/dist/resources/ResourceV2.js.map +0 -1
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const os = require('os');
|
|
4
|
+
const inquirer = require('inquirer');
|
|
5
|
+
const fs = require('fs-extra');
|
|
6
|
+
const PropertiesReader = require('properties-reader');
|
|
7
|
+
const chalk = require('chalk');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
let ora; // Will be loaded dynamically as it's an ES module
|
|
10
|
+
const YAML = require('yaml');
|
|
11
|
+
|
|
12
|
+
const hdbLogger = require('../logging/harper_logger.js');
|
|
13
|
+
const envManager = require('../environment/environmentManager.js');
|
|
14
|
+
const hdbUtils = require('../common_utils.js');
|
|
15
|
+
const assignCMDENVVariables = require('../../utility/assignCmdEnvVariables.js');
|
|
16
|
+
const hdbInfoController = require('../../dataLayer/hdbInfoController.js');
|
|
17
|
+
const { packageJson } = require('../packageUtils.js');
|
|
18
|
+
const hdbTerms = require('../hdbTerms.ts');
|
|
19
|
+
const { CONFIG_PARAMS } = hdbTerms;
|
|
20
|
+
const installValidator = require('../../validation/installValidator.js');
|
|
21
|
+
const mountHdb = require('../mount_hdb.js');
|
|
22
|
+
const configUtils = require('../../config/configUtils.js');
|
|
23
|
+
const userOps = require('../../security/user.ts');
|
|
24
|
+
const roleOps = require('../../security/role.js');
|
|
25
|
+
const checkJwtTokens = require('./checkJWTTokensExist.js');
|
|
26
|
+
const globalSchema = require('../globalSchema.js');
|
|
27
|
+
const promisify = require('util').promisify;
|
|
28
|
+
const pSchemaToGlobal = promisify(globalSchema.setSchemaDataToGlobal);
|
|
29
|
+
const keys = require('../../security/keys.js');
|
|
30
|
+
|
|
31
|
+
// Removes the color formatting that was being applied to the prompt answer.
|
|
32
|
+
const PROMPT_ANSWER_TRANSFORMER = (answer) => answer;
|
|
33
|
+
const HDB_PROMPT_MSG = (msg) => chalk.magenta.bold(msg);
|
|
34
|
+
const LINE_BREAK = os.EOL;
|
|
35
|
+
const PROMPT_PREFIX = '';
|
|
36
|
+
const INSTALL_START_MSG = 'Starting Harper install...';
|
|
37
|
+
const INSTALL_COMPLETE_MSG = 'Harper installation was successful.';
|
|
38
|
+
const UPGRADE_MSG = 'An out of date version of Harper is already installed.';
|
|
39
|
+
const HDB_EXISTS_MSG = 'It appears that Harper is already installed. Exiting install...';
|
|
40
|
+
const ABORT_MSG = 'Aborting install';
|
|
41
|
+
const PROCESS_HOME = os.homedir();
|
|
42
|
+
const DEFAULT_HDB_ROOT = path.join(PROCESS_HOME, hdbTerms.HDB_ROOT_DIR_NAME);
|
|
43
|
+
const DEFAULT_ADMIN_USERNAME = 'admin';
|
|
44
|
+
const DEFAULT_NODE_HOSTNAME = 'localhost';
|
|
45
|
+
const DEFAULT_CONFIG_MODE = 'dev';
|
|
46
|
+
|
|
47
|
+
const DEV_MODE_CONFIG = {
|
|
48
|
+
[CONFIG_PARAMS.HTTP_CORS]: true,
|
|
49
|
+
[CONFIG_PARAMS.HTTP_CORSACCESSLIST]: ['*'],
|
|
50
|
+
[CONFIG_PARAMS.HTTP_PORT]: 9926,
|
|
51
|
+
[CONFIG_PARAMS.AUTHENTICATION_AUTHORIZELOCAL]: true,
|
|
52
|
+
[CONFIG_PARAMS.THREADS_COUNT]: 1,
|
|
53
|
+
[CONFIG_PARAMS.THREADS_DEBUG]: true,
|
|
54
|
+
[CONFIG_PARAMS.LOGGING_STDSTREAMS]: true,
|
|
55
|
+
[CONFIG_PARAMS.LOGGING_LEVEL]: 'info',
|
|
56
|
+
[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT]: 9925,
|
|
57
|
+
[CONFIG_PARAMS.LOCALSTUDIO_ENABLED]: true,
|
|
58
|
+
[CONFIG_PARAMS.NODE_HOSTNAME]: DEFAULT_NODE_HOSTNAME,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Install prompts
|
|
62
|
+
const INSTALL_PROMPTS = {
|
|
63
|
+
DESTINATION: 'Please enter a destination for Harper:',
|
|
64
|
+
HDB_USERNAME: 'Please enter a username for the administrative user:',
|
|
65
|
+
HDB_PASS: 'Please enter a password for the administrative user:',
|
|
66
|
+
NODE_HOSTNAME: 'Please enter the hostname for the Harper instance:',
|
|
67
|
+
DEFAULTS_MODE: 'Default Config - dev (easy access/debugging) or prod (security/performance): (dev/prod)',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const cfgEnv = assignCMDENVVariables([hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]);
|
|
71
|
+
let hdbRoot = undefined;
|
|
72
|
+
let conditionalRollback = false;
|
|
73
|
+
let ignoreExisting = false;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* This module orchestrates the installation of Harper.
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
module.exports = { install, updateConfigEnv, setIgnoreExisting };
|
|
80
|
+
install.createSuperUser = createSuperUser;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Calls all the functions that are needed to install Harper.
|
|
84
|
+
* @returns {Promise<void>}
|
|
85
|
+
*/
|
|
86
|
+
async function install() {
|
|
87
|
+
console.log(HDB_PROMPT_MSG(LINE_BREAK + INSTALL_START_MSG + LINE_BREAK));
|
|
88
|
+
hdbLogger.notify(INSTALL_START_MSG);
|
|
89
|
+
|
|
90
|
+
let configFromFile;
|
|
91
|
+
if (cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) {
|
|
92
|
+
configFromFile = getConfigFromFile();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check to see if any cmd/env vars are passed that override install prompts.
|
|
96
|
+
const promptOverride = checkForPromptOverride();
|
|
97
|
+
Object.assign(promptOverride, configFromFile);
|
|
98
|
+
if (
|
|
99
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.REPLICATION_HOSTNAME] &&
|
|
100
|
+
!promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME]
|
|
101
|
+
) {
|
|
102
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME] =
|
|
103
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.REPLICATION_HOSTNAME];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// For backwards compatibility for a time before DEFAULTS_MODE (and host name) assume prod when these args used
|
|
107
|
+
if (
|
|
108
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.ROOTPATH] &&
|
|
109
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME] &&
|
|
110
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD] &&
|
|
111
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME] &&
|
|
112
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE] === undefined
|
|
113
|
+
) {
|
|
114
|
+
promptOverride[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE] = 'prod';
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Validate any cmd/env params passed to install
|
|
118
|
+
const validationError = installValidator(promptOverride);
|
|
119
|
+
if (validationError) {
|
|
120
|
+
throw validationError.message;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Check for an existing installation of Harper.
|
|
124
|
+
await checkForExistingInstall();
|
|
125
|
+
|
|
126
|
+
// Prompt the user with params needed for install.
|
|
127
|
+
const installParams = await installPrompts(promptOverride);
|
|
128
|
+
|
|
129
|
+
// HDB root is the one of the first params we need for install.
|
|
130
|
+
hdbRoot = installParams[hdbTerms.INSTALL_PROMPTS.ROOTPATH];
|
|
131
|
+
|
|
132
|
+
if (
|
|
133
|
+
cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG] &&
|
|
134
|
+
path.dirname(cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) === hdbRoot
|
|
135
|
+
) {
|
|
136
|
+
conditionalRollback = true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// We allow HDB to run without a boot file we check for a harperdb-config.yaml
|
|
140
|
+
if (
|
|
141
|
+
!ignoreExisting &&
|
|
142
|
+
!cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG] &&
|
|
143
|
+
(await fs.pathExists(
|
|
144
|
+
path.join(hdbRoot, hdbTerms.HARPER_CONFIG_FILE) ||
|
|
145
|
+
(await fs.pathExists(path.join(hdbRoot, hdbTerms.HDB_CONFIG_FILE)))
|
|
146
|
+
))
|
|
147
|
+
) {
|
|
148
|
+
console.error(HDB_EXISTS_MSG);
|
|
149
|
+
process.exit();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (!ora) {
|
|
153
|
+
ora = (await import('ora')).default;
|
|
154
|
+
}
|
|
155
|
+
const spinner = ora({
|
|
156
|
+
prefixText: HDB_PROMPT_MSG('Installing'),
|
|
157
|
+
color: 'magenta',
|
|
158
|
+
spinner: 'simpleDots',
|
|
159
|
+
});
|
|
160
|
+
spinner.start();
|
|
161
|
+
|
|
162
|
+
if (hdbUtils.isEmpty(hdbRoot)) {
|
|
163
|
+
throw new Error('Installer should have the HDB root param at the stage it is in but it does not.');
|
|
164
|
+
}
|
|
165
|
+
envManager.setHdbBasePath(hdbRoot);
|
|
166
|
+
envManager.setProperty(hdbTerms.CONFIG_PARAMS.STORAGE_ENGINE, installParams.STORAGE_ENGINE);
|
|
167
|
+
|
|
168
|
+
// Creates the Harper project folder structure and the LMDB environments/dbis.
|
|
169
|
+
await mountHdb(hdbRoot);
|
|
170
|
+
|
|
171
|
+
// Creates the boot prop file in user home dir. Boot prop file contains location of hdb config.
|
|
172
|
+
await createBootPropertiesFile();
|
|
173
|
+
|
|
174
|
+
// Create the harperdb-config.yaml file
|
|
175
|
+
await createConfigFile(installParams);
|
|
176
|
+
|
|
177
|
+
// At this point there should be config and Harper folders so re-init log settings to update
|
|
178
|
+
hdbLogger.initLogSettings(true);
|
|
179
|
+
|
|
180
|
+
// Create the super user.
|
|
181
|
+
await createSuperUser(installParams);
|
|
182
|
+
|
|
183
|
+
// Create cert and private keys.
|
|
184
|
+
await keys.updateConfigCert();
|
|
185
|
+
await keys.generateCertsKeys();
|
|
186
|
+
|
|
187
|
+
// Insert current version of Harper into versions table.
|
|
188
|
+
await insertHdbVersionInfo();
|
|
189
|
+
|
|
190
|
+
// Checks that the RSA keys exist for JWT generation, if not we create them.
|
|
191
|
+
checkJwtTokens();
|
|
192
|
+
|
|
193
|
+
spinner.stop();
|
|
194
|
+
|
|
195
|
+
console.log(HDB_PROMPT_MSG(LINE_BREAK + INSTALL_COMPLETE_MSG + LINE_BREAK));
|
|
196
|
+
hdbLogger.notify(INSTALL_COMPLETE_MSG);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function getConfigFromFile() {
|
|
200
|
+
let doc = YAML.parseDocument(fs.readFileSync(cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG], 'utf8'), {
|
|
201
|
+
simpleKeys: true,
|
|
202
|
+
});
|
|
203
|
+
const flatCfg = configUtils.flattenConfig(doc.toJSON());
|
|
204
|
+
|
|
205
|
+
// This ensures that if config file has rootpath, rootpath install prompt uses this value
|
|
206
|
+
if (flatCfg[hdbTerms.CONFIG_PARAMS.ROOTPATH.toLowerCase()])
|
|
207
|
+
flatCfg.ROOTPATH = flatCfg[hdbTerms.CONFIG_PARAMS.ROOTPATH.toLowerCase()];
|
|
208
|
+
|
|
209
|
+
return flatCfg;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Asks the user the questions needed to get Harper installed.
|
|
214
|
+
* If cmd/env vats are passed to install the prompts will not be asked.
|
|
215
|
+
* @param promptOverride - an object that contains all the params needed to install.
|
|
216
|
+
* @returns {Promise<*>}
|
|
217
|
+
*/
|
|
218
|
+
async function installPrompts(promptOverride) {
|
|
219
|
+
hdbLogger.trace('Getting install prompts and params.');
|
|
220
|
+
|
|
221
|
+
const promptsSchema = [
|
|
222
|
+
{
|
|
223
|
+
type: 'input',
|
|
224
|
+
transformer: PROMPT_ANSWER_TRANSFORMER,
|
|
225
|
+
when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.ROOTPATH], INSTALL_PROMPTS.DESTINATION),
|
|
226
|
+
name: hdbTerms.INSTALL_PROMPTS.ROOTPATH,
|
|
227
|
+
prefix: PROMPT_PREFIX,
|
|
228
|
+
default: DEFAULT_HDB_ROOT,
|
|
229
|
+
validate: async (value) => {
|
|
230
|
+
if (checkForEmptyValue(value)) return checkForEmptyValue(value);
|
|
231
|
+
if (await fs.pathExists(path.join(value, 'system', 'hdb_user.mdb')))
|
|
232
|
+
return `'${value}' is already in use. Please enter a different path.`;
|
|
233
|
+
return true;
|
|
234
|
+
},
|
|
235
|
+
message: HDB_PROMPT_MSG(INSTALL_PROMPTS.DESTINATION),
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: 'input',
|
|
239
|
+
transformer: PROMPT_ANSWER_TRANSFORMER,
|
|
240
|
+
when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME], INSTALL_PROMPTS.HDB_USERNAME),
|
|
241
|
+
name: hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME,
|
|
242
|
+
prefix: PROMPT_PREFIX,
|
|
243
|
+
default: DEFAULT_ADMIN_USERNAME,
|
|
244
|
+
validate: (value) => {
|
|
245
|
+
if (checkForEmptyValue(value)) return checkForEmptyValue(value);
|
|
246
|
+
return true;
|
|
247
|
+
},
|
|
248
|
+
message: HDB_PROMPT_MSG(INSTALL_PROMPTS.HDB_USERNAME),
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
type: 'password',
|
|
252
|
+
when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD], INSTALL_PROMPTS.HDB_PASS),
|
|
253
|
+
name: hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD,
|
|
254
|
+
prefix: PROMPT_PREFIX,
|
|
255
|
+
validate: (value) => {
|
|
256
|
+
if (checkForEmptyValue(value)) return checkForEmptyValue(value);
|
|
257
|
+
return true;
|
|
258
|
+
},
|
|
259
|
+
message: HDB_PROMPT_MSG(INSTALL_PROMPTS.HDB_PASS),
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
type: 'input',
|
|
263
|
+
transformer: PROMPT_ANSWER_TRANSFORMER,
|
|
264
|
+
when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME], INSTALL_PROMPTS.NODE_HOSTNAME),
|
|
265
|
+
name: hdbTerms.INSTALL_PROMPTS.NODE_HOSTNAME,
|
|
266
|
+
prefix: PROMPT_PREFIX,
|
|
267
|
+
default: DEFAULT_NODE_HOSTNAME,
|
|
268
|
+
validate: (value) => {
|
|
269
|
+
if (checkForEmptyValue(value)) return checkForEmptyValue(value);
|
|
270
|
+
return true;
|
|
271
|
+
},
|
|
272
|
+
message: HDB_PROMPT_MSG(INSTALL_PROMPTS.NODE_HOSTNAME),
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
type: 'input',
|
|
276
|
+
transformer: PROMPT_ANSWER_TRANSFORMER,
|
|
277
|
+
when: displayCmdEnvVar(promptOverride[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE], INSTALL_PROMPTS.DEFAULTS_MODE),
|
|
278
|
+
name: hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE,
|
|
279
|
+
prefix: PROMPT_PREFIX,
|
|
280
|
+
default: DEFAULT_CONFIG_MODE,
|
|
281
|
+
validate: (value) => {
|
|
282
|
+
if (checkForEmptyValue(value)) return checkForEmptyValue(value);
|
|
283
|
+
if (value !== 'dev' && value !== 'prod') {
|
|
284
|
+
return `Invalid response '${value}', options are 'dev' or 'prod'.`;
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
},
|
|
288
|
+
message: HDB_PROMPT_MSG(INSTALL_PROMPTS.DEFAULTS_MODE),
|
|
289
|
+
},
|
|
290
|
+
];
|
|
291
|
+
|
|
292
|
+
const answers = await inquirer.prompt(promptsSchema);
|
|
293
|
+
// If there are no answers all the prompts have been overridden.
|
|
294
|
+
if (Object.keys(answers).length === 0) {
|
|
295
|
+
return promptOverride;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Loop through the answers and if they dont exist in the promptOverride obj add them.
|
|
299
|
+
for (const param in answers) {
|
|
300
|
+
if (promptOverride[param] === undefined) {
|
|
301
|
+
promptOverride[param] = answers[param];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return promptOverride;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Used to log prompt override values. A boolean is returned because this will
|
|
310
|
+
* determine if the prompt is called or not.
|
|
311
|
+
* @param value
|
|
312
|
+
* @param msg
|
|
313
|
+
* @returns {boolean}
|
|
314
|
+
*/
|
|
315
|
+
function displayCmdEnvVar(value, msg) {
|
|
316
|
+
if (value !== undefined) {
|
|
317
|
+
if (msg.includes('password')) {
|
|
318
|
+
console.log(`${HDB_PROMPT_MSG(msg)} ${chalk.gray('[hidden]')}`);
|
|
319
|
+
hdbLogger.trace(`${HDB_PROMPT_MSG(msg)} [hidden]`);
|
|
320
|
+
} else {
|
|
321
|
+
console.log(`${HDB_PROMPT_MSG(msg)} ${value}`);
|
|
322
|
+
hdbLogger.trace(`${HDB_PROMPT_MSG(msg)} ${value}`);
|
|
323
|
+
}
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Checks for an empty value.
|
|
332
|
+
* @param value
|
|
333
|
+
* @returns {string|undefined}
|
|
334
|
+
*/
|
|
335
|
+
function checkForEmptyValue(value) {
|
|
336
|
+
const val = value.replace(/ /g, '');
|
|
337
|
+
if (val === '' || val === "''" || val === '""') {
|
|
338
|
+
return 'Value cannot be empty.';
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Check the cmd/env vars for any values that should override the install prompts.
|
|
346
|
+
*/
|
|
347
|
+
function checkForPromptOverride() {
|
|
348
|
+
const installPromptsArray = Object.keys(hdbTerms.INSTALL_PROMPTS);
|
|
349
|
+
// The config refactor meant that some config values have multiple key names (old and new). Also some of the
|
|
350
|
+
// prompts are not config file values. For this reason we search twice for any matching cmd/env vars.
|
|
351
|
+
const promptCmdenvArgs = assignCMDENVVariables(installPromptsArray);
|
|
352
|
+
const configCmdenvArgs = assignCMDENVVariables(Object.keys(hdbTerms.CONFIG_PARAM_MAP), true);
|
|
353
|
+
const overrideValues = {};
|
|
354
|
+
|
|
355
|
+
for (const install_prompt of installPromptsArray) {
|
|
356
|
+
// Get the config param for a prompt. There will be only one config param for a config value, this is the value
|
|
357
|
+
// that corresponds to a position in the config yaml file. This can be undefined because some of the prompts are
|
|
358
|
+
// not config file values.
|
|
359
|
+
const configParam = hdbTerms.CONFIG_PARAM_MAP[install_prompt.toLowerCase()];
|
|
360
|
+
|
|
361
|
+
// If cmd/env var is passed that matches one of the install wizard prompts add it to override values object.
|
|
362
|
+
if (promptCmdenvArgs[install_prompt]) {
|
|
363
|
+
if (configParam === undefined) {
|
|
364
|
+
overrideValues[install_prompt] = promptCmdenvArgs[install_prompt];
|
|
365
|
+
} else {
|
|
366
|
+
overrideValues[configParam.toUpperCase()] = promptCmdenvArgs[install_prompt];
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// If the prompt has a corresponding config param and that config param is present in the cmd/env vars, set that value
|
|
370
|
+
// to its corresponding prompt value.
|
|
371
|
+
} else if (configParam !== undefined && configCmdenvArgs[configParam.toLowerCase()]) {
|
|
372
|
+
overrideValues[install_prompt] = configCmdenvArgs[configParam.toLowerCase()];
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return overrideValues;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Checks for an existing install of Harper and prompts user accordingly.
|
|
381
|
+
* @returns {Promise<void>}
|
|
382
|
+
*/
|
|
383
|
+
async function checkForExistingInstall() {
|
|
384
|
+
hdbLogger.trace('Checking for existing install.');
|
|
385
|
+
const bootPropPath = hdbUtils.getPropsFilePath();
|
|
386
|
+
const bootFileExists = await fs.pathExists(bootPropPath);
|
|
387
|
+
|
|
388
|
+
let hdbExists;
|
|
389
|
+
if (bootFileExists) {
|
|
390
|
+
hdbLogger.trace(`Install found an existing boot prop file at:${bootPropPath}`);
|
|
391
|
+
const hdbProperties = PropertiesReader(bootPropPath);
|
|
392
|
+
const configFilePath =
|
|
393
|
+
configUtils.getConfigValue(hdbTerms.BOOT_PROP_PARAMS.SETTINGS_PATH_KEY) ||
|
|
394
|
+
hdbProperties.get(hdbTerms.BOOT_PROP_PARAMS.SETTINGS_PATH_KEY);
|
|
395
|
+
hdbExists = await fs.pathExists(configFilePath);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// If the boot file doesn't exist check to see if cli/env root path has been passed and
|
|
399
|
+
// is pointing to an installed HDB
|
|
400
|
+
if (!bootFileExists && hdbUtils.noBootFile()) hdbExists = true;
|
|
401
|
+
|
|
402
|
+
if (hdbExists && !ignoreExisting) {
|
|
403
|
+
hdbLogger.trace(`Install found existing HDB config at:${bootPropPath}`);
|
|
404
|
+
// getVersionUpdateInfo will only return an obj if there is an upgrade directive for the new version.
|
|
405
|
+
const upgradeObj = await hdbInfoController.getVersionUpdateInfo();
|
|
406
|
+
if (upgradeObj) {
|
|
407
|
+
const upgradeToVerMsg = `Please use \`harperdb upgrade\` to update to ${packageJson.version}. Exiting install...`;
|
|
408
|
+
console.log(LINE_BREAK + chalk.magenta.bold(UPGRADE_MSG));
|
|
409
|
+
console.log(chalk.magenta.bold(upgradeToVerMsg));
|
|
410
|
+
hdbLogger.error(upgradeToVerMsg);
|
|
411
|
+
} else {
|
|
412
|
+
console.log(LINE_BREAK + chalk.magenta.bold(HDB_EXISTS_MSG));
|
|
413
|
+
hdbLogger.error(HDB_EXISTS_MSG);
|
|
414
|
+
}
|
|
415
|
+
process.exit(0);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
async function createBootPropertiesFile() {
|
|
420
|
+
const configFilePath = path.join(hdbRoot, hdbTerms.HARPER_CONFIG_FILE);
|
|
421
|
+
|
|
422
|
+
let install_user;
|
|
423
|
+
try {
|
|
424
|
+
install_user = os.userInfo().username;
|
|
425
|
+
} catch {
|
|
426
|
+
// this could fail on android, try env variables
|
|
427
|
+
install_user =
|
|
428
|
+
process.env.USERNAME || process.env.USER || process.env.LOGNAME || process.env.LNAME || process.env.SUDO_USER;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
if (install_user) {
|
|
432
|
+
const bootPropsValue = `settings_path = ${configFilePath}
|
|
433
|
+
install_user = ${install_user}`;
|
|
434
|
+
|
|
435
|
+
const homeDir = hdbUtils.getHomeDir();
|
|
436
|
+
const homeDirPath = path.join(homeDir, hdbTerms.HDB_HOME_DIR_NAME);
|
|
437
|
+
const homeDirKeysDirPath = path.join(homeDirPath, hdbTerms.LICENSE_KEY_DIR_NAME);
|
|
438
|
+
const propsFilePath = path.join(homeDirPath, hdbTerms.BOOT_PROPS_FILE_NAME);
|
|
439
|
+
// if the properties file already exists, and we have an explicit ROOTPATH, we don't overwrite the existing
|
|
440
|
+
// properties file
|
|
441
|
+
if (!fs.existsSync(propsFilePath) || !hdbUtils.getEnvCliRootPath()) {
|
|
442
|
+
try {
|
|
443
|
+
fs.mkdirpSync(homeDirPath, { mode: hdbTerms.HDB_FILE_PERMISSIONS });
|
|
444
|
+
fs.mkdirpSync(homeDirKeysDirPath, { mode: hdbTerms.HDB_FILE_PERMISSIONS });
|
|
445
|
+
} catch {
|
|
446
|
+
console.error(
|
|
447
|
+
`Could not make settings directory ${hdbTerms.HDB_HOME_DIR_NAME} in home directory. Please check your permissions and try again.`
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
try {
|
|
452
|
+
await fs.writeFile(propsFilePath, bootPropsValue);
|
|
453
|
+
} catch (err) {
|
|
454
|
+
hdbLogger.error(`There was an error creating the boot file at path: ${propsFilePath}`);
|
|
455
|
+
throw err;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
envManager.setProperty(hdbTerms.HDB_SETTINGS_NAMES.INSTALL_USER, `${install_user}`);
|
|
460
|
+
envManager.setProperty(hdbTerms.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY, configFilePath);
|
|
461
|
+
envManager.setProperty(envManager.BOOT_PROPS_FILE_PATH, propsFilePath);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Calls the util function that creates the Harper config file.
|
|
467
|
+
* If an error occurs during the create install is rolled backed.
|
|
468
|
+
* @param installParams
|
|
469
|
+
* @returns {Promise<void>}
|
|
470
|
+
*/
|
|
471
|
+
async function createConfigFile(installParams) {
|
|
472
|
+
hdbLogger.trace('Creating Harper config file');
|
|
473
|
+
const args = assignCMDENVVariables(Object.keys(hdbTerms.CONFIG_PARAM_MAP), true);
|
|
474
|
+
Object.assign(args, installParams);
|
|
475
|
+
|
|
476
|
+
// If installing in dev mode set dev config defaults
|
|
477
|
+
if (installParams[hdbTerms.INSTALL_PROMPTS.DEFAULTS_MODE] === 'dev') {
|
|
478
|
+
process.env.DEV_MODE = 'true';
|
|
479
|
+
for (const cfg in DEV_MODE_CONFIG) {
|
|
480
|
+
// Before setting http.port check that secure port is not being passed
|
|
481
|
+
if (cfg === CONFIG_PARAMS.HTTP_PORT && args[CONFIG_PARAMS.HTTP_SECUREPORT.toLowerCase()] === undefined) {
|
|
482
|
+
args[cfg] = args[cfg.toLowerCase()] ?? DEV_MODE_CONFIG[cfg];
|
|
483
|
+
// set secure port to null to override default
|
|
484
|
+
args[CONFIG_PARAMS.HTTP_SECUREPORT] = null;
|
|
485
|
+
continue;
|
|
486
|
+
} else if (cfg === CONFIG_PARAMS.HTTP_PORT) {
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// Before setting ops API port check that secure port is not being passed
|
|
491
|
+
if (
|
|
492
|
+
cfg === CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT &&
|
|
493
|
+
args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT.toLowerCase()] === undefined
|
|
494
|
+
) {
|
|
495
|
+
args[cfg] = args[cfg.toLowerCase()] ?? DEV_MODE_CONFIG[cfg];
|
|
496
|
+
// set secure port to null to override default
|
|
497
|
+
args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT] = null;
|
|
498
|
+
continue;
|
|
499
|
+
} else if (cfg === CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT) {
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (args[cfg.toLowerCase()] === undefined) args[cfg] = DEV_MODE_CONFIG[cfg];
|
|
504
|
+
}
|
|
505
|
+
} else {
|
|
506
|
+
if (args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_PORT.toLowerCase()])
|
|
507
|
+
args[CONFIG_PARAMS.OPERATIONSAPI_NETWORK_SECUREPORT] = null;
|
|
508
|
+
if (args[CONFIG_PARAMS.HTTP_PORT.toLowerCase()]) args[CONFIG_PARAMS.HTTP_SECUREPORT] = null;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
try {
|
|
512
|
+
if (!cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) {
|
|
513
|
+
// Create the Harper config file.
|
|
514
|
+
configUtils.createConfigFile(args);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
envManager.initSync();
|
|
518
|
+
} catch (configErr) {
|
|
519
|
+
rollbackInstall(configErr);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Used to remove the .harperdb and hdb folder if there is an error with creating the config file.
|
|
525
|
+
* @param errMsg
|
|
526
|
+
*/
|
|
527
|
+
function rollbackInstall(errMsg) {
|
|
528
|
+
hdbLogger.error(`Error creating Harper config file. Rolling back install - ${errMsg}`);
|
|
529
|
+
console.error(errMsg);
|
|
530
|
+
console.error(ABORT_MSG);
|
|
531
|
+
|
|
532
|
+
// Remove boot file folder.
|
|
533
|
+
const harperdbBootFolder = path.resolve(envManager.get(envManager.BOOT_PROPS_FILE_PATH), '../');
|
|
534
|
+
if (harperdbBootFolder) {
|
|
535
|
+
fs.removeSync(harperdbBootFolder);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// Remove HDB.
|
|
539
|
+
if (hdbRoot) {
|
|
540
|
+
// We do a conditional rollback if installing from config file that exists in the hdb rootpath
|
|
541
|
+
if (conditionalRollback) {
|
|
542
|
+
const dir = fs.readdirSync(hdbRoot, { withFileTypes: true });
|
|
543
|
+
dir.forEach((d) => {
|
|
544
|
+
const fullPath = path.join(d.path, d.name);
|
|
545
|
+
if (fullPath !== cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG]) {
|
|
546
|
+
fs.removeSync(fullPath);
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
} else {
|
|
550
|
+
fs.removeSync(hdbRoot);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
process.exit(1);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Creates a Harper role and then adds a use to that role.
|
|
559
|
+
* @param role
|
|
560
|
+
* @param adminUser
|
|
561
|
+
* @returns {Promise<void>}
|
|
562
|
+
*/
|
|
563
|
+
async function createAdminUser(role, adminUser) {
|
|
564
|
+
hdbLogger.trace('Creating admin user');
|
|
565
|
+
|
|
566
|
+
await pSchemaToGlobal();
|
|
567
|
+
let roleResponse;
|
|
568
|
+
try {
|
|
569
|
+
roleResponse = await roleOps.addRole(role);
|
|
570
|
+
} catch (err) {
|
|
571
|
+
// This is here to allow installs overtop of existing user/roles tables
|
|
572
|
+
if (err.message.includes('already exists')) {
|
|
573
|
+
adminUser = undefined;
|
|
574
|
+
} else {
|
|
575
|
+
err.message += 'Error creating role';
|
|
576
|
+
throw err;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
if (adminUser) {
|
|
581
|
+
try {
|
|
582
|
+
adminUser.role = roleResponse.role;
|
|
583
|
+
await userOps.addUser(adminUser);
|
|
584
|
+
} catch (err) {
|
|
585
|
+
err.message = `Error creating user - ${err}`;
|
|
586
|
+
throw err;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* Create HDB admin user with input from user.
|
|
593
|
+
* @param installParams
|
|
594
|
+
* @returns {Promise<void>}
|
|
595
|
+
*/
|
|
596
|
+
async function createSuperUser(installParams) {
|
|
597
|
+
hdbLogger.trace('Creating Super user.');
|
|
598
|
+
const role = {
|
|
599
|
+
role: 'super_user',
|
|
600
|
+
permission: {
|
|
601
|
+
super_user: true,
|
|
602
|
+
},
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
const user = {
|
|
606
|
+
username: installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME].toString(),
|
|
607
|
+
password: installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD].toString(),
|
|
608
|
+
active: true,
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
await createAdminUser(role, user);
|
|
612
|
+
delete installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_USERNAME];
|
|
613
|
+
delete installParams[hdbTerms.INSTALL_PROMPTS.HDB_ADMIN_PASSWORD];
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Makes a call to insert the hdbInfo table with the newly installed version,
|
|
618
|
+
* @returns {Promise<void>}
|
|
619
|
+
*/
|
|
620
|
+
async function insertHdbVersionInfo() {
|
|
621
|
+
const vers = packageJson.version;
|
|
622
|
+
if (vers) {
|
|
623
|
+
await hdbInfoController.insertHdbInstallInfo(vers);
|
|
624
|
+
} else {
|
|
625
|
+
throw new Error('The version is missing/removed from Harper package.json');
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
function updateConfigEnv(value) {
|
|
630
|
+
cfgEnv[hdbTerms.INSTALL_PROMPTS.HDB_CONFIG] = value;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
function setIgnoreExisting(value) {
|
|
634
|
+
ignoreExisting = value;
|
|
635
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Logger } from '../components/Logger.ts';
|
|
2
|
+
import * as terms from './hdbTerms.js';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import { noBootFile, getPropsFilePath } from './common_utils.js';
|
|
5
|
+
|
|
6
|
+
interface Env {
|
|
7
|
+
get(key: string): string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** isHdbInstalled checks for a valid installation of Harper based on the env
|
|
11
|
+
* arg's settings path and any boot props file it can find and returns true
|
|
12
|
+
* if an installation is found; false otherwise.
|
|
13
|
+
*/
|
|
14
|
+
export function isHdbInstalled(env: Env, logger: Pick<Logger, 'error'>) {
|
|
15
|
+
try {
|
|
16
|
+
fs.statSync(getPropsFilePath());
|
|
17
|
+
fs.statSync(env.get(terms.HDB_SETTINGS_NAMES.SETTINGS_PATH_KEY));
|
|
18
|
+
} catch (err) {
|
|
19
|
+
if (noBootFile()) return true;
|
|
20
|
+
if (err.code === 'ENOENT') {
|
|
21
|
+
// either boot props or settings file not found, hdb not installed
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
logger.error(`Error checking for HDB install - ${err}`);
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* used to define specific attributes of a dbi.
|
|
5
|
+
* dupSort for allowing duplicate keys, or not
|
|
6
|
+
* intKey defines if the key entries are integers or not
|
|
7
|
+
*/
|
|
8
|
+
class DBIDefinition {
|
|
9
|
+
/**
|
|
10
|
+
* @param {Boolean} dupSort - allow duplicate keys, or not
|
|
11
|
+
* @param {Boolean} isPrimaryKey - defines if this is the primary key
|
|
12
|
+
*/
|
|
13
|
+
constructor(dupSort = false, isPrimaryKey = false) {
|
|
14
|
+
this.dup_sort = dupSort;
|
|
15
|
+
this.isPrimaryKey = isPrimaryKey;
|
|
16
|
+
this.useVersions = isPrimaryKey;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
module.exports = DBIDefinition;
|