onboardconnect-agent 0.1.1

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.
Files changed (58) hide show
  1. package/dist/crypto.d.ts +3 -0
  2. package/dist/crypto.d.ts.map +1 -0
  3. package/dist/crypto.js +12 -0
  4. package/dist/crypto.js.map +1 -0
  5. package/dist/heartbeat.d.ts +17 -0
  6. package/dist/heartbeat.d.ts.map +1 -0
  7. package/dist/heartbeat.js +86 -0
  8. package/dist/heartbeat.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +81 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/ldap.d.ts +31 -0
  14. package/dist/ldap.d.ts.map +1 -0
  15. package/dist/ldap.js +420 -0
  16. package/dist/ldap.js.map +1 -0
  17. package/dist/logger.d.ts +9 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +47 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/relay.d.ts +38 -0
  22. package/dist/relay.d.ts.map +1 -0
  23. package/dist/relay.js +347 -0
  24. package/dist/relay.js.map +1 -0
  25. package/dist/request-log.d.ts +24 -0
  26. package/dist/request-log.d.ts.map +1 -0
  27. package/dist/request-log.js +52 -0
  28. package/dist/request-log.js.map +1 -0
  29. package/dist/server.d.ts +30 -0
  30. package/dist/server.d.ts.map +1 -0
  31. package/dist/server.js +509 -0
  32. package/dist/server.js.map +1 -0
  33. package/dist/setup.d.ts +3 -0
  34. package/dist/setup.d.ts.map +1 -0
  35. package/dist/setup.js +342 -0
  36. package/dist/setup.js.map +1 -0
  37. package/dist/store.d.ts +53 -0
  38. package/dist/store.d.ts.map +1 -0
  39. package/dist/store.js +170 -0
  40. package/dist/store.js.map +1 -0
  41. package/dist/uninstall.d.ts +2 -0
  42. package/dist/uninstall.d.ts.map +1 -0
  43. package/dist/uninstall.js +127 -0
  44. package/dist/uninstall.js.map +1 -0
  45. package/dist/updater.d.ts +4 -0
  46. package/dist/updater.d.ts.map +1 -0
  47. package/dist/updater.js +30 -0
  48. package/dist/updater.js.map +1 -0
  49. package/package.json +62 -0
  50. package/scripts/install.ps1 +133 -0
  51. package/scripts/install.sh +132 -0
  52. package/scripts/postinstall.js +21 -0
  53. package/scripts/postinstall.ts +24 -0
  54. package/scripts/uninstall.ps1 +93 -0
  55. package/scripts/uninstall.sh +85 -0
  56. package/ui/assets/index-Bf505_Hi.css +1 -0
  57. package/ui/assets/index-zxbHz6zx.js +71 -0
  58. package/ui/index.html +23 -0
@@ -0,0 +1,127 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import inquirer from "inquirer";
4
+ import { existsSync, rmSync } from "fs";
5
+ import { execSync } from "child_process";
6
+ import { join } from "path";
7
+ const OC_CONFIG_DIR = process.platform === "win32"
8
+ ? join(process.env["PROGRAMDATA"] ?? "C:\\ProgramData", "OnboardConnect")
9
+ : "/etc/onboardconnect";
10
+ const OC_LOG_DIR = process.platform === "win32"
11
+ ? join(process.env["USERPROFILE"] ?? "C:\\Users\\Default", ".oc-agent")
12
+ : join(process.env["HOME"] ?? "/root", ".oc-agent");
13
+ async function ocStopAndRemoveService() {
14
+ const spinner = ora("Stopping OC Agent service...").start();
15
+ if (process.platform === "win32") {
16
+ try {
17
+ const { Service } = await import("node-windows");
18
+ const svc = new Service({
19
+ name: "OnboardConnect Agent",
20
+ script: "",
21
+ });
22
+ await new Promise((resolve) => {
23
+ svc.on("stop", () => {
24
+ spinner.text = "Removing OC Agent service...";
25
+ svc.uninstall();
26
+ });
27
+ svc.on("uninstall", resolve);
28
+ svc.on("error", () => resolve());
29
+ try {
30
+ svc.stop();
31
+ }
32
+ catch {
33
+ resolve();
34
+ }
35
+ });
36
+ spinner.succeed("Service stopped and removed ✓");
37
+ }
38
+ catch {
39
+ spinner.warn("Service stop/remove skipped (may not be installed as a service)");
40
+ }
41
+ }
42
+ else {
43
+ try {
44
+ execSync("systemctl stop oc-agent 2>/dev/null || true", { stdio: "pipe" });
45
+ execSync("systemctl disable oc-agent 2>/dev/null || true", { stdio: "pipe" });
46
+ const unitPath = "/etc/systemd/system/oc-agent.service";
47
+ if (existsSync(unitPath)) {
48
+ rmSync(unitPath);
49
+ execSync("systemctl daemon-reload", { stdio: "pipe" });
50
+ }
51
+ spinner.succeed("Service stopped and removed ✓");
52
+ }
53
+ catch {
54
+ spinner.warn("Service stop/remove skipped (service may not be installed)");
55
+ }
56
+ }
57
+ }
58
+ function ocDeleteConfigDir(removeLogs) {
59
+ if (existsSync(OC_CONFIG_DIR)) {
60
+ const spinner = ora(`Deleting config directory: ${OC_CONFIG_DIR}`).start();
61
+ try {
62
+ rmSync(OC_CONFIG_DIR, { recursive: true, force: true });
63
+ spinner.succeed("Config directory deleted ✓");
64
+ }
65
+ catch (err) {
66
+ spinner.fail(`Failed to delete config dir: ${err instanceof Error ? err.message : String(err)}`);
67
+ }
68
+ }
69
+ else {
70
+ console.log(chalk.gray(` Config directory not found, skipping: ${OC_CONFIG_DIR}`));
71
+ }
72
+ if (removeLogs && existsSync(OC_LOG_DIR)) {
73
+ const spinner = ora(`Deleting log directory: ${OC_LOG_DIR}`).start();
74
+ try {
75
+ rmSync(OC_LOG_DIR, { recursive: true, force: true });
76
+ spinner.succeed("Log directory deleted ✓");
77
+ }
78
+ catch (err) {
79
+ spinner.fail(`Failed to delete log dir: ${err instanceof Error ? err.message : String(err)}`);
80
+ }
81
+ }
82
+ }
83
+ function ocUninstallPackage() {
84
+ const spinner = ora("Removing npm global package...").start();
85
+ try {
86
+ execSync("npm uninstall -g onboardconnect-agent", { stdio: "pipe" });
87
+ spinner.succeed("Package removed ✓");
88
+ }
89
+ catch {
90
+ spinner.warn("npm uninstall skipped (package may not be globally installed)");
91
+ }
92
+ }
93
+ export async function ocUninstall() {
94
+ console.log(chalk.bold.red("\n OnboardConnect Local Agent — Uninstall\n"));
95
+ console.log(chalk.gray(" This will stop the agent service, remove all configuration,\n and optionally uninstall the npm package.\n"));
96
+ const { confirm } = await inquirer.prompt([{
97
+ type: "confirm",
98
+ name: "confirm",
99
+ message: chalk.yellow("Are you sure you want to uninstall the OC Agent?"),
100
+ default: false,
101
+ }]);
102
+ if (!confirm) {
103
+ console.log(chalk.gray("\n Uninstall cancelled.\n"));
104
+ return;
105
+ }
106
+ const { removeLogs } = await inquirer.prompt([{
107
+ type: "confirm",
108
+ name: "removeLogs",
109
+ message: "Also delete agent log files?",
110
+ default: false,
111
+ }]);
112
+ const { removePackage } = await inquirer.prompt([{
113
+ type: "confirm",
114
+ name: "removePackage",
115
+ message: "Remove the onboardconnect-agent npm package?",
116
+ default: true,
117
+ }]);
118
+ console.log("");
119
+ await ocStopAndRemoveService();
120
+ ocDeleteConfigDir(removeLogs);
121
+ if (removePackage) {
122
+ ocUninstallPackage();
123
+ }
124
+ console.log(chalk.bold.green("\n ✓ Uninstall complete.\n"));
125
+ console.log(chalk.gray(" To reinstall, run: npm install -g onboardconnect-agent\n"));
126
+ }
127
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class OcUpdater {
2
+ checkForUpdates(): Promise<void>;
3
+ }
4
+ //# sourceMappingURL=updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAKA,qBAAa,SAAS;IACd,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CA+BvC"}
@@ -0,0 +1,30 @@
1
+ import { OcLogger } from "./logger.js";
2
+ import { createRequire } from "module";
3
+ const logger = new OcLogger("updater");
4
+ export class OcUpdater {
5
+ async checkForUpdates() {
6
+ try {
7
+ const require = createRequire(import.meta.url);
8
+ const pkg = require("../package.json");
9
+ const current = pkg.version;
10
+ const response = await fetch("https://registry.npmjs.org/onboardconnect-agent/latest", {
11
+ signal: AbortSignal.timeout(5000),
12
+ });
13
+ if (!response.ok)
14
+ return;
15
+ const data = await response.json();
16
+ const latest = data.version;
17
+ if (latest !== current) {
18
+ logger.warn(`⚠️ New version available: ${latest} (current: ${current})`, { current, latest });
19
+ console.log(`\n ╔══════════════════════════════════════════════╗\n` +
20
+ ` ║ Update available: v${current} → v${latest} ║\n` +
21
+ ` ║ Run: npx onboardconnect-agent@latest upgrade ║\n` +
22
+ ` ╚══════════════════════════════════════════════╝\n`);
23
+ }
24
+ }
25
+ catch {
26
+ // Non-fatal — agent proceeds without update check if npm is unreachable
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AAEvC,MAAM,OAAO,SAAS;IACpB,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;YAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAE5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,wDAAwD,EAAE;gBACrF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO;YAEzB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyB,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAE5B,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CACT,8BAA8B,MAAM,cAAc,OAAO,GAAG,EAC5D,EAAE,OAAO,EAAE,MAAM,EAAE,CACpB,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,wDAAwD;oBACxD,2BAA2B,OAAO,OAAO,MAAM,OAAO;oBACtD,uDAAuD;oBACvD,sDAAsD,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;IACH,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "onboardconnect-agent",
3
+ "version": "0.1.1",
4
+ "description": "OnboardConnect On-Prem Agent — LDAP provisioning bridge for on-premises Active Directory",
5
+ "keywords": [
6
+ "onboardconnect",
7
+ "active-directory",
8
+ "ldap",
9
+ "provisioning",
10
+ "slate-crm"
11
+ ],
12
+ "homepage": "https://onboardconnectapp.com/docs/agent",
13
+ "license": "UNLICENSED",
14
+ "type": "module",
15
+ "bin": {
16
+ "oc-agent": "dist/index.js"
17
+ },
18
+ "main": "./dist/index.js",
19
+ "files": [
20
+ "dist",
21
+ "scripts",
22
+ "ui"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "dev": "tsx watch src/index.ts",
27
+ "setup": "tsx src/setup.ts",
28
+ "start": "node dist/index.js",
29
+ "typecheck": "tsc --noEmit",
30
+ "test:unit": "vitest run",
31
+ "clean": "rimraf dist *.tsbuildinfo",
32
+ "uninstall": "tsx src/uninstall.ts",
33
+ "postinstall": "node scripts/postinstall.js"
34
+ },
35
+ "dependencies": {
36
+ "ldapts": "^7.2.0",
37
+ "ssh2": "^1.16.0",
38
+ "winston": "^3.17.0",
39
+ "winston-daily-rotate-file": "^5.0.0",
40
+ "lru-cache": "^11.0.0",
41
+ "inquirer": "^12.0.0",
42
+ "chalk": "^5.4.0",
43
+ "ora": "^8.0.0",
44
+ "ws": "^8.18.0",
45
+ "zod": "^3.24.0",
46
+ "semver": "^7.7.0"
47
+ },
48
+ "devDependencies": {
49
+ "@oc/types": "workspace:*",
50
+ "@types/node": "^22.0.0",
51
+ "@types/ssh2": "^1.15.0",
52
+ "@types/ws": "^8.5.0",
53
+ "@types/semver": "^7.5.0",
54
+ "tsx": "^4.19.0",
55
+ "typescript": "^5.7.0",
56
+ "vitest": "^2.0.0",
57
+ "rimraf": "^6.0.0"
58
+ },
59
+ "engines": {
60
+ "node": ">=18"
61
+ }
62
+ }
@@ -0,0 +1,133 @@
1
+ #Requires -RunAsAdministrator
2
+ <#
3
+ .SYNOPSIS
4
+ OnboardConnect Local Agent — Windows Installer
5
+ .DESCRIPTION
6
+ Installs the OnboardConnect On-Prem Agent as a Windows service.
7
+ Requires: Windows 10/11 or Server 2016+, outbound HTTPS on port 443.
8
+ .EXAMPLE
9
+ # Run from an elevated PowerShell prompt:
10
+ iwr https://api.onboardconnectapp.com/api/public/agent/install.ps1 -UseBasicParsing | iex
11
+ #>
12
+
13
+ param(
14
+ [string]$ApiBase = "https://api.onboardconnectapp.com"
15
+ )
16
+
17
+ $ErrorActionPreference = "Stop"
18
+ $ProgressPreference = "SilentlyContinue" # faster Invoke-WebRequest
19
+
20
+ # ─── Banner ───────────────────────────────────────────────────────────────────
21
+
22
+ Write-Host ""
23
+ Write-Host " ╔══════════════════════════════════════════════════════╗" -ForegroundColor Cyan
24
+ Write-Host " ║ OnboardConnect On-Prem Agent — Installer ║" -ForegroundColor Cyan
25
+ Write-Host " ╚══════════════════════════════════════════════════════╝" -ForegroundColor Cyan
26
+ Write-Host ""
27
+
28
+ # ─── Helper ───────────────────────────────────────────────────────────────────
29
+
30
+ function Write-Step([int]$n, [int]$total, [string]$text) {
31
+ Write-Host " [$n/$total] $text" -ForegroundColor White
32
+ }
33
+ function Write-OK([string]$text) { Write-Host " $text" -ForegroundColor Green }
34
+ function Write-Warn([string]$text) { Write-Host " $text" -ForegroundColor Yellow }
35
+ function Write-Fail([string]$text) { Write-Host " ERROR: $text" -ForegroundColor Red }
36
+
37
+ # ─── Step 1: Node.js ──────────────────────────────────────────────────────────
38
+
39
+ Write-Step 1 4 "Checking Node.js (>= 18 required)..."
40
+
41
+ $nodeOk = $false
42
+ try {
43
+ $nodeRaw = (& node --version 2>$null).TrimStart("v")
44
+ $nodeMajor = [int]($nodeRaw -split "\.")[0]
45
+ if ($nodeMajor -ge 18) {
46
+ Write-OK "Node.js $nodeRaw found ✓"
47
+ $nodeOk = $true
48
+ } else {
49
+ Write-Warn "Node.js $nodeRaw found — version 18+ required. Will upgrade."
50
+ }
51
+ } catch {
52
+ Write-Warn "Node.js not found. Installing via winget..."
53
+ }
54
+
55
+ if (-not $nodeOk) {
56
+ try {
57
+ winget install --id OpenJS.NodeJS.LTS `
58
+ --accept-source-agreements `
59
+ --accept-package-agreements `
60
+ --silent | Out-Null
61
+
62
+ # Refresh PATH for current session
63
+ $machinePath = [System.Environment]::GetEnvironmentVariable("PATH", "Machine")
64
+ $userPath = [System.Environment]::GetEnvironmentVariable("PATH", "User")
65
+ $env:PATH = "$machinePath;$userPath"
66
+
67
+ $newVer = (& node --version 2>$null).TrimStart("v")
68
+ Write-OK "Node.js $newVer installed ✓"
69
+ } catch {
70
+ Write-Fail "Could not auto-install Node.js. Please install Node.js 18+ from https://nodejs.org and re-run this script."
71
+ exit 1
72
+ }
73
+ }
74
+
75
+ # ─── Step 2: Install agent package ───────────────────────────────────────────
76
+
77
+ Write-Step 2 4 "Installing onboardconnect-agent via npm..."
78
+ try {
79
+ & npm install -g onboardconnect-agent --quiet 2>&1 | Out-Null
80
+ $agentVer = (& npm list -g onboardconnect-agent --depth=0 --json 2>$null | ConvertFrom-Json).dependencies."onboardconnect-agent".version
81
+ Write-OK "onboardconnect-agent@$agentVer installed ✓"
82
+ } catch {
83
+ Write-Fail "npm install failed: $_"
84
+ Write-Warn "Ensure npm is in your PATH and you have internet access."
85
+ exit 1
86
+ }
87
+
88
+ # ─── Step 3: Prerequisites reminder ──────────────────────────────────────────
89
+
90
+ Write-Step 3 4 "Prerequisites checklist"
91
+ Write-Host ""
92
+ Write-Host " Before continuing, confirm the following:" -ForegroundColor DarkGray
93
+ Write-Host " ✦ A service account with LDAP bind rights is ready." -ForegroundColor DarkGray
94
+ Write-Host " ✦ Port 636 (LDAPS) or 389 (LDAP) is reachable from this server." -ForegroundColor DarkGray
95
+ Write-Host " ✦ Outbound HTTPS (port 443) to $ApiBase is allowed." -ForegroundColor DarkGray
96
+ Write-Host " ✦ You have a one-time Setup Token from your Tenant Portal." -ForegroundColor DarkGray
97
+ Write-Host " (Connections → New Connection → On-Prem Agent → Generate Setup Token)" -ForegroundColor DarkGray
98
+ Write-Host ""
99
+ $confirm = Read-Host " Ready to continue? (Y/N)"
100
+ if ($confirm -notmatch "^[Yy]") {
101
+ Write-Host " Setup cancelled. Re-run this script when ready." -ForegroundColor Yellow
102
+ exit 0
103
+ }
104
+
105
+ # ─── Step 4: Run setup wizard ────────────────────────────────────────────────
106
+
107
+ Write-Step 4 4 "Launching OnboardConnect Agent Setup Wizard..."
108
+ Write-Host ""
109
+
110
+ $env:OC_API_BASE = $ApiBase
111
+ try {
112
+ & oc-agent setup
113
+ } catch {
114
+ Write-Fail "Setup wizard failed: $_"
115
+ Write-Warn "You can re-run setup at any time with: oc-agent setup"
116
+ exit 1
117
+ }
118
+
119
+ # ─── Done ────────────────────────────────────────────────────────────────────
120
+
121
+ Write-Host ""
122
+ Write-Host " ╔══════════════════════════════════════════════════════╗" -ForegroundColor Green
123
+ Write-Host " ║ Installation complete! ║" -ForegroundColor Green
124
+ Write-Host " ╚══════════════════════════════════════════════════════╝" -ForegroundColor Green
125
+ Write-Host ""
126
+ Write-Host " The agent is now running as a Windows service." -ForegroundColor DarkGray
127
+ Write-Host " View status in your Tenant Portal → Connections." -ForegroundColor DarkGray
128
+ Write-Host ""
129
+ Write-Host " Useful commands:" -ForegroundColor DarkGray
130
+ Write-Host " Get-Service OnboardConnectAgent # Service status" -ForegroundColor DarkGray
131
+ Write-Host " sc query OnboardConnectAgent # Detailed status" -ForegroundColor DarkGray
132
+ Write-Host " oc-agent setup # Re-run setup" -ForegroundColor DarkGray
133
+ Write-Host ""
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env bash
2
+ # OnboardConnect Local Agent — Linux / macOS Installer
3
+ #
4
+ # Run as root:
5
+ # curl -sSL https://api.onboardconnectapp.com/api/public/agent/install.sh | sudo bash
6
+ #
7
+ # Or download and inspect first:
8
+ # curl -fsSLO https://api.onboardconnectapp.com/api/public/agent/install.sh
9
+ # chmod +x install.sh && sudo ./install.sh
10
+
11
+ set -euo pipefail
12
+
13
+ OC_API_BASE="${OC_API_BASE:-https://api.onboardconnectapp.com}"
14
+ OC_NODE_MIN=18
15
+
16
+ # ─── Helpers ─────────────────────────────────────────────────────────────────
17
+
18
+ CYAN='\033[0;36m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'
19
+ GRAY='\033[0;90m'; BOLD='\033[1m'; RESET='\033[0m'
20
+
21
+ step() { echo -e "\n ${BOLD}[$1/$2]${RESET} $3"; }
22
+ ok() { echo -e " ${GREEN}$1${RESET}"; }
23
+ warn() { echo -e " ${YELLOW}$1${RESET}"; }
24
+ fail() { echo -e "\n ${RED}ERROR: $1${RESET}\n"; exit 1; }
25
+ info() { echo -e " ${GRAY}$1${RESET}"; }
26
+
27
+ # ─── Root check ───────────────────────────────────────────────────────────────
28
+
29
+ if [ "$EUID" -ne 0 ]; then
30
+ fail "This installer must be run as root. Use: sudo bash install.sh"
31
+ fi
32
+
33
+ # ─── Banner ───────────────────────────────────────────────────────────────────
34
+
35
+ echo ""
36
+ echo -e " ${CYAN}╔══════════════════════════════════════════════════════╗${RESET}"
37
+ echo -e " ${CYAN}║ OnboardConnect Local Agent — Installer ║${RESET}"
38
+ echo -e " ${CYAN}╚══════════════════════════════════════════════════════╝${RESET}"
39
+ echo ""
40
+
41
+ # ─── Step 1: Node.js ──────────────────────────────────────────────────────────
42
+
43
+ step 1 4 "Checking Node.js (>= $OC_NODE_MIN required)..."
44
+
45
+ NODE_OK=false
46
+ if command -v node &>/dev/null; then
47
+ NODE_VER=$(node --version | tr -d 'v')
48
+ NODE_MAJOR=$(echo "$NODE_VER" | cut -d. -f1)
49
+ if [ "$NODE_MAJOR" -ge "$OC_NODE_MIN" ]; then
50
+ ok "Node.js $NODE_VER found ✓"
51
+ NODE_OK=true
52
+ else
53
+ warn "Node.js $NODE_VER found — version $OC_NODE_MIN+ required. Will install."
54
+ fi
55
+ else
56
+ warn "Node.js not found. Installing..."
57
+ fi
58
+
59
+ if [ "$NODE_OK" = false ]; then
60
+ # Detect OS and install accordingly
61
+ if [ -f /etc/debian_version ] || grep -qi ubuntu /etc/os-release 2>/dev/null; then
62
+ info "Detected Debian/Ubuntu. Installing via NodeSource..."
63
+ apt-get update -qq
64
+ apt-get install -y curl gnupg
65
+ curl -fsSL https://deb.nodesource.com/setup_20.x | bash - >/dev/null 2>&1
66
+ apt-get install -y nodejs >/dev/null 2>&1
67
+ elif [ -f /etc/redhat-release ] || grep -qi "centos\|rhel\|fedora" /etc/os-release 2>/dev/null; then
68
+ info "Detected RHEL/CentOS/Fedora. Installing via NodeSource..."
69
+ curl -fsSL https://rpm.nodesource.com/setup_20.x | bash - >/dev/null 2>&1
70
+ yum install -y nodejs >/dev/null 2>&1
71
+ elif [[ "$(uname)" == "Darwin" ]]; then
72
+ info "Detected macOS. Installing via Homebrew..."
73
+ if ! command -v brew &>/dev/null; then
74
+ fail "Homebrew not found. Install it from https://brew.sh then re-run."
75
+ fi
76
+ brew install node@20 >/dev/null 2>&1
77
+ else
78
+ fail "Unsupported OS. Install Node.js 18+ manually from https://nodejs.org and re-run."
79
+ fi
80
+
81
+ NODE_VER=$(node --version | tr -d 'v')
82
+ ok "Node.js $NODE_VER installed ✓"
83
+ fi
84
+
85
+ # ─── Step 2: Install agent package ───────────────────────────────────────────
86
+
87
+ step 2 4 "Installing onboardconnect-agent via npm..."
88
+
89
+ npm install -g onboardconnect-agent --quiet >/dev/null 2>&1
90
+ AGENT_VER=$(npm list -g onboardconnect-agent --depth=0 --json 2>/dev/null | node -e "process.stdin||(p=require('/dev/stdin')),process.stdout.write(JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')).dependencies['onboardconnect-agent'].version)" 2>/dev/null || echo "installed")
91
+ ok "onboardconnect-agent@${AGENT_VER} installed ✓"
92
+
93
+ # ─── Step 3: Prerequisites reminder ──────────────────────────────────────────
94
+
95
+ step 3 4 "Prerequisites checklist"
96
+ echo ""
97
+ echo -e " ${GRAY}Before continuing, confirm the following:${RESET}"
98
+ echo -e " ${GRAY} ✦ A service account with LDAP bind rights is ready.${RESET}"
99
+ echo -e " ${GRAY} ✦ Port 636 (LDAPS) or 389 (LDAP) is reachable from this server.${RESET}"
100
+ echo -e " ${GRAY} ✦ Outbound HTTPS (port 443) to ${OC_API_BASE} is allowed.${RESET}"
101
+ echo -e " ${GRAY} ✦ You have a one-time Setup Token from your Tenant Portal.${RESET}"
102
+ echo -e " ${GRAY} (Connections → New Connection → On-Prem Agent → Generate Setup Token)${RESET}"
103
+ echo ""
104
+ read -rp " Ready to continue? (y/N) " CONFIRM
105
+ if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
106
+ echo -e "\n Setup cancelled. Re-run when ready.\n"
107
+ exit 0
108
+ fi
109
+
110
+ # ─── Step 4: Run setup wizard ────────────────────────────────────────────────
111
+
112
+ step 4 4 "Launching OnboardConnect Agent Setup Wizard..."
113
+ echo ""
114
+
115
+ export OC_API_BASE
116
+ oc-agent setup
117
+
118
+ # ─── Done ────────────────────────────────────────────────────────────────────
119
+
120
+ echo ""
121
+ echo -e " ${GREEN}╔══════════════════════════════════════════════════════╗${RESET}"
122
+ echo -e " ${GREEN}║ Installation complete! ║${RESET}"
123
+ echo -e " ${GREEN}╚══════════════════════════════════════════════════════╝${RESET}"
124
+ echo ""
125
+ echo -e " ${GRAY}The agent is now running as a systemd service.${RESET}"
126
+ echo -e " ${GRAY}View status in your Tenant Portal → Connections.${RESET}"
127
+ echo ""
128
+ echo -e " ${GRAY}Useful commands:${RESET}"
129
+ echo -e " ${GRAY} systemctl status oc-agent # Service status${RESET}"
130
+ echo -e " ${GRAY} journalctl -u oc-agent -f # Live logs${RESET}"
131
+ echo -e " ${GRAY} oc-agent setup # Re-run setup${RESET}"
132
+ echo ""
@@ -0,0 +1,21 @@
1
+ if (process.env["CI"] || process.env["npm_config_yes"]) process.exit(0);
2
+
3
+ console.log(`
4
+ ╔═══════════════════════════════════════════════════════╗
5
+ ║ OnboardConnect Local Agent installed ║
6
+ ╚═══════════════════════════════════════════════════════╝
7
+
8
+ To configure this agent for the first time, run:
9
+
10
+ npx oc-agent setup
11
+
12
+ You will need a one-time setup token from your Tenant Portal:
13
+ https://portal.onboardconnectapp.com/agents
14
+
15
+ Prerequisites:
16
+ • Node.js >= 18
17
+ • cloudflared (https://developers.cloudflare.com/cloudflare-one/
18
+ connections/connect-networks/downloads/)
19
+ • LDAP/AD service account credentials
20
+
21
+ `);
@@ -0,0 +1,24 @@
1
+ // Runs after `npm install` / `pnpm install` to print first-run guidance.
2
+ // Skipped automatically in CI environments.
3
+
4
+ if (process.env["CI"] || process.env["npm_config_yes"]) process.exit(0);
5
+
6
+ console.log(`
7
+ ╔═══════════════════════════════════════════════════════╗
8
+ ║ OnboardConnect Local Agent installed ║
9
+ ╚═══════════════════════════════════════════════════════╝
10
+
11
+ To configure this agent for the first time, run:
12
+
13
+ npx oc-agent setup
14
+
15
+ You will need a one-time setup token from your Tenant Portal:
16
+ https://portal.onboardconnectapp.com/agents
17
+
18
+ Prerequisites:
19
+ • Node.js >= 18
20
+ • cloudflared (https://developers.cloudflare.com/cloudflare-one/
21
+ connections/connect-networks/downloads/)
22
+ • LDAP/AD service account credentials
23
+
24
+ `);
@@ -0,0 +1,93 @@
1
+ #Requires -RunAsAdministrator
2
+ <#
3
+ .SYNOPSIS
4
+ Uninstalls the OnboardConnect Local Agent from Windows.
5
+
6
+ .DESCRIPTION
7
+ Stops and removes the Windows service, deletes the config directory
8
+ (C:\ProgramData\OnboardConnect), and optionally removes the npm package.
9
+
10
+ .PARAMETER KeepLogs
11
+ If specified, the log directory (~\.oc-agent) is NOT deleted.
12
+
13
+ .PARAMETER KeepPackage
14
+ If specified, the npm global package is NOT removed.
15
+
16
+ .EXAMPLE
17
+ .\uninstall.ps1
18
+ .\uninstall.ps1 -KeepLogs -KeepPackage
19
+ #>
20
+
21
+ param(
22
+ [switch]$KeepLogs,
23
+ [switch]$KeepPackage
24
+ )
25
+
26
+ $ErrorActionPreference = "Continue"
27
+
28
+ Write-Host ""
29
+ Write-Host " OnboardConnect Local Agent — Uninstall" -ForegroundColor Red
30
+ Write-Host ""
31
+ Write-Host " This will stop and remove the OC Agent Windows Service" -ForegroundColor Gray
32
+ Write-Host " and delete all configuration files." -ForegroundColor Gray
33
+ Write-Host ""
34
+
35
+ $answer = Read-Host " Are you sure? Type YES to continue"
36
+ if ($answer -ne "YES") {
37
+ Write-Host " Cancelled." -ForegroundColor Yellow
38
+ exit 0
39
+ }
40
+
41
+ Write-Host ""
42
+
43
+ # ── 1. Stop and remove service ─────────────────────────────────────────────────
44
+ Write-Host " Stopping OnboardConnect Agent service..." -ForegroundColor Cyan
45
+
46
+ $svc = Get-Service -Name "OnboardConnectAgent" -ErrorAction SilentlyContinue
47
+ if ($svc) {
48
+ if ($svc.Status -eq "Running") {
49
+ Stop-Service -Name "OnboardConnectAgent" -Force -ErrorAction SilentlyContinue
50
+ Write-Host " Service stopped." -ForegroundColor Green
51
+ }
52
+ sc.exe delete "OnboardConnectAgent" | Out-Null
53
+ Write-Host " Service removed." -ForegroundColor Green
54
+ } else {
55
+ Write-Host " Service not found (may not have been installed as a service)." -ForegroundColor Gray
56
+ }
57
+
58
+ # ── 2. Delete config directory ─────────────────────────────────────────────────
59
+ $configDir = "$env:PROGRAMDATA\OnboardConnect"
60
+ if (Test-Path $configDir) {
61
+ Write-Host " Deleting config directory: $configDir ..." -ForegroundColor Cyan
62
+ Remove-Item -Path $configDir -Recurse -Force -ErrorAction SilentlyContinue
63
+ Write-Host " Config directory deleted." -ForegroundColor Green
64
+ } else {
65
+ Write-Host " Config directory not found, skipping." -ForegroundColor Gray
66
+ }
67
+
68
+ # ── 3. Delete log directory (optional) ────────────────────────────────────────
69
+ if (-not $KeepLogs) {
70
+ $logDir = "$env:USERPROFILE\.oc-agent"
71
+ if (Test-Path $logDir) {
72
+ Write-Host " Deleting log directory: $logDir ..." -ForegroundColor Cyan
73
+ Remove-Item -Path $logDir -Recurse -Force -ErrorAction SilentlyContinue
74
+ Write-Host " Log directory deleted." -ForegroundColor Green
75
+ }
76
+ }
77
+
78
+ # ── 4. Remove npm package (optional) ──────────────────────────────────────────
79
+ if (-not $KeepPackage) {
80
+ Write-Host " Removing onboardconnect-agent npm package..." -ForegroundColor Cyan
81
+ try {
82
+ npm uninstall -g onboardconnect-agent 2>&1 | Out-Null
83
+ Write-Host " Package removed." -ForegroundColor Green
84
+ } catch {
85
+ Write-Host " npm uninstall skipped (package may not be installed globally)." -ForegroundColor Gray
86
+ }
87
+ }
88
+
89
+ Write-Host ""
90
+ Write-Host " Uninstall complete." -ForegroundColor Green
91
+ Write-Host ""
92
+ Write-Host " To reinstall: npm install -g onboardconnect-agent" -ForegroundColor Gray
93
+ Write-Host ""