@ebowwa/pkg-ops 0.1.16 → 0.1.17
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/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -13
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
- package/src/index.ts +51 -0
package/dist/index.d.ts
CHANGED
|
@@ -21,5 +21,8 @@
|
|
|
21
21
|
* pkg-ops list
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
|
-
export {};
|
|
24
|
+
export { loadConfig, saveConfig, parsePackageSpec, isValidPackageName, getPackageConfig, updatePackageConfig, removePackageConfig, listManagedPackages, getConfigPath, ensureConfigDir, type PackageConfig, type PkgOpsConfig, } from "./config.js";
|
|
25
|
+
export { ServiceManager, getServiceManager, type ServiceInfo, type ServiceLogsOptions, } from "./service-manager.js";
|
|
26
|
+
export { RustBridge, startBridge, stopBridge, getBridge, type InstallResult, type PackageInfo, type RollbackResult, type VerifyResult, type AuditResult, type BundleSize, type InstalledPackageInfo, } from "./bridge.js";
|
|
27
|
+
export { startHealthServer, stopHealthServer, getHealthServer, HealthServer, type HealthCheckResult, type ServiceHealth, type SystemHealth, } from "./health-server.js";
|
|
25
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA20BH,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{readFileSync as
|
|
3
|
+
import{readFileSync as o0,existsSync as c0}from"fs";import{constants as F,mkdirSync as R0,readFileSync as L0,writeFileSync as F0,existsSync as s}from"node:fs";import{dirname as x0}from"node:path";var B={packages:{},healthPort:8914,workDir:"/root",logLevel:"info"},b0="/etc/pkg-ops",y0=`${b0}/config.json`;function M(){return process.env.PKG_OPS_CONFIG??y0}function a(){let $=x0(M());if(!s($))R0($,{recursive:!0,mode:F.S_IRWXU|F.S_IRGRP|F.S_IXGRP})}function O(){let $=M();try{if(!s($))return{...B};let Y=L0($,"utf-8"),W=JSON.parse(Y);return{...B,...W}}catch(Y){return console.error(`Failed to load config from ${$}:`,Y),{...B}}}function v($){let Y=M();a();let W=JSON.stringify($,null,2);F0(Y,W,{encoding:"utf-8",mode:F.S_IRUSR|F.S_IWUSR|F.S_IRGRP})}function I($,Y){let W=O();return W.packages[$]=Y,v(W),W}function I0($){let Y=O();return delete Y.packages[$],v(Y),Y}function x($){return O().packages[$]}function u(){let $=O();return Object.entries($.packages).map(([Y,W])=>({name:Y,config:W}))}function b($){return $.startsWith("@ebowwa/")}function p($){let Y=$.lastIndexOf("@");if(Y<=0)return{name:$,version:"latest"};let W=$.slice(0,Y),X=$.slice(Y+1);if(!X)return{name:W,version:"latest"};return{name:W,version:X}}var{getPrototypeOf:E1,defineProperty:G0,getOwnPropertyNames:T1,getOwnPropertyDescriptor:U1}=Object;var M0=($,Y)=>{for(var W in Y)G0($,W,{get:Y[W],enumerable:!0,configurable:!0,set:(X)=>Y[W]=()=>X})},P0=($,Y)=>()=>($&&(Y=$($=0)),Y),e={};M0(e,{writeFile:()=>C0,sudo:()=>G,pkgInstall:()=>D0,exec:()=>$0});async function G($,Y){let W=Array.isArray($)?$:$.split(/\s+/),X=["sudo",...Y.env?Object.entries(Y.env).map(([Z,q])=>`${Z}=${d(q)}`):[],...W];return $0(X,Y)}async function D0($,Y){let W=Y.pm??"apt",X={...Y.env,...Y.nonInteractive!==!1?{DEBIAN_FRONTEND:"noninteractive"}:{}};return await G(X0[W],{...Y,env:X,quiet:!0}),G([...W0[W],...$],{...Y,env:X})}async function C0($,Y,W){let X=`tee ${W.append?"-a":""} ${d($)}`.trim(),Z=await S0(Y,["sudo",X],W);if(Z.ok&&W.mode)await G(["chmod",W.mode,$],W);if(Z.ok&&W.owner)await G(["chown",W.owner,$],W);return Z}function Y0($){let Y=["ssh","-F","/dev/null","-o","StrictHostKeyChecking=no","-o","UserKnownHostsFile=/dev/null"];if($.keyPath)Y.push("-i",$.keyPath);else if($.key)Y.push("-i",$.key);if($.port)Y.push("-p",String($.port));return Y.push(`${$.user??"root"}@${$.host}`),Y}async function $0($,Y){let W=Y.context??{type:"local"},X=W.type==="ssh"?[...Y0(W),$.map(d).join(" ")]:$,Z=Bun.spawn(X,{stdout:"pipe",stderr:"pipe",timeout:Y.timeout??30000}),q=await Z.exited,Q=Y.quiet?"":await new Response(Z.stdout).text(),H=await new Response(Z.stderr).text();return{stdout:Q,stderr:H,exitCode:q,ok:q===0}}async function S0($,Y,W){let X=W.context??{type:"local"};if(X.type==="ssh"){let J=Y0(X),h=Y.join(" "),R=[...J,h],w=Bun.spawn(R,{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",timeout:W.timeout??30000}),L=await w.exited,U=W.quiet?"":await new Response(w.stdout).text(),_=await new Response(w.stderr).text();return{stdout:U,stderr:_,exitCode:L,ok:L===0}}let Z=Bun.spawn(["sh","-c",Y.join(" ")],{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",timeout:W.timeout??30000}),q=await Z.exited,Q=W.quiet?"":await new Response(Z.stdout).text(),H=await new Response(Z.stderr).text();return{stdout:Q,stderr:H,exitCode:q,ok:q===0}}function d($){if(/^[a-zA-Z0-9._\-\/=:@]+$/.test($))return $;return`'${$.replace(/'/g,"'\\''")}'`}var W0,X0,k0=P0(()=>{W0={apt:["apt-get","install","-y"],dnf:["dnf","install","-y"],apk:["apk","add","--no-cache"]},X0={apt:["apt-get","update","-qq"],dnf:["dnf","check-update"],apk:["apk","update"]}});async function V($,Y){let{sudo:W}=await Promise.resolve().then(()=>(k0(),e));return W($,Y)}async function P($,Y){return V(["systemctl","enable",$],Y)}async function D($,Y){return V(["systemctl","disable",$],Y)}async function C($,Y){return V(["systemctl","start",$],Y)}async function S($,Y){return V(["systemctl","stop",$],Y)}async function k($,Y){return V(["systemctl","restart",$],Y)}async function N($,Y){let W=await V(["systemctl","show",$,"--property=LoadState,ActiveState,SubState,MainPID,Description"],{...Y});if(!W.ok)return{loaded:!1,active:!1,subState:"unknown",mainPid:0,description:""};let X=(Z)=>{return W.stdout.match(new RegExp(`^${Z}=(.+)$`,"m"))?.[1]?.trim()??""};return{loaded:X("LoadState")==="loaded",active:X("ActiveState")==="active",subState:X("SubState"),mainPid:parseInt(X("MainPID")||"0",10),description:X("Description")}}async function z($,Y){let W=await V(["systemctl","list-unit-files",$+".service"],Y);return W.ok&&W.stdout.includes($)}async function f($,Y={}){let W=["journalctl","-u",$,"-n",String(Y.lines??100)];if(Y.since)W.push("--since",Y.since);if(!Y.follow)W.push("-n",String(Y.lines??100));return(await V(W,Y)).stdout}class l{sudoOptions;constructor($){this.sudoOptions=$??{context:{type:"local"}}}async start($){let Y=await C($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} started`:Y.stderr||Y.stdout}}async stop($){let Y=await S($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} stopped`:Y.stderr||Y.stdout}}async restart($){let Y=await k($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} restarted`:Y.stderr||Y.stdout}}async status($){return N($,this.sudoOptions)}async enable($){let Y=await P($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} enabled`:Y.stderr||Y.stdout}}async disable($){let Y=await D($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} disabled`:Y.stderr||Y.stdout}}async exists($){return z($,this.sudoOptions)}async logs($,Y){return f($,{...this.sudoOptions,lines:Y?.lines??100,since:Y?.since})}async info($){let[Y,W]=await Promise.all([this.exists($),this.status($)]);return{name:$,exists:Y,status:W}}async isHealthy($){let Y=await this.status($);return Y.active&&Y.subState==="running"}async waitForHealthy($,Y){let W=Y?.timeout??30000,X=Y?.interval??1000,Z=Date.now();while(Date.now()-Z<W){if(await this.isHealthy($))return!0;await new Promise((Q)=>setTimeout(Q,X))}return!1}}var m=null;function K(){if(!m)m=new l;return m}import{spawn as N0}from"child_process";import{accessSync as Z0,constants as q0}from"fs";import{join as j,dirname as z0}from"path";import{fileURLToPath as f0}from"url";var h0=30000;class o{process=null;pendingRequests=new Map;requestId=0;buffer="";async start(){if(this.process)return;let $=this.getBinaryPath();try{Z0($,q0.X_OK)}catch{throw Error(`Rust binary not found at ${$}. Run 'bun run build:rust' in the pkg-ops package.`)}if(this.process=N0($,[],{stdio:["pipe","pipe","pipe"]}),!this.process.stdin||!this.process.stdout)throw Error("Failed to create stdin/stdout pipes");this.process.stdout.on("data",(Y)=>{this.buffer+=Y.toString("utf-8"),this.processBuffer()}),this.process.stderr?.on("data",(Y)=>{console.error("[rust-worker]",Y.toString("utf-8").trim())}),this.process.on("exit",(Y)=>{console.error(`Rust worker exited with code ${Y}`),this.process=null})}async stop(){if(!this.process)return;try{await this.sendRequest("shutdown",{})}catch{}if(await new Promise(($)=>setTimeout($,1000)),this.process)this.process.kill("SIGTERM"),this.process=null;for(let[$,Y]of this.pendingRequests)clearTimeout(Y.timeout),Y.reject(Error("Bridge shutdown"));this.pendingRequests.clear()}async install($,Y){return this.sendRequest("install",{packageName:$,version:Y})}async update($){return this.sendRequest("update",{packageName:$})}async updateAll(){return this.sendRequest("updateAll",{})}async list(){return this.sendRequest("list",{})}async rollback($){return this.sendRequest("rollback",{packageName:$})}async health(){return this.sendRequest("health",{})}async verify($){return this.sendRequest("verify",{packageName:$})}async audit(){return this.sendRequest("audit",{})}async getBundleSizes(){return this.sendRequest("sizes",{})}async getInstalledInfo(){return this.sendRequest("installedInfo",{})}getBinaryPath(){let $=z0(f0(import.meta.url)),Y=[j($,"..","rust","target","release","pkg-ops-core"),j($,"..","rust","pkg-ops-core"),j($,"..","rust","target","x86_64-unknown-linux-gnu","release","pkg-ops-core")];for(let W of Y)try{return Z0(W,q0.X_OK),W}catch{}throw Error(`Rust binary not found. Tried:
|
|
4
4
|
${Y.map((W)=>` - ${W}`).join(`
|
|
5
5
|
`)}
|
|
6
|
-
Run 'bun run build:rust' or 'cargo build --release' in the pkg-ops package.`)}sendRequest($,Y){return new Promise((W,X)=>{if(!this.process?.stdin){X(Error("Rust worker not started"));return}let Z=String(++this.requestId),q={jsonrpc:"2.0",id:Z,method:$,params:Y},Q=setTimeout(()=>{this.pendingRequests.delete(Z),X(Error(`Request timeout: ${$}`))},
|
|
7
|
-
`;this.process.stdin.write(
|
|
8
|
-
`);this.buffer=$.pop()??"";for(let Y of $){if(!Y.trim())continue;try{let W=JSON.parse(Y),X=this.pendingRequests.get(W.id);if(X)if(clearTimeout(X.timeout),this.pendingRequests.delete(W.id),W.error)X.reject(Error(W.error.message));else X.resolve(W.result)}catch(W){console.error("Failed to parse response:",Y,W)}}}}var
|
|
9
|
-
`);try{let W=await(await
|
|
10
|
-
Packages:`);let W=
|
|
11
|
-
Package: ${X.packageName}@${X.version}`),console.log(` Status: ${X.success?"VALID":"INVALID"}`),console.log(` Dist exists: ${X.distExists?"Yes":"No"}`),X.checksum)console.log(` Checksum: ${X.checksum}`);console.log(` Message: ${X.message}`)}catch(W){console.error("Verification failed:",W),process.exit(1)}finally{await T()}}async function
|
|
12
|
-
`),Z&&
|
|
13
|
-
`);try{let W=await(await
|
|
14
|
-
`);for(let X of W)console.log(`[${X.severity.toUpperCase()}] ${X.packageName}`),console.log(` Vulnerability: ${X.vulnerability}`),console.log(` Description: ${X.description}`),console.log("")}catch(Y){console.error("Audit failed:",Y),process.exit(1)}finally{await T()}}async function
|
|
15
|
-
`);try{let W=await(await
|
|
6
|
+
Run 'bun run build:rust' or 'cargo build --release' in the pkg-ops package.`)}sendRequest($,Y){return new Promise((W,X)=>{if(!this.process?.stdin){X(Error("Rust worker not started"));return}let Z=String(++this.requestId),q={jsonrpc:"2.0",id:Z,method:$,params:Y},Q=setTimeout(()=>{this.pendingRequests.delete(Z),X(Error(`Request timeout: ${$}`))},h0);this.pendingRequests.set(Z,{resolve:W,reject:X,timeout:Q});let H=JSON.stringify(q)+`
|
|
7
|
+
`;this.process.stdin.write(H,"utf-8",(J)=>{if(J)this.pendingRequests.delete(Z),clearTimeout(Q),X(J)})})}processBuffer(){let $=this.buffer.split(`
|
|
8
|
+
`);this.buffer=$.pop()??"";for(let Y of $){if(!Y.trim())continue;try{let W=JSON.parse(Y),X=this.pendingRequests.get(W.id);if(X)if(clearTimeout(X.timeout),this.pendingRequests.delete(W.id),W.error)X.reject(Error(W.error.message));else X.resolve(W.result)}catch(W){console.error("Failed to parse response:",Y,W)}}}}var y=null;function Q0(){if(!y)y=new o;return y}async function E(){let $=Q0();return await $.start(),$}async function T(){if(y)await y.stop(),y=null}import{createServer as m0}from"http";class H0{sudoOptions;constructor($){this.sudoOptions=$??{context:{type:"local"}}}async start($){let Y=await C($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} started`:Y.stderr||Y.stdout}}async stop($){let Y=await S($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} stopped`:Y.stderr||Y.stdout}}async restart($){let Y=await k($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} restarted`:Y.stderr||Y.stdout}}async status($){return N($,this.sudoOptions)}async enable($){let Y=await P($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} enabled`:Y.stderr||Y.stdout}}async disable($){let Y=await D($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} disabled`:Y.stderr||Y.stdout}}async exists($){return z($,this.sudoOptions)}async logs($,Y){return f($,{...this.sudoOptions,lines:Y?.lines??100,since:Y?.since})}async info($){let[Y,W]=await Promise.all([this.exists($),this.status($)]);return{name:$,exists:Y,status:W}}async isHealthy($){let Y=await this.status($);return Y.active&&Y.subState==="running"}async waitForHealthy($,Y){let W=Y?.timeout??30000,X=Y?.interval??1000,Z=Date.now();while(Date.now()-Z<W){if(await this.isHealthy($))return!0;await new Promise((Q)=>setTimeout(Q,X))}return!1}}var c=null;function i(){if(!c)c=new H0;return c}import{constants as M1,mkdirSync as P1,readFileSync as B0,writeFileSync as D1,existsSync as v0}from"node:fs";var g={packages:{},healthPort:8914,workDir:"/root",logLevel:"info"},u0="/etc/pkg-ops",p0=`${u0}/config.json`;function d0(){return process.env.PKG_OPS_CONFIG??p0}function t(){let $=d0();try{if(!v0($))return{...g};let Y=B0($,"utf-8"),W=JSON.parse(Y);return{...g,...W}}catch(Y){return console.error(`Failed to load config from ${$}:`,Y),{...g}}}class n{server=null;checks=new Map;startTime=Date.now();port;constructor($=8914){this.port=$}async start(){if(this.server)return;return new Promise(($,Y)=>{this.server=m0((W,X)=>this.handleRequest(W,X)),this.server.on("error",Y),this.server.listen(this.port,()=>{console.log(`Health server listening on port ${this.port}`),this.server?.off("error",Y),$()})})}async stop(){if(!this.server)return;return new Promise(($)=>{this.server?.close(()=>{this.server=null,$()})})}addCheck($,Y){this.checks.set($,Y)}removeCheck($){this.checks.delete($)}async checkHealth($){if($)return this.getServiceHealth($);return this.getSystemHealth()}async handleRequest($,Y){let W=$.url??"/",X=$.method??"GET";try{if(X==="GET"&&W==="/health"){let Z=await this.getSystemHealth();this.sendJson(Y,200,Z)}else if(X==="GET"&&W.startsWith("/health/")){let Z=W.slice(8).replace(".service",""),q=await this.getServiceHealth(Z);this.sendJson(Y,q?200:404,q??{error:"Service not found"})}else if(X==="GET"&&W==="/ready"){let Z=await this.getSystemHealth();this.sendJson(Y,Z.healthy?200:503,{ready:Z.healthy})}else if(X==="GET"&&W==="/live")this.sendJson(Y,200,{alive:!0});else this.sendJson(Y,404,{error:"Not found"})}catch(Z){console.error("Health check error:",Z),this.sendJson(Y,500,{error:"Internal server error"})}}async getSystemHealth(){let $=t(),Y=i(),W=[];for(let[q,Q]of Object.entries($.packages)){if(!Q.service)continue;let H=await Y.status(Q.service),J=H.active&&H.subState==="running";W.push({name:Q.service,healthy:J,status:H,checkedAt:new Date().toISOString()})}let X={};for(let[q,Q]of this.checks)try{X[q]=await Q()}catch(H){X[q]={healthy:!1,message:H instanceof Error?H.message:"Unknown error"}}return{healthy:W.every((q)=>q.healthy)&&Object.values(X).every((q)=>q.healthy),services:W,uptime:Math.floor((Date.now()-this.startTime)/1000),timestamp:new Date().toISOString()}}async getServiceHealth($){let Y=i();if(!await Y.exists($))return null;let X=await Y.status($),Z=X.active&&X.subState==="running";return{name:$,healthy:Z,status:X,checkedAt:new Date().toISOString()}}sendJson($,Y,W){$.statusCode=Y,$.setHeader("Content-Type","application/json"),$.end(JSON.stringify(W,null,2))}}var A=null;async function l0($){let Y=t(),W=$??Y.healthPort??8914;if(!A)A=new n(W);return await A.start(),A}async function j0(){if(A)await A.stop(),A=null}function r(){return A}async function i0($){if($.length===0)console.error("Usage: pkg-ops install <package>[@version]"),process.exit(1);let Y=$[0],{name:W,version:X}=p(Y);if(!b(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Installing ${W}@${X}...`);try{let q=await(await E()).install(W,X);if(q.success){if(console.log(`Successfully installed ${W}@${q.version}`),q.previousVersion)console.log(` Previous version: ${q.previousVersion}`);I(W,{version:q.version,service:W.replace("@ebowwa/","")});let Q=x(W);if(Q?.service&&Q.autoStart!==!1){let J=await K().start(Q.service);if(J.success)console.log(` Service ${Q.service} started`);else console.warn(` Failed to start service: ${J.message}`)}}else console.error(`Failed to install ${W}: ${q.message}`),process.exit(1)}catch(Z){console.error("Install failed:",Z),process.exit(1)}finally{await T()}}async function g0($){if($.length===0)console.error("Usage: pkg-ops update <package>"),process.exit(1);let Y=$[0];if(!b(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Updating ${Y}...`);try{let X=await(await E()).update(Y);if(X.success){if(console.log(`Successfully updated ${Y} to ${X.version}`),X.previousVersion)console.log(` Previous version: ${X.previousVersion}`);I(Y,{version:X.version,service:Y.replace("@ebowwa/","")});let Z=K(),q=x(Y);if(q?.service){if((await Z.status(q.service)).active)await Z.restart(q.service),console.log(` Service ${q.service} restarted`)}}else console.error(`Failed to update ${Y}: ${X.message}`),process.exit(1)}catch(W){console.error("Update failed:",W),process.exit(1)}finally{await T()}}async function t0($){console.log("Updating all managed packages...");try{let W=await(await E()).updateAll();for(let X of W)if(X.success)console.log(`Updated ${X.version}`);else console.error(`Failed to update: ${X.message}`)}catch(Y){console.error("Update all failed:",Y),process.exit(1)}finally{await T()}}async function n0($){console.log(`Installed packages:
|
|
9
|
+
`);try{let W=await(await E()).list();if(W.length===0){console.log(" No packages installed");return}for(let X of W){let Z=X.installed?"installed":"not installed",q=X.service?` (service: ${X.service})`:"";console.log(` ${X.name}@${X.version} [${Z}]${q}`)}}catch(Y){console.error("Failed to list packages:",Y),process.exit(1)}finally{await T()}}async function r0($){if($.length===0)console.error("Usage: pkg-ops rollback <package>"),process.exit(1);let Y=$[0];console.log(`Rolling back ${Y}...`);try{let X=await(await E()).rollback(Y);if(X.success){console.log(`Rolled back ${Y} from ${X.currentVersion} to ${X.previousVersion}`);let Z=K(),q=x(Y);if(q?.service){if((await Z.status(q.service)).active)await Z.restart(q.service),console.log(` Service ${q.service} restarted`)}}else console.error(`Rollback failed: ${X.message}`),process.exit(1)}catch(W){console.error("Rollback failed:",W),process.exit(1)}finally{await T()}}async function w0($){if($.length===0)console.error("Usage: pkg-ops service start <name>"),process.exit(1);let Y=$[0],W=K();console.log(`Starting ${Y}...`);let X=await W.start(Y);if(X.success)console.log(`Service ${Y} started`);else console.error(`Failed to start ${Y}: ${X.message}`),process.exit(1)}async function J0($){if($.length===0)console.error("Usage: pkg-ops service stop <name>"),process.exit(1);let Y=$[0],W=K();console.log(`Stopping ${Y}...`);let X=await W.stop(Y);if(X.success)console.log(`Service ${Y} stopped`);else console.error(`Failed to stop ${Y}: ${X.message}`),process.exit(1)}async function K0($){if($.length===0)console.error("Usage: pkg-ops service restart <name>"),process.exit(1);let Y=$[0],W=K();console.log(`Restarting ${Y}...`);let X=await W.restart(Y);if(X.success)console.log(`Service ${Y} restarted`);else console.error(`Failed to restart ${Y}: ${X.message}`),process.exit(1)}async function E0($){if($.length===0)console.error("Usage: pkg-ops service status <name>"),process.exit(1);let Y=$[0],X=await K().info(Y);if(!X.exists){console.log(`Service ${Y} not found`);return}console.log(`Service: ${Y}`),console.log(` Loaded: ${X.status.loaded}`),console.log(` Active: ${X.status.active}`),console.log(` State: ${X.status.subState}`),console.log(` PID: ${X.status.mainPid||"N/A"}`),console.log(` Description: ${X.status.description||"N/A"}`)}async function T0($){if($.length===0)console.error("Usage: pkg-ops service logs <name> [--lines N]"),process.exit(1);let Y=$[0],W=$.indexOf("--lines"),X=W>=0&&$[W+1]?parseInt($[W+1],10):100,q=await K().logs(Y,{lines:X});console.log(q)}async function U0($){if($.length===0)console.error("Usage: pkg-ops service enable <name>"),process.exit(1);let Y=$[0],W=K();console.log(`Enabling ${Y}...`);let X=await W.enable(Y);if(X.success)console.log(`Service ${Y} enabled on boot`);else console.error(`Failed to enable ${Y}: ${X.message}`),process.exit(1)}async function _0($){if($.length===0)console.error("Usage: pkg-ops service disable <name>"),process.exit(1);let Y=$[0],W=K();console.log(`Disabling ${Y}...`);let X=await W.disable(Y);if(X.success)console.log(`Service ${Y} disabled from boot`);else console.error(`Failed to disable ${Y}: ${X.message}`),process.exit(1)}async function s0($){let Y=$[0],W=r();if(!W)console.error("Health server not initialized"),process.exit(1);let X=await W.checkHealth(Y);if(!X){console.log("Service not found");return}if("services"in X){if(X.healthy)console.log("All services healthy");else console.log("Some services unhealthy");for(let Z of X.services){let q=Z.healthy?"OK":"FAIL";console.log(` [${q}] ${Z.name}: ${Z.status.subState}`)}}else{let Z=X.healthy?"OK":"FAIL";console.log(`[${Z}] ${X.name}: ${X.status.subState}`)}}async function O0($){let Y=O();console.log("PkgOps Configuration"),console.log("Config path: /etc/pkg-ops/config.json"),console.log(`Health port: ${Y.healthPort}`),console.log(`Work dir: ${Y.workDir}`),console.log(`Log level: ${Y.logLevel}`),console.log(`
|
|
10
|
+
Packages:`);let W=u();if(W.length===0){console.log(" No packages configured");return}for(let{name:X,config:Z}of W){if(console.log(` ${X}:`),console.log(` Version: ${Z.version}`),Z.service)console.log(` Service: ${Z.service}`);if(Z.autoStart!==void 0)console.log(` Auto-start: ${Z.autoStart}`)}}async function V0($){if($.length<3)console.error("Usage: pkg-ops config set <package> <key> <value>"),process.exit(1);let Y=$[0],W=$[1],X=$[2];if(!b(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);let Z=x(Y)??{version:"latest"};switch(W){case"version":Z.version=X;break;case"service":Z.service=X;break;case"autoStart":Z.autoStart=X==="true";break;default:console.error(`Unknown config key: ${W}`),console.error("Valid keys: version, service, autoStart"),process.exit(1)}I(Y,Z),console.log(`Updated ${Y}.${W} = ${X}`)}async function a0($){if($.length===0)console.error("Usage: pkg-ops verify <package>"),process.exit(1);let Y=$[0];if(!b(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Verifying ${Y}...`);try{let X=await(await E()).verify(Y);if(console.log(`
|
|
11
|
+
Package: ${X.packageName}@${X.version}`),console.log(` Status: ${X.success?"VALID":"INVALID"}`),console.log(` Dist exists: ${X.distExists?"Yes":"No"}`),X.checksum)console.log(` Checksum: ${X.checksum}`);console.log(` Message: ${X.message}`)}catch(W){console.error("Verification failed:",W),process.exit(1)}finally{await T()}}async function e0($){let Y=$.indexOf("--local"),W=$.indexOf("--local-path"),X="./package.json";if(W>=0&&$[W+1])X=$[W+1];let Z=Y>=0||W>=0;try{let Q=await(await E()).getInstalledInfo();if(console.log(`Sync Status: Local vs VPS
|
|
12
|
+
`),Z&&c0(X)){let H=o0(X,"utf-8"),J=JSON.parse(H),h={...J.dependencies,...J.devDependencies},R=new Map;for(let w of Q)R.set(w.packageName,w.version);for(let[w,L]of Object.entries(h)){if(!w.startsWith("@ebowwa/"))continue;let U=R.get(w),_=L.replace(/^[\^~]/,"");if(U){if(_===U)console.log(` ${w}: local=${_}, vps=${U} (in sync)`);else if(_>U)console.log(` ${w}: local=${_}, vps=${U} (VPS behind)`);else console.log(` ${w}: local=${_}, vps=${U} (local behind)`);R.delete(w)}else console.log(` ${w}: local=${_}, vps=not installed`)}for(let[w,L]of R)console.log(` ${w}: local=not in package.json, vps=${L}`)}else if(Q.length===0)console.log(" No packages installed on VPS");else for(let H of Q){let J=H.distSizeBytes?` (${(H.distSizeBytes/1024).toFixed(1)} KB)`:"";console.log(` ${H.packageName}@${H.version}${J}`)}}catch(q){console.error("Failed to get sync status:",q),process.exit(1)}finally{await T()}}async function A0($){console.log(`Running vulnerability scan...
|
|
13
|
+
`);try{let W=await(await E()).audit();if(W.length===0){console.log("No vulnerabilities found.");return}console.log(`Found ${W.length} vulnerability(es):
|
|
14
|
+
`);for(let X of W)console.log(`[${X.severity.toUpperCase()}] ${X.packageName}`),console.log(` Vulnerability: ${X.vulnerability}`),console.log(` Description: ${X.description}`),console.log("")}catch(Y){console.error("Audit failed:",Y),process.exit(1)}finally{await T()}}async function Y1($){await A0($)}async function $1($){console.log(`Bundle sizes:
|
|
15
|
+
`);try{let W=await(await E()).getBundleSizes();if(W.length===0){console.log(" No packages installed");return}console.log(" Package | Version | Dist Size"),console.log(" --------------------------------|----------|-----------");for(let X of W){let Z=X.packageName.padEnd(32),q=X.version.padEnd(9),Q=(X.distSizeBytes/1024).toFixed(1)+" KB",H=X.fileCount?` (${X.fileCount} files)`:"";console.log(` ${Z} | ${q} | ${Q}${H}`)}}catch(Y){console.error("Failed to get bundle sizes:",Y),process.exit(1)}finally{await T()}}var W1=[{name:"install",description:"Install an @ebowwa/* package",usage:"pkg-ops install <package>[@version]",handler:i0},{name:"update",description:"Update a package to latest version",usage:"pkg-ops update <package>",handler:g0},{name:"update-all",description:"Update all managed packages",usage:"pkg-ops update-all",handler:t0},{name:"list",description:"List installed packages",usage:"pkg-ops list",handler:n0},{name:"rollback",description:"Rollback a package to previous version",usage:"pkg-ops rollback <package>",handler:r0},{name:"start",description:"Start a systemd service",usage:"pkg-ops service start <name>",handler:w0},{name:"stop",description:"Stop a systemd service",usage:"pkg-ops service stop <name>",handler:J0},{name:"restart",description:"Restart a systemd service",usage:"pkg-ops service restart <name>",handler:K0},{name:"status",description:"Get service status",usage:"pkg-ops service status <name>",handler:E0},{name:"logs",description:"View service logs",usage:"pkg-ops service logs <name> [--lines N]",handler:T0},{name:"enable",description:"Enable service on boot",usage:"pkg-ops service enable <name>",handler:U0},{name:"disable",description:"Disable service from boot",usage:"pkg-ops service disable <name>",handler:_0},{name:"health",description:"Check health of all services",usage:"pkg-ops health [service]",handler:s0},{name:"config",description:"Show configuration",usage:"pkg-ops config show",handler:O0},{name:"set-config",description:"Set a config value",usage:"pkg-ops config set <package> <key> <value>",handler:V0},{name:"verify",description:"Verify package integrity",usage:"pkg-ops verify <package>",handler:a0},{name:"sync-status",description:"Show local vs VPS version sync",usage:"pkg-ops sync-status [--local-path path]",handler:e0},{name:"audit",description:"Check for vulnerabilities",usage:"pkg-ops audit",handler:A0},{name:"scan",description:"Alias for audit",usage:"pkg-ops scan",handler:Y1},{name:"sizes",description:"Show bundle sizes",usage:"pkg-ops sizes",handler:$1}],X1=[{name:"start",description:"Start a systemd service",usage:"pkg-ops service start <name>",handler:w0},{name:"stop",description:"Stop a systemd service",usage:"pkg-ops service stop <name>",handler:J0},{name:"restart",description:"Restart a systemd service",usage:"pkg-ops service restart <name>",handler:K0},{name:"status",description:"Get service status",usage:"pkg-ops service status <name>",handler:E0},{name:"logs",description:"View service logs",usage:"pkg-ops service logs <name> [--lines N]",handler:T0},{name:"enable",description:"Enable service on boot",usage:"pkg-ops service enable <name>",handler:U0},{name:"disable",description:"Disable service from boot",usage:"pkg-ops service disable <name>",handler:_0}],Z1=[{name:"show",description:"Show configuration",usage:"pkg-ops config show",handler:O0},{name:"set",description:"Set a config value",usage:"pkg-ops config set <package> <key> <value>",handler:V0}];function q1(){console.log(`
|
|
16
16
|
PkgOps - Package operations CLI for VPS
|
|
17
17
|
|
|
18
18
|
Usage:
|
|
@@ -59,7 +59,7 @@ Examples:
|
|
|
59
59
|
pkg-ops sync-status --local-path ./package.json
|
|
60
60
|
pkg-ops verify @ebowwa/stack
|
|
61
61
|
pkg-ops audit
|
|
62
|
-
`)}async function
|
|
62
|
+
`)}async function Q1(){let $=process.argv.slice(2);if($.length===0||$[0]==="--help"||$[0]==="-h")q1(),process.exit(0);if($[0]==="--version"||$[0]==="-v"){let Z=O();console.log(`pkg-ops ${Z.packages?.["@ebowwa/pkg-ops"]?.version??"0.1.0"}`),process.exit(0)}let Y=$[0],W=$.slice(1);if(Y==="service"){if(W.length===0)console.error("Missing service subcommand"),console.error("Usage: pkg-ops service <start|stop|restart|status|logs|enable|disable> <name>"),process.exit(1);let Z=W[0],q=X1.find((Q)=>Q.name===Z);if(!q)console.error(`Unknown service subcommand: ${Z}`),process.exit(1);await q.handler(W.slice(1));return}if(Y==="config"){if(W.length===0)console.error("Missing config subcommand"),console.error("Usage: pkg-ops config <show|set> [args...]"),process.exit(1);let Z=W[0],q=Z1.find((Q)=>Q.name===Z);if(!q)console.error(`Unknown config subcommand: ${Z}`),process.exit(1);await q.handler(W.slice(1));return}let X=W1.find((Z)=>Z.name===Y);if(!X)console.error(`Unknown command: ${Y}`),console.error("Run 'pkg-ops --help' for usage"),process.exit(1);await X.handler(W)}Q1().catch(($)=>{console.error("Fatal error:",$),process.exit(1)});export{I as updatePackageConfig,j0 as stopHealthServer,T as stopBridge,l0 as startHealthServer,E as startBridge,v as saveConfig,I0 as removePackageConfig,p as parsePackageSpec,O as loadConfig,u as listManagedPackages,b as isValidPackageName,K as getServiceManager,x as getPackageConfig,r as getHealthServer,M as getConfigPath,Q0 as getBridge,a as ensureConfigDir,l as ServiceManager,o as RustBridge,n as HealthServer};
|
|
63
63
|
|
|
64
|
-
//# debugId=
|
|
64
|
+
//# debugId=95DFB12A97BB4D2664756E2164756E21
|
|
65
65
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/config.ts", "../../../node_modules/.bun/@ebowwa+installations@0.4.6/node_modules/@ebowwa/installations/dist/systemd.js", "../src/service-manager.ts", "../src/bridge.ts", "../src/health-server.ts", "../src/service-manager.ts", "../src/config.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"#!/usr/bin/env bun\n/**\n * PkgOps CLI\n *\n * Package operations CLI that installs @ebowwa/* npm packages\n * and manages systemd services.\n *\n * @example\n * ```bash\n * # Install a package\n * pkg-ops install @ebowwa/stack@0.7.12\n *\n * # Service management\n * pkg-ops service start stack\n * pkg-ops service status stack\n *\n * # Health check\n * pkg-ops health\n *\n * # List packages\n * pkg-ops list\n * ```\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport {\n loadConfig,\n parsePackageSpec,\n isValidPackageName,\n getPackageConfig,\n updatePackageConfig,\n removePackageConfig,\n listManagedPackages,\n} from \"./config.js\";\nimport { ServiceManager, getServiceManager } from \"./service-manager.js\";\nimport { RustBridge, startBridge, stopBridge } from \"./bridge.js\";\nimport { startHealthServer, stopHealthServer, getHealthServer } from \"./health-server.js\";\nimport type { VerifyResult, AuditResult, BundleSize, InstalledPackageInfo } from \"./bridge.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface Command {\n name: string;\n description: string;\n usage: string;\n handler: (args: string[]) => Promise<void> | void;\n}\n\ninterface Subcommand {\n name: string;\n description: string;\n usage: string;\n handler: (args: string[]) => Promise<void> | void;\n}\n\n// ---------------------------------------------------------------------------\n// Package Management Commands\n// ---------------------------------------------------------------------------\n\nasync function handleInstall(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops install <package>[@version]\");\n process.exit(1);\n }\n\n const spec = args[0];\n const { name, version } = parsePackageSpec(spec);\n\n if (!isValidPackageName(name)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n console.log(`Installing ${name}@${version}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.install(name, version);\n\n if (result.success) {\n console.log(`Successfully installed ${name}@${result.version}`);\n if (result.previousVersion) {\n console.log(` Previous version: ${result.previousVersion}`);\n }\n\n // Update config\n updatePackageConfig(name, {\n version: result.version,\n service: name.replace(\"@ebowwa/\", \"\"),\n });\n\n // Start service if configured\n const config = getPackageConfig(name);\n if (config?.service && config.autoStart !== false) {\n const sm = getServiceManager();\n const startResult = await sm.start(config.service);\n if (startResult.success) {\n console.log(` Service ${config.service} started`);\n } else {\n console.warn(` Failed to start service: ${startResult.message}`);\n }\n }\n } else {\n console.error(`Failed to install ${name}: ${result.message}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(`Install failed:`, error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleUpdate(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops update <package>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n\n if (!isValidPackageName(packageName)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n console.log(`Updating ${packageName}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.update(packageName);\n\n if (result.success) {\n console.log(`Successfully updated ${packageName} to ${result.version}`);\n if (result.previousVersion) {\n console.log(` Previous version: ${result.previousVersion}`);\n }\n\n // Update config\n updatePackageConfig(packageName, {\n version: result.version,\n service: packageName.replace(\"@ebowwa/\", \"\"),\n });\n\n // Restart service if running\n const sm = getServiceManager();\n const config = getPackageConfig(packageName);\n if (config?.service) {\n const status = await sm.status(config.service);\n if (status.active) {\n await sm.restart(config.service);\n console.log(` Service ${config.service} restarted`);\n }\n }\n } else {\n console.error(`Failed to update ${packageName}: ${result.message}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(`Update failed:`, error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleUpdateAll(_args: string[]): Promise<void> {\n console.log(\"Updating all managed packages...\");\n\n try {\n const bridge = await startBridge();\n const results = await bridge.updateAll();\n\n for (const result of results) {\n if (result.success) {\n console.log(`Updated ${result.version}`);\n } else {\n console.error(`Failed to update: ${result.message}`);\n }\n }\n } catch (error) {\n console.error(\"Update all failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleList(_args: string[]): Promise<void> {\n console.log(\"Installed packages:\\n\");\n\n try {\n const bridge = await startBridge();\n const packages = await bridge.list();\n\n if (packages.length === 0) {\n console.log(\" No packages installed\");\n return;\n }\n\n for (const pkg of packages) {\n const status = pkg.installed ? \"installed\" : \"not installed\";\n const service = pkg.service ? ` (service: ${pkg.service})` : \"\";\n console.log(` ${pkg.name}@${pkg.version} [${status}]${service}`);\n }\n } catch (error) {\n console.error(\"Failed to list packages:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleRollback(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops rollback <package>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n\n console.log(`Rolling back ${packageName}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.rollback(packageName);\n\n if (result.success) {\n console.log(`Rolled back ${packageName} from ${result.currentVersion} to ${result.previousVersion}`);\n\n // Restart service if running\n const sm = getServiceManager();\n const config = getPackageConfig(packageName);\n if (config?.service) {\n const status = await sm.status(config.service);\n if (status.active) {\n await sm.restart(config.service);\n console.log(` Service ${config.service} restarted`);\n }\n }\n } else {\n console.error(`Rollback failed: ${result.message}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"Rollback failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Service Management Commands\n// ---------------------------------------------------------------------------\n\nasync function handleServiceStart(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service start <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Starting ${serviceName}...`);\n const result = await sm.start(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} started`);\n } else {\n console.error(`Failed to start ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceStop(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service stop <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Stopping ${serviceName}...`);\n const result = await sm.stop(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} stopped`);\n } else {\n console.error(`Failed to stop ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceRestart(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service restart <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Restarting ${serviceName}...`);\n const result = await sm.restart(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} restarted`);\n } else {\n console.error(`Failed to restart ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceStatus(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service status <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n const info = await sm.info(serviceName);\n\n if (!info.exists) {\n console.log(`Service ${serviceName} not found`);\n return;\n }\n\n console.log(`Service: ${serviceName}`);\n console.log(` Loaded: ${info.status.loaded}`);\n console.log(` Active: ${info.status.active}`);\n console.log(` State: ${info.status.subState}`);\n console.log(` PID: ${info.status.mainPid || \"N/A\"}`);\n console.log(` Description: ${info.status.description || \"N/A\"}`);\n}\n\nasync function handleServiceLogs(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service logs <name> [--lines N]\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const linesIndex = args.indexOf(\"--lines\");\n const lines = linesIndex >= 0 && args[linesIndex + 1]\n ? parseInt(args[linesIndex + 1], 10)\n : 100;\n\n const sm = getServiceManager();\n const logs = await sm.logs(serviceName, { lines });\n\n console.log(logs);\n}\n\nasync function handleServiceEnable(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service enable <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Enabling ${serviceName}...`);\n const result = await sm.enable(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} enabled on boot`);\n } else {\n console.error(`Failed to enable ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceDisable(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service disable <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Disabling ${serviceName}...`);\n const result = await sm.disable(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} disabled from boot`);\n } else {\n console.error(`Failed to disable ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Health Commands\n// ---------------------------------------------------------------------------\n\nasync function handleHealth(args: string[]): Promise<void> {\n const serviceName = args[0];\n\n const healthServer = getHealthServer();\n if (!healthServer) {\n console.error(\"Health server not initialized\");\n process.exit(1);\n }\n\n const health = await healthServer.checkHealth(serviceName);\n\n if (!health) {\n console.log(\"Service not found\");\n return;\n }\n\n if (\"services\" in health) {\n // SystemHealth\n if (health.healthy) {\n console.log(\"All services healthy\");\n } else {\n console.log(\"Some services unhealthy\");\n }\n\n for (const service of health.services) {\n const icon = service.healthy ? \"OK\" : \"FAIL\";\n console.log(` [${icon}] ${service.name}: ${service.status.subState}`);\n }\n } else {\n // ServiceHealth\n const icon = health.healthy ? \"OK\" : \"FAIL\";\n console.log(`[${icon}] ${health.name}: ${health.status.subState}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Config Commands\n// ---------------------------------------------------------------------------\n\nasync function handleConfigShow(_args: string[]): Promise<void> {\n const config = loadConfig();\n\n console.log(\"PkgOps Configuration\");\n console.log(`Config path: /etc/pkg-ops/config.json`);\n console.log(`Health port: ${config.healthPort}`);\n console.log(`Work dir: ${config.workDir}`);\n console.log(`Log level: ${config.logLevel}`);\n console.log(\"\\nPackages:\");\n\n const packages = listManagedPackages();\n if (packages.length === 0) {\n console.log(\" No packages configured\");\n return;\n }\n\n for (const { name, config: pkgConfig } of packages) {\n console.log(` ${name}:`);\n console.log(` Version: ${pkgConfig.version}`);\n if (pkgConfig.service) {\n console.log(` Service: ${pkgConfig.service}`);\n }\n if (pkgConfig.autoStart !== undefined) {\n console.log(` Auto-start: ${pkgConfig.autoStart}`);\n }\n }\n}\n\nasync function handleConfigSet(args: string[]): Promise<void> {\n if (args.length < 3) {\n console.error(\"Usage: pkg-ops config set <package> <key> <value>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n const key = args[1];\n const value = args[2];\n\n if (!isValidPackageName(packageName)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n const config = getPackageConfig(packageName) ?? {\n version: \"latest\",\n };\n\n // Handle different value types\n switch (key) {\n case \"version\":\n config.version = value;\n break;\n case \"service\":\n config.service = value;\n break;\n case \"autoStart\":\n config.autoStart = value === \"true\";\n break;\n default:\n console.error(`Unknown config key: ${key}`);\n console.error(\"Valid keys: version, service, autoStart\");\n process.exit(1);\n }\n\n updatePackageConfig(packageName, config);\n console.log(`Updated ${packageName}.${key} = ${value}`);\n}\n\n// ---------------------------------------------------------------------------\n// Verification & Audit Commands\n// ---------------------------------------------------------------------------\n\nasync function handleVerify(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops verify <package>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n\n if (!isValidPackageName(packageName)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n console.log(`Verifying ${packageName}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.verify(packageName);\n\n console.log(`\\nPackage: ${result.packageName}@${result.version}`);\n console.log(` Status: ${result.success ? \"VALID\" : \"INVALID\"}`);\n console.log(` Dist exists: ${result.distExists ? \"Yes\" : \"No\"}`);\n if (result.checksum) {\n console.log(` Checksum: ${result.checksum}`);\n }\n console.log(` Message: ${result.message}`);\n } catch (error) {\n console.error(\"Verification failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleSyncStatus(args: string[]): Promise<void> {\n const localIndex = args.indexOf(\"--local\");\n const localPathIndex = args.indexOf(\"--local-path\");\n\n let localPath = \"./package.json\";\n if (localPathIndex >= 0 && args[localPathIndex + 1]) {\n localPath = args[localPathIndex + 1];\n }\n\n const showLocal = localIndex >= 0 || localPathIndex >= 0;\n\n try {\n const bridge = await startBridge();\n const vpsPackages = await bridge.getInstalledInfo();\n\n console.log(\"Sync Status: Local vs VPS\\n\");\n\n if (showLocal && existsSync(localPath)) {\n const localContent = readFileSync(localPath, \"utf-8\");\n const localPkg = JSON.parse(localContent);\n const deps = { ...localPkg.dependencies, ...localPkg.devDependencies };\n\n // Build a map of VPS packages\n const vpsMap = new Map<string, string>();\n for (const pkg of vpsPackages) {\n vpsMap.set(pkg.packageName, pkg.version);\n }\n\n // Compare local vs VPS\n for (const [name, localVersion] of Object.entries(deps)) {\n if (!name.startsWith(\"@ebowwa/\")) continue;\n\n const vpsVersion = vpsMap.get(name);\n const cleanLocal = (localVersion as string).replace(/^[\\^~]/, \"\");\n\n if (vpsVersion) {\n if (cleanLocal === vpsVersion) {\n console.log(` ${name}: local=${cleanLocal}, vps=${vpsVersion} (in sync)`);\n } else if (cleanLocal > vpsVersion) {\n console.log(` ${name}: local=${cleanLocal}, vps=${vpsVersion} (VPS behind)`);\n } else {\n console.log(` ${name}: local=${cleanLocal}, vps=${vpsVersion} (local behind)`);\n }\n vpsMap.delete(name);\n } else {\n console.log(` ${name}: local=${cleanLocal}, vps=not installed`);\n }\n }\n\n // Show VPS-only packages\n for (const [name, version] of vpsMap) {\n console.log(` ${name}: local=not in package.json, vps=${version}`);\n }\n } else {\n // Just show VPS installed versions\n if (vpsPackages.length === 0) {\n console.log(\" No packages installed on VPS\");\n } else {\n for (const pkg of vpsPackages) {\n const sizeInfo = pkg.distSizeBytes\n ? ` (${(pkg.distSizeBytes / 1024).toFixed(1)} KB)`\n : \"\";\n console.log(` ${pkg.packageName}@${pkg.version}${sizeInfo}`);\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to get sync status:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleAudit(_args: string[]): Promise<void> {\n console.log(\"Running vulnerability scan...\\n\");\n\n try {\n const bridge = await startBridge();\n const results = await bridge.audit();\n\n if (results.length === 0) {\n console.log(\"No vulnerabilities found.\");\n return;\n }\n\n console.log(`Found ${results.length} vulnerability(es):\\n`);\n\n for (const vuln of results) {\n console.log(`[${vuln.severity.toUpperCase()}] ${vuln.packageName}`);\n console.log(` Vulnerability: ${vuln.vulnerability}`);\n console.log(` Description: ${vuln.description}`);\n console.log(\"\");\n }\n } catch (error) {\n console.error(\"Audit failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleScan(args: string[]): Promise<void> {\n // Alias for audit\n await handleAudit(args);\n}\n\nasync function handleSizes(_args: string[]): Promise<void> {\n console.log(\"Bundle sizes:\\n\");\n\n try {\n const bridge = await startBridge();\n const sizes = await bridge.getBundleSizes();\n\n if (sizes.length === 0) {\n console.log(\" No packages installed\");\n return;\n }\n\n // Print table header\n console.log(\" Package | Version | Dist Size\");\n console.log(\" --------------------------------|----------|-----------\");\n\n for (const pkg of sizes) {\n const name = pkg.packageName.padEnd(32);\n const version = pkg.version.padEnd(9);\n const sizeKB = (pkg.distSizeBytes / 1024).toFixed(1) + \" KB\";\n const files = pkg.fileCount ? ` (${pkg.fileCount} files)` : \"\";\n console.log(` ${name} | ${version} | ${sizeKB}${files}`);\n }\n } catch (error) {\n console.error(\"Failed to get bundle sizes:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI Entry Point\n// ---------------------------------------------------------------------------\n\nconst commands: Command[] = [\n // Package management\n { name: \"install\", description: \"Install an @ebowwa/* package\", usage: \"pkg-ops install <package>[@version]\", handler: handleInstall },\n { name: \"update\", description: \"Update a package to latest version\", usage: \"pkg-ops update <package>\", handler: handleUpdate },\n { name: \"update-all\", description: \"Update all managed packages\", usage: \"pkg-ops update-all\", handler: handleUpdateAll },\n { name: \"list\", description: \"List installed packages\", usage: \"pkg-ops list\", handler: handleList },\n { name: \"rollback\", description: \"Rollback a package to previous version\", usage: \"pkg-ops rollback <package>\", handler: handleRollback },\n // Service management\n { name: \"start\", description: \"Start a systemd service\", usage: \"pkg-ops service start <name>\", handler: handleServiceStart },\n { name: \"stop\", description: \"Stop a systemd service\", usage: \"pkg-ops service stop <name>\", handler: handleServiceStop },\n { name: \"restart\", description: \"Restart a systemd service\", usage: \"pkg-ops service restart <name>\", handler: handleServiceRestart },\n { name: \"status\", description: \"Get service status\", usage: \"pkg-ops service status <name>\", handler: handleServiceStatus },\n { name: \"logs\", description: \"View service logs\", usage: \"pkg-ops service logs <name> [--lines N]\", handler: handleServiceLogs },\n { name: \"enable\", description: \"Enable service on boot\", usage: \"pkg-ops service enable <name>\", handler: handleServiceEnable },\n { name: \"disable\", description: \"Disable service from boot\", usage: \"pkg-ops service disable <name>\", handler: handleServiceDisable },\n // Health\n { name: \"health\", description: \"Check health of all services\", usage: \"pkg-ops health [service]\", handler: handleHealth },\n // Config\n { name: \"config\", description: \"Show configuration\", usage: \"pkg-ops config show\", handler: handleConfigShow },\n { name: \"set-config\", description: \"Set a config value\", usage: \"pkg-ops config set <package> <key> <value>\", handler: handleConfigSet },\n // Verification & Audit\n { name: \"verify\", description: \"Verify package integrity\", usage: \"pkg-ops verify <package>\", handler: handleVerify },\n { name: \"sync-status\", description: \"Show local vs VPS version sync\", usage: \"pkg-ops sync-status [--local-path path]\", handler: handleSyncStatus },\n { name: \"audit\", description: \"Check for vulnerabilities\", usage: \"pkg-ops audit\", handler: handleAudit },\n { name: \"scan\", description: \"Alias for audit\", usage: \"pkg-ops scan\", handler: handleScan },\n { name: \"sizes\", description: \"Show bundle sizes\", usage: \"pkg-ops sizes\", handler: handleSizes },\n];\n\nconst serviceCommands: Subcommand[] = [\n { name: \"start\", description: \"Start a systemd service\", usage: \"pkg-ops service start <name>\", handler: handleServiceStart },\n { name: \"stop\", description: \"Stop a systemd service\", usage: \"pkg-ops service stop <name>\", handler: handleServiceStop },\n { name: \"restart\", description: \"Restart a systemd service\", usage: \"pkg-ops service restart <name>\", handler: handleServiceRestart },\n { name: \"status\", description: \"Get service status\", usage: \"pkg-ops service status <name>\", handler: handleServiceStatus },\n { name: \"logs\", description: \"View service logs\", usage: \"pkg-ops service logs <name> [--lines N]\", handler: handleServiceLogs },\n { name: \"enable\", description: \"Enable service on boot\", usage: \"pkg-ops service enable <name>\", handler: handleServiceEnable },\n { name: \"disable\", description: \"Disable service from boot\", usage: \"pkg-ops service disable <name>\", handler: handleServiceDisable },\n];\n\nconst configCommands: Subcommand[] = [\n { name: \"show\", description: \"Show configuration\", usage: \"pkg-ops config show\", handler: handleConfigShow },\n { name: \"set\", description: \"Set a config value\", usage: \"pkg-ops config set <package> <key> <value>\", handler: handleConfigSet },\n];\n\nfunction printHelp(): void {\n console.log(`\nPkgOps - Package operations CLI for VPS\n\nUsage:\n pkg-ops <command> [arguments]\n\nPackage Management:\n install <package>[@version] Install an @ebowwa/* package\n update <package> Update a package to latest version\n update-all Update all managed packages\n list List installed packages\n rollback <package> Rollback a package to previous version\n\nService Management:\n service start <name> Start a systemd service\n service stop <name> Stop a systemd service\n service restart <name> Restart a systemd service\n service status <name> Get service status\n service logs <name> [--lines N] View service logs\n service enable <name> Enable service on boot\n service disable <name> Disable service from boot\n\nHealth:\n health [service] Check health of all services or specific one\n\nVerification & Audit:\n verify <package> Verify package integrity\n sync-status [--local-path p] Show local vs VPS version sync\n audit Check for vulnerabilities\n scan Alias for audit\n sizes Show bundle sizes\n\nConfig:\n config show Show configuration\n config set <pkg> <key> <val> Set a config value\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\nExamples:\n pkg-ops install @ebowwa/stack@0.7.12\n pkg-ops service start stack\n pkg-ops health\n pkg-ops sync-status --local-path ./package.json\n pkg-ops verify @ebowwa/stack\n pkg-ops audit\n`);\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === \"--help\" || args[0] === \"-h\") {\n printHelp();\n process.exit(0);\n }\n\n if (args[0] === \"--version\" || args[0] === \"-v\") {\n const config = loadConfig();\n console.log(`pkg-ops ${config.packages?.[\"@ebowwa/pkg-ops\"]?.version ?? \"0.1.0\"}`);\n process.exit(0);\n }\n\n const commandName = args[0];\n const commandArgs = args.slice(1);\n\n // Handle service subcommands\n if (commandName === \"service\") {\n if (commandArgs.length === 0) {\n console.error(\"Missing service subcommand\");\n console.error(\"Usage: pkg-ops service <start|stop|restart|status|logs|enable|disable> <name>\");\n process.exit(1);\n }\n\n const subcommandName = commandArgs[0];\n const subcommand = serviceCommands.find((c) => c.name === subcommandName);\n\n if (!subcommand) {\n console.error(`Unknown service subcommand: ${subcommandName}`);\n process.exit(1);\n }\n\n await subcommand.handler(commandArgs.slice(1));\n return;\n }\n\n // Handle config subcommands\n if (commandName === \"config\") {\n if (commandArgs.length === 0) {\n console.error(\"Missing config subcommand\");\n console.error(\"Usage: pkg-ops config <show|set> [args...]\");\n process.exit(1);\n }\n\n const subcommandName = commandArgs[0];\n const subcommand = configCommands.find((c) => c.name === subcommandName);\n\n if (!subcommand) {\n console.error(`Unknown config subcommand: ${subcommandName}`);\n process.exit(1);\n }\n\n await subcommand.handler(commandArgs.slice(1));\n return;\n }\n\n // Handle regular commands\n const command = commands.find((c) => c.name === commandName);\n\n if (!command) {\n console.error(`Unknown command: ${commandName}`);\n console.error(\"Run 'pkg-ops --help' for usage\");\n process.exit(1);\n }\n\n await command.handler(commandArgs);\n}\n\n// Run CLI\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n",
|
|
5
|
+
"#!/usr/bin/env bun\n/**\n * PkgOps CLI\n *\n * Package operations CLI that installs @ebowwa/* npm packages\n * and manages systemd services.\n *\n * @example\n * ```bash\n * # Install a package\n * pkg-ops install @ebowwa/stack@0.7.12\n *\n * # Service management\n * pkg-ops service start stack\n * pkg-ops service status stack\n *\n * # Health check\n * pkg-ops health\n *\n * # List packages\n * pkg-ops list\n * ```\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport {\n loadConfig,\n parsePackageSpec,\n isValidPackageName,\n getPackageConfig,\n updatePackageConfig,\n removePackageConfig,\n listManagedPackages,\n} from \"./config.js\";\nimport { ServiceManager, getServiceManager } from \"./service-manager.js\";\nimport { RustBridge, startBridge, stopBridge } from \"./bridge.js\";\nimport { startHealthServer, stopHealthServer, getHealthServer } from \"./health-server.js\";\nimport type { VerifyResult, AuditResult, BundleSize, InstalledPackageInfo } from \"./bridge.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface Command {\n name: string;\n description: string;\n usage: string;\n handler: (args: string[]) => Promise<void> | void;\n}\n\ninterface Subcommand {\n name: string;\n description: string;\n usage: string;\n handler: (args: string[]) => Promise<void> | void;\n}\n\n// ---------------------------------------------------------------------------\n// Package Management Commands\n// ---------------------------------------------------------------------------\n\nasync function handleInstall(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops install <package>[@version]\");\n process.exit(1);\n }\n\n const spec = args[0];\n const { name, version } = parsePackageSpec(spec);\n\n if (!isValidPackageName(name)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n console.log(`Installing ${name}@${version}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.install(name, version);\n\n if (result.success) {\n console.log(`Successfully installed ${name}@${result.version}`);\n if (result.previousVersion) {\n console.log(` Previous version: ${result.previousVersion}`);\n }\n\n // Update config\n updatePackageConfig(name, {\n version: result.version,\n service: name.replace(\"@ebowwa/\", \"\"),\n });\n\n // Start service if configured\n const config = getPackageConfig(name);\n if (config?.service && config.autoStart !== false) {\n const sm = getServiceManager();\n const startResult = await sm.start(config.service);\n if (startResult.success) {\n console.log(` Service ${config.service} started`);\n } else {\n console.warn(` Failed to start service: ${startResult.message}`);\n }\n }\n } else {\n console.error(`Failed to install ${name}: ${result.message}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(`Install failed:`, error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleUpdate(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops update <package>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n\n if (!isValidPackageName(packageName)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n console.log(`Updating ${packageName}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.update(packageName);\n\n if (result.success) {\n console.log(`Successfully updated ${packageName} to ${result.version}`);\n if (result.previousVersion) {\n console.log(` Previous version: ${result.previousVersion}`);\n }\n\n // Update config\n updatePackageConfig(packageName, {\n version: result.version,\n service: packageName.replace(\"@ebowwa/\", \"\"),\n });\n\n // Restart service if running\n const sm = getServiceManager();\n const config = getPackageConfig(packageName);\n if (config?.service) {\n const status = await sm.status(config.service);\n if (status.active) {\n await sm.restart(config.service);\n console.log(` Service ${config.service} restarted`);\n }\n }\n } else {\n console.error(`Failed to update ${packageName}: ${result.message}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(`Update failed:`, error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleUpdateAll(_args: string[]): Promise<void> {\n console.log(\"Updating all managed packages...\");\n\n try {\n const bridge = await startBridge();\n const results = await bridge.updateAll();\n\n for (const result of results) {\n if (result.success) {\n console.log(`Updated ${result.version}`);\n } else {\n console.error(`Failed to update: ${result.message}`);\n }\n }\n } catch (error) {\n console.error(\"Update all failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleList(_args: string[]): Promise<void> {\n console.log(\"Installed packages:\\n\");\n\n try {\n const bridge = await startBridge();\n const packages = await bridge.list();\n\n if (packages.length === 0) {\n console.log(\" No packages installed\");\n return;\n }\n\n for (const pkg of packages) {\n const status = pkg.installed ? \"installed\" : \"not installed\";\n const service = pkg.service ? ` (service: ${pkg.service})` : \"\";\n console.log(` ${pkg.name}@${pkg.version} [${status}]${service}`);\n }\n } catch (error) {\n console.error(\"Failed to list packages:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleRollback(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops rollback <package>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n\n console.log(`Rolling back ${packageName}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.rollback(packageName);\n\n if (result.success) {\n console.log(`Rolled back ${packageName} from ${result.currentVersion} to ${result.previousVersion}`);\n\n // Restart service if running\n const sm = getServiceManager();\n const config = getPackageConfig(packageName);\n if (config?.service) {\n const status = await sm.status(config.service);\n if (status.active) {\n await sm.restart(config.service);\n console.log(` Service ${config.service} restarted`);\n }\n }\n } else {\n console.error(`Rollback failed: ${result.message}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"Rollback failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Service Management Commands\n// ---------------------------------------------------------------------------\n\nasync function handleServiceStart(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service start <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Starting ${serviceName}...`);\n const result = await sm.start(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} started`);\n } else {\n console.error(`Failed to start ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceStop(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service stop <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Stopping ${serviceName}...`);\n const result = await sm.stop(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} stopped`);\n } else {\n console.error(`Failed to stop ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceRestart(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service restart <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Restarting ${serviceName}...`);\n const result = await sm.restart(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} restarted`);\n } else {\n console.error(`Failed to restart ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceStatus(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service status <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n const info = await sm.info(serviceName);\n\n if (!info.exists) {\n console.log(`Service ${serviceName} not found`);\n return;\n }\n\n console.log(`Service: ${serviceName}`);\n console.log(` Loaded: ${info.status.loaded}`);\n console.log(` Active: ${info.status.active}`);\n console.log(` State: ${info.status.subState}`);\n console.log(` PID: ${info.status.mainPid || \"N/A\"}`);\n console.log(` Description: ${info.status.description || \"N/A\"}`);\n}\n\nasync function handleServiceLogs(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service logs <name> [--lines N]\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const linesIndex = args.indexOf(\"--lines\");\n const lines = linesIndex >= 0 && args[linesIndex + 1]\n ? parseInt(args[linesIndex + 1], 10)\n : 100;\n\n const sm = getServiceManager();\n const logs = await sm.logs(serviceName, { lines });\n\n console.log(logs);\n}\n\nasync function handleServiceEnable(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service enable <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Enabling ${serviceName}...`);\n const result = await sm.enable(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} enabled on boot`);\n } else {\n console.error(`Failed to enable ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\nasync function handleServiceDisable(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops service disable <name>\");\n process.exit(1);\n }\n\n const serviceName = args[0];\n const sm = getServiceManager();\n\n console.log(`Disabling ${serviceName}...`);\n const result = await sm.disable(serviceName);\n\n if (result.success) {\n console.log(`Service ${serviceName} disabled from boot`);\n } else {\n console.error(`Failed to disable ${serviceName}: ${result.message}`);\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Health Commands\n// ---------------------------------------------------------------------------\n\nasync function handleHealth(args: string[]): Promise<void> {\n const serviceName = args[0];\n\n const healthServer = getHealthServer();\n if (!healthServer) {\n console.error(\"Health server not initialized\");\n process.exit(1);\n }\n\n const health = await healthServer.checkHealth(serviceName);\n\n if (!health) {\n console.log(\"Service not found\");\n return;\n }\n\n if (\"services\" in health) {\n // SystemHealth\n if (health.healthy) {\n console.log(\"All services healthy\");\n } else {\n console.log(\"Some services unhealthy\");\n }\n\n for (const service of health.services) {\n const icon = service.healthy ? \"OK\" : \"FAIL\";\n console.log(` [${icon}] ${service.name}: ${service.status.subState}`);\n }\n } else {\n // ServiceHealth\n const icon = health.healthy ? \"OK\" : \"FAIL\";\n console.log(`[${icon}] ${health.name}: ${health.status.subState}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Config Commands\n// ---------------------------------------------------------------------------\n\nasync function handleConfigShow(_args: string[]): Promise<void> {\n const config = loadConfig();\n\n console.log(\"PkgOps Configuration\");\n console.log(`Config path: /etc/pkg-ops/config.json`);\n console.log(`Health port: ${config.healthPort}`);\n console.log(`Work dir: ${config.workDir}`);\n console.log(`Log level: ${config.logLevel}`);\n console.log(\"\\nPackages:\");\n\n const packages = listManagedPackages();\n if (packages.length === 0) {\n console.log(\" No packages configured\");\n return;\n }\n\n for (const { name, config: pkgConfig } of packages) {\n console.log(` ${name}:`);\n console.log(` Version: ${pkgConfig.version}`);\n if (pkgConfig.service) {\n console.log(` Service: ${pkgConfig.service}`);\n }\n if (pkgConfig.autoStart !== undefined) {\n console.log(` Auto-start: ${pkgConfig.autoStart}`);\n }\n }\n}\n\nasync function handleConfigSet(args: string[]): Promise<void> {\n if (args.length < 3) {\n console.error(\"Usage: pkg-ops config set <package> <key> <value>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n const key = args[1];\n const value = args[2];\n\n if (!isValidPackageName(packageName)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n const config = getPackageConfig(packageName) ?? {\n version: \"latest\",\n };\n\n // Handle different value types\n switch (key) {\n case \"version\":\n config.version = value;\n break;\n case \"service\":\n config.service = value;\n break;\n case \"autoStart\":\n config.autoStart = value === \"true\";\n break;\n default:\n console.error(`Unknown config key: ${key}`);\n console.error(\"Valid keys: version, service, autoStart\");\n process.exit(1);\n }\n\n updatePackageConfig(packageName, config);\n console.log(`Updated ${packageName}.${key} = ${value}`);\n}\n\n// ---------------------------------------------------------------------------\n// Verification & Audit Commands\n// ---------------------------------------------------------------------------\n\nasync function handleVerify(args: string[]): Promise<void> {\n if (args.length === 0) {\n console.error(\"Usage: pkg-ops verify <package>\");\n process.exit(1);\n }\n\n const packageName = args[0];\n\n if (!isValidPackageName(packageName)) {\n console.error(`Invalid package name. Only @ebowwa/* packages are supported.`);\n process.exit(1);\n }\n\n console.log(`Verifying ${packageName}...`);\n\n try {\n const bridge = await startBridge();\n const result = await bridge.verify(packageName);\n\n console.log(`\\nPackage: ${result.packageName}@${result.version}`);\n console.log(` Status: ${result.success ? \"VALID\" : \"INVALID\"}`);\n console.log(` Dist exists: ${result.distExists ? \"Yes\" : \"No\"}`);\n if (result.checksum) {\n console.log(` Checksum: ${result.checksum}`);\n }\n console.log(` Message: ${result.message}`);\n } catch (error) {\n console.error(\"Verification failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleSyncStatus(args: string[]): Promise<void> {\n const localIndex = args.indexOf(\"--local\");\n const localPathIndex = args.indexOf(\"--local-path\");\n\n let localPath = \"./package.json\";\n if (localPathIndex >= 0 && args[localPathIndex + 1]) {\n localPath = args[localPathIndex + 1];\n }\n\n const showLocal = localIndex >= 0 || localPathIndex >= 0;\n\n try {\n const bridge = await startBridge();\n const vpsPackages = await bridge.getInstalledInfo();\n\n console.log(\"Sync Status: Local vs VPS\\n\");\n\n if (showLocal && existsSync(localPath)) {\n const localContent = readFileSync(localPath, \"utf-8\");\n const localPkg = JSON.parse(localContent);\n const deps = { ...localPkg.dependencies, ...localPkg.devDependencies };\n\n // Build a map of VPS packages\n const vpsMap = new Map<string, string>();\n for (const pkg of vpsPackages) {\n vpsMap.set(pkg.packageName, pkg.version);\n }\n\n // Compare local vs VPS\n for (const [name, localVersion] of Object.entries(deps)) {\n if (!name.startsWith(\"@ebowwa/\")) continue;\n\n const vpsVersion = vpsMap.get(name);\n const cleanLocal = (localVersion as string).replace(/^[\\^~]/, \"\");\n\n if (vpsVersion) {\n if (cleanLocal === vpsVersion) {\n console.log(` ${name}: local=${cleanLocal}, vps=${vpsVersion} (in sync)`);\n } else if (cleanLocal > vpsVersion) {\n console.log(` ${name}: local=${cleanLocal}, vps=${vpsVersion} (VPS behind)`);\n } else {\n console.log(` ${name}: local=${cleanLocal}, vps=${vpsVersion} (local behind)`);\n }\n vpsMap.delete(name);\n } else {\n console.log(` ${name}: local=${cleanLocal}, vps=not installed`);\n }\n }\n\n // Show VPS-only packages\n for (const [name, version] of vpsMap) {\n console.log(` ${name}: local=not in package.json, vps=${version}`);\n }\n } else {\n // Just show VPS installed versions\n if (vpsPackages.length === 0) {\n console.log(\" No packages installed on VPS\");\n } else {\n for (const pkg of vpsPackages) {\n const sizeInfo = pkg.distSizeBytes\n ? ` (${(pkg.distSizeBytes / 1024).toFixed(1)} KB)`\n : \"\";\n console.log(` ${pkg.packageName}@${pkg.version}${sizeInfo}`);\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to get sync status:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleAudit(_args: string[]): Promise<void> {\n console.log(\"Running vulnerability scan...\\n\");\n\n try {\n const bridge = await startBridge();\n const results = await bridge.audit();\n\n if (results.length === 0) {\n console.log(\"No vulnerabilities found.\");\n return;\n }\n\n console.log(`Found ${results.length} vulnerability(es):\\n`);\n\n for (const vuln of results) {\n console.log(`[${vuln.severity.toUpperCase()}] ${vuln.packageName}`);\n console.log(` Vulnerability: ${vuln.vulnerability}`);\n console.log(` Description: ${vuln.description}`);\n console.log(\"\");\n }\n } catch (error) {\n console.error(\"Audit failed:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\nasync function handleScan(args: string[]): Promise<void> {\n // Alias for audit\n await handleAudit(args);\n}\n\nasync function handleSizes(_args: string[]): Promise<void> {\n console.log(\"Bundle sizes:\\n\");\n\n try {\n const bridge = await startBridge();\n const sizes = await bridge.getBundleSizes();\n\n if (sizes.length === 0) {\n console.log(\" No packages installed\");\n return;\n }\n\n // Print table header\n console.log(\" Package | Version | Dist Size\");\n console.log(\" --------------------------------|----------|-----------\");\n\n for (const pkg of sizes) {\n const name = pkg.packageName.padEnd(32);\n const version = pkg.version.padEnd(9);\n const sizeKB = (pkg.distSizeBytes / 1024).toFixed(1) + \" KB\";\n const files = pkg.fileCount ? ` (${pkg.fileCount} files)` : \"\";\n console.log(` ${name} | ${version} | ${sizeKB}${files}`);\n }\n } catch (error) {\n console.error(\"Failed to get bundle sizes:\", error);\n process.exit(1);\n } finally {\n await stopBridge();\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI Entry Point\n// ---------------------------------------------------------------------------\n\nconst commands: Command[] = [\n // Package management\n { name: \"install\", description: \"Install an @ebowwa/* package\", usage: \"pkg-ops install <package>[@version]\", handler: handleInstall },\n { name: \"update\", description: \"Update a package to latest version\", usage: \"pkg-ops update <package>\", handler: handleUpdate },\n { name: \"update-all\", description: \"Update all managed packages\", usage: \"pkg-ops update-all\", handler: handleUpdateAll },\n { name: \"list\", description: \"List installed packages\", usage: \"pkg-ops list\", handler: handleList },\n { name: \"rollback\", description: \"Rollback a package to previous version\", usage: \"pkg-ops rollback <package>\", handler: handleRollback },\n // Service management\n { name: \"start\", description: \"Start a systemd service\", usage: \"pkg-ops service start <name>\", handler: handleServiceStart },\n { name: \"stop\", description: \"Stop a systemd service\", usage: \"pkg-ops service stop <name>\", handler: handleServiceStop },\n { name: \"restart\", description: \"Restart a systemd service\", usage: \"pkg-ops service restart <name>\", handler: handleServiceRestart },\n { name: \"status\", description: \"Get service status\", usage: \"pkg-ops service status <name>\", handler: handleServiceStatus },\n { name: \"logs\", description: \"View service logs\", usage: \"pkg-ops service logs <name> [--lines N]\", handler: handleServiceLogs },\n { name: \"enable\", description: \"Enable service on boot\", usage: \"pkg-ops service enable <name>\", handler: handleServiceEnable },\n { name: \"disable\", description: \"Disable service from boot\", usage: \"pkg-ops service disable <name>\", handler: handleServiceDisable },\n // Health\n { name: \"health\", description: \"Check health of all services\", usage: \"pkg-ops health [service]\", handler: handleHealth },\n // Config\n { name: \"config\", description: \"Show configuration\", usage: \"pkg-ops config show\", handler: handleConfigShow },\n { name: \"set-config\", description: \"Set a config value\", usage: \"pkg-ops config set <package> <key> <value>\", handler: handleConfigSet },\n // Verification & Audit\n { name: \"verify\", description: \"Verify package integrity\", usage: \"pkg-ops verify <package>\", handler: handleVerify },\n { name: \"sync-status\", description: \"Show local vs VPS version sync\", usage: \"pkg-ops sync-status [--local-path path]\", handler: handleSyncStatus },\n { name: \"audit\", description: \"Check for vulnerabilities\", usage: \"pkg-ops audit\", handler: handleAudit },\n { name: \"scan\", description: \"Alias for audit\", usage: \"pkg-ops scan\", handler: handleScan },\n { name: \"sizes\", description: \"Show bundle sizes\", usage: \"pkg-ops sizes\", handler: handleSizes },\n];\n\nconst serviceCommands: Subcommand[] = [\n { name: \"start\", description: \"Start a systemd service\", usage: \"pkg-ops service start <name>\", handler: handleServiceStart },\n { name: \"stop\", description: \"Stop a systemd service\", usage: \"pkg-ops service stop <name>\", handler: handleServiceStop },\n { name: \"restart\", description: \"Restart a systemd service\", usage: \"pkg-ops service restart <name>\", handler: handleServiceRestart },\n { name: \"status\", description: \"Get service status\", usage: \"pkg-ops service status <name>\", handler: handleServiceStatus },\n { name: \"logs\", description: \"View service logs\", usage: \"pkg-ops service logs <name> [--lines N]\", handler: handleServiceLogs },\n { name: \"enable\", description: \"Enable service on boot\", usage: \"pkg-ops service enable <name>\", handler: handleServiceEnable },\n { name: \"disable\", description: \"Disable service from boot\", usage: \"pkg-ops service disable <name>\", handler: handleServiceDisable },\n];\n\nconst configCommands: Subcommand[] = [\n { name: \"show\", description: \"Show configuration\", usage: \"pkg-ops config show\", handler: handleConfigShow },\n { name: \"set\", description: \"Set a config value\", usage: \"pkg-ops config set <package> <key> <value>\", handler: handleConfigSet },\n];\n\nfunction printHelp(): void {\n console.log(`\nPkgOps - Package operations CLI for VPS\n\nUsage:\n pkg-ops <command> [arguments]\n\nPackage Management:\n install <package>[@version] Install an @ebowwa/* package\n update <package> Update a package to latest version\n update-all Update all managed packages\n list List installed packages\n rollback <package> Rollback a package to previous version\n\nService Management:\n service start <name> Start a systemd service\n service stop <name> Stop a systemd service\n service restart <name> Restart a systemd service\n service status <name> Get service status\n service logs <name> [--lines N] View service logs\n service enable <name> Enable service on boot\n service disable <name> Disable service from boot\n\nHealth:\n health [service] Check health of all services or specific one\n\nVerification & Audit:\n verify <package> Verify package integrity\n sync-status [--local-path p] Show local vs VPS version sync\n audit Check for vulnerabilities\n scan Alias for audit\n sizes Show bundle sizes\n\nConfig:\n config show Show configuration\n config set <pkg> <key> <val> Set a config value\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\nExamples:\n pkg-ops install @ebowwa/stack@0.7.12\n pkg-ops service start stack\n pkg-ops health\n pkg-ops sync-status --local-path ./package.json\n pkg-ops verify @ebowwa/stack\n pkg-ops audit\n`);\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === \"--help\" || args[0] === \"-h\") {\n printHelp();\n process.exit(0);\n }\n\n if (args[0] === \"--version\" || args[0] === \"-v\") {\n const config = loadConfig();\n console.log(`pkg-ops ${config.packages?.[\"@ebowwa/pkg-ops\"]?.version ?? \"0.1.0\"}`);\n process.exit(0);\n }\n\n const commandName = args[0];\n const commandArgs = args.slice(1);\n\n // Handle service subcommands\n if (commandName === \"service\") {\n if (commandArgs.length === 0) {\n console.error(\"Missing service subcommand\");\n console.error(\"Usage: pkg-ops service <start|stop|restart|status|logs|enable|disable> <name>\");\n process.exit(1);\n }\n\n const subcommandName = commandArgs[0];\n const subcommand = serviceCommands.find((c) => c.name === subcommandName);\n\n if (!subcommand) {\n console.error(`Unknown service subcommand: ${subcommandName}`);\n process.exit(1);\n }\n\n await subcommand.handler(commandArgs.slice(1));\n return;\n }\n\n // Handle config subcommands\n if (commandName === \"config\") {\n if (commandArgs.length === 0) {\n console.error(\"Missing config subcommand\");\n console.error(\"Usage: pkg-ops config <show|set> [args...]\");\n process.exit(1);\n }\n\n const subcommandName = commandArgs[0];\n const subcommand = configCommands.find((c) => c.name === subcommandName);\n\n if (!subcommand) {\n console.error(`Unknown config subcommand: ${subcommandName}`);\n process.exit(1);\n }\n\n await subcommand.handler(commandArgs.slice(1));\n return;\n }\n\n // Handle regular commands\n const command = commands.find((c) => c.name === commandName);\n\n if (!command) {\n console.error(`Unknown command: ${commandName}`);\n console.error(\"Run 'pkg-ops --help' for usage\");\n process.exit(1);\n }\n\n await command.handler(commandArgs);\n}\n\n// Run CLI\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n\n// ---------------------------------------------------------------------------\n// Re-exports for library usage\n// ---------------------------------------------------------------------------\n\nexport {\n loadConfig,\n saveConfig,\n parsePackageSpec,\n isValidPackageName,\n getPackageConfig,\n updatePackageConfig,\n removePackageConfig,\n listManagedPackages,\n getConfigPath,\n ensureConfigDir,\n type PackageConfig,\n type PkgOpsConfig,\n} from \"./config.js\";\n\nexport {\n ServiceManager,\n getServiceManager,\n type ServiceInfo,\n type ServiceLogsOptions,\n} from \"./service-manager.js\";\n\nexport {\n RustBridge,\n startBridge,\n stopBridge,\n getBridge,\n type InstallResult,\n type PackageInfo,\n type RollbackResult,\n type VerifyResult,\n type AuditResult,\n type BundleSize,\n type InstalledPackageInfo,\n} from \"./bridge.js\";\n\nexport {\n startHealthServer,\n stopHealthServer,\n getHealthServer,\n HealthServer,\n type HealthCheckResult,\n type ServiceHealth,\n type SystemHealth,\n} from \"./health-server.js\";\n\n",
|
|
6
6
|
"/**\n * Configuration management for PkgOps.\n *\n * Handles reading/writing config file at /etc/pkg-ops/config.json\n *\n * @example\n * ```typescript\n * import { loadConfig, saveConfig, getConfigPath } from \"@ebowwa/pkg-ops/config\";\n *\n * const config = await loadConfig();\n * console.log(config.packages);\n *\n * config.packages[\"@ebowwa/stack\"] = { version: \"0.7.13\", service: \"stack.service\" };\n * await saveConfig(config);\n * ```\n */\n\nimport { accessSync, constants, mkdirSync, readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PackageConfig {\n /** Package version (semver or \"latest\") */\n version: string;\n /** Associated systemd service name (without .service suffix) */\n service?: string;\n /** Whether to auto-start the service after install */\n autoStart?: boolean;\n /** Custom environment variables for the service */\n environment?: Record<string, string>;\n}\n\nexport interface PkgOpsConfig {\n /** Managed packages */\n packages: Record<string, PackageConfig>;\n /** Health check HTTP port (default: 8914) */\n healthPort?: number;\n /** Working directory for installations (default: /root) */\n workDir?: string;\n /** Log level (default: \"info\") */\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_CONFIG: PkgOpsConfig = {\n packages: {},\n healthPort: 8914,\n workDir: \"/root\",\n logLevel: \"info\",\n};\n\nexport const CONFIG_DIR = \"/etc/pkg-ops\";\nexport const CONFIG_PATH = `${CONFIG_DIR}/config.json`;\n\n// ---------------------------------------------------------------------------\n// Functions\n// ---------------------------------------------------------------------------\n\n/**\n * Get the config file path.\n * Respects PKG_OPS_CONFIG env override.\n */\nexport function getConfigPath(): string {\n return process.env.PKG_OPS_CONFIG ?? CONFIG_PATH;\n}\n\n/**\n * Ensure config directory exists (requires sudo on most systems).\n */\nexport function ensureConfigDir(): void {\n const configDir = dirname(getConfigPath());\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: constants.S_IRWXU | constants.S_IRGRP | constants.S_IXGRP });\n }\n}\n\n/**\n * Load configuration from file.\n * Returns default config if file doesn't exist.\n */\nexport function loadConfig(): PkgOpsConfig {\n const configPath = getConfigPath();\n\n try {\n if (!existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n const content = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n // Merge with defaults\n return {\n ...DEFAULT_CONFIG,\n ...parsed,\n };\n } catch (error) {\n console.error(`Failed to load config from ${configPath}:`, error);\n return { ...DEFAULT_CONFIG };\n }\n}\n\n/**\n * Save configuration to file.\n * Creates directory if it doesn't exist.\n */\nexport function saveConfig(config: PkgOpsConfig): void {\n const configPath = getConfigPath();\n ensureConfigDir();\n\n const content = JSON.stringify(config, null, 2);\n writeFileSync(configPath, content, {\n encoding: \"utf-8\",\n mode: constants.S_IRUSR | constants.S_IWUSR | constants.S_IRGRP,\n });\n}\n\n/**\n * Update a package in the config.\n */\nexport function updatePackageConfig(\n packageName: string,\n packageConfig: PackageConfig\n): PkgOpsConfig {\n const config = loadConfig();\n config.packages[packageName] = packageConfig;\n saveConfig(config);\n return config;\n}\n\n/**\n * Remove a package from the config.\n */\nexport function removePackageConfig(packageName: string): PkgOpsConfig {\n const config = loadConfig();\n delete config.packages[packageName];\n saveConfig(config);\n return config;\n}\n\n/**\n * Get a specific package config.\n */\nexport function getPackageConfig(packageName: string): PackageConfig | undefined {\n const config = loadConfig();\n return config.packages[packageName];\n}\n\n/**\n * List all managed packages.\n */\nexport function listManagedPackages(): Array<{ name: string; config: PackageConfig }> {\n const config = loadConfig();\n return Object.entries(config.packages).map(([name, cfg]) => ({ name, config: cfg }));\n}\n\n/**\n * Validate package name (must be @ebowwa/* scope).\n */\nexport function isValidPackageName(name: string): boolean {\n return name.startsWith(\"@ebowwa/\");\n}\n\n/**\n * Parse package specifier into name and version.\n * @example\n * parsePackageSpec(\"@ebowwa/stack@0.7.12\") => { name: \"@ebowwa/stack\", version: \"0.7.12\" }\n * parsePackageSpec(\"@ebowwa/stack\") => { name: \"@ebowwa/stack\", version: \"latest\" }\n */\nexport function parsePackageSpec(spec: string): { name: string; version: string } {\n const atIndex = spec.lastIndexOf(\"@\");\n if (atIndex <= 0) {\n // No version specified or scoped package without version\n return { name: spec, version: \"latest\" };\n }\n\n const name = spec.slice(0, atIndex);\n const version = spec.slice(atIndex + 1);\n\n if (!version) {\n return { name, version: \"latest\" };\n }\n\n return { name, version };\n}\n",
|
|
7
7
|
"// @bun\nvar E=Object.create;var{getPrototypeOf:w,defineProperty:X,getOwnPropertyNames:A,getOwnPropertyDescriptor:P}=Object,N=Object.prototype.hasOwnProperty;var m=(B,j,z)=>{z=B!=null?E(w(B)):{};let D=j||!B||!B.__esModule?X(z,\"default\",{value:B,enumerable:!0}):z;for(let G of A(B))if(!N.call(D,G))X(D,G,{get:()=>B[G],enumerable:!0});return D},_=new WeakMap,u=(B)=>{var j=_.get(B),z;if(j)return j;if(j=X({},\"__esModule\",{value:!0}),B&&typeof B===\"object\"||typeof B===\"function\")A(B).map((D)=>!N.call(j,D)&&X(j,D,{get:()=>B[D],enumerable:!(z=P(B,D))||z.enumerable}));return _.set(B,j),j},r=(B,j)=>()=>(j||B((j={exports:{}}).exports,j),j.exports);var R=(B,j)=>{for(var z in j)X(B,z,{get:j[z],enumerable:!0,configurable:!0,set:(D)=>j[z]=()=>D})};var O=(B,j)=>()=>(B&&(j=B(B=0)),j);var H={};R(H,{writeFile:()=>k,sudo:()=>Z,pkgInstall:()=>y,exec:()=>U});async function Z(B,j){let z=Array.isArray(B)?B:B.split(/\\s+/),G=[\"sudo\",...j.env?Object.entries(j.env).map(([J,K])=>`${J}=${F(K)}`):[],...z];return U(G,j)}async function y(B,j){let z=j.pm??\"apt\",D={...j.env,...j.nonInteractive!==!1?{DEBIAN_FRONTEND:\"noninteractive\"}:{}};return await Z(v[z],{...j,env:D,quiet:!0}),Z([...S[z],...B],{...j,env:D})}async function k(B,j,z){let G=`tee ${z.append?\"-a\":\"\"} ${F(B)}`.trim(),J=await g(j,[\"sudo\",G],z);if(J.ok&&z.mode)await Z([\"chmod\",z.mode,B],z);if(J.ok&&z.owner)await Z([\"chown\",z.owner,B],z);return J}function T(B){let j=[\"ssh\",\"-F\",\"/dev/null\",\"-o\",\"StrictHostKeyChecking=no\",\"-o\",\"UserKnownHostsFile=/dev/null\"];if(B.keyPath)j.push(\"-i\",B.keyPath);else if(B.key)j.push(\"-i\",B.key);if(B.port)j.push(\"-p\",String(B.port));return j.push(`${B.user??\"root\"}@${B.host}`),j}async function U(B,j){let z=j.context??{type:\"local\"},D=z.type===\"ssh\"?[...T(z),B.map(F).join(\" \")]:B,G=Bun.spawn(D,{stdout:\"pipe\",stderr:\"pipe\",timeout:j.timeout??30000}),J=await G.exited,K=j.quiet?\"\":await new Response(G.stdout).text(),V=await new Response(G.stderr).text();return{stdout:K,stderr:V,exitCode:J,ok:J===0}}async function g(B,j,z){let D=z.context??{type:\"local\"};if(D.type===\"ssh\"){let L=T(D),W=j.join(\" \"),b=[...L,W],$=Bun.spawn(b,{stdin:new TextEncoder().encode(B),stdout:\"pipe\",stderr:\"pipe\",timeout:z.timeout??30000}),Y=await $.exited,q=z.quiet?\"\":await new Response($.stdout).text(),f=await new Response($.stderr).text();return{stdout:q,stderr:f,exitCode:Y,ok:Y===0}}let G=Bun.spawn([\"sh\",\"-c\",j.join(\" \")],{stdin:new TextEncoder().encode(B),stdout:\"pipe\",stderr:\"pipe\",timeout:z.timeout??30000}),J=await G.exited,K=z.quiet?\"\":await new Response(G.stdout).text(),V=await new Response(G.stderr).text();return{stdout:K,stderr:V,exitCode:J,ok:J===0}}function F(B){if(/^[a-zA-Z0-9._\\-\\/=:@]+$/.test(B))return B;return`'${B.replace(/'/g,\"'\\\\''\")}'`}var S,v;var I=O(()=>{S={apt:[\"apt-get\",\"install\",\"-y\"],dnf:[\"dnf\",\"install\",\"-y\"],apk:[\"apk\",\"add\",\"--no-cache\"]},v={apt:[\"apt-get\",\"update\",\"-qq\"],dnf:[\"dnf\",\"check-update\"],apk:[\"apk\",\"update\"]}});async function M(B,j){let{sudo:z}=await Promise.resolve().then(() => (I(),H));return z(B,j)}async function C(B,j,z){let{writeFile:D}=await Promise.resolve().then(() => (I(),H));return D(B,j,z)}var Q=null;async function h(B){if(Q)return Q;let j=B??{context:{type:\"local\"}},z=await M([\"which\",\"systemctl\"],{...j,env:j.env});if(!z.ok||!z.stdout.trim()){let K={available:!1,reason:\"not_found\",message:\"systemctl command not found - systemd is not installed or not in PATH\"};return Q=K,K}let D=await M([\"systemctl\",\"is-system-running\"],{...j,env:j.env});if(D.ok&&D.stdout.trim()!==\"\"){let K={available:!0,message:\"systemd is available and running\"};return Q=K,K}if((await M([\"test\",\"-d\",\"/run/systemd/system\"],{...j,env:j.env})).ok){let K={available:!0,message:\"systemd detected via /run/systemd/system (container environment)\"};return Q=K,K}let J={available:!1,reason:\"not_running\",message:\"systemd is not available on this system (container/initless environment)\"};return Q=J,J}function l(){Q=null}function x(B,j){let z=[];if(z.push(\"[Unit]\"),z.push(`Description=${j.description}`),j.after?.length)z.push(`After=${j.after.join(\" \")}`);if(j.wants?.length)z.push(`Wants=${j.wants.join(\" \")}`);if(z.push(\"\"),z.push(\"[Service]\"),j.type)z.push(`Type=${j.type}`);if(z.push(`User=${j.user??\"root\"}`),j.group)z.push(`Group=${j.group}`);if(z.push(`WorkingDirectory=${j.workingDirectory}`),z.push(`ExecStart=${j.execStart}`),j.execStartPre?.length)j.execStartPre.forEach((D,G)=>{z.push(`ExecStartPre${G>0?`=${G}`:\"\"}=${D}`)});if(j.execStopPost?.length)j.execStopPost.forEach((D,G)=>{z.push(`ExecStopPost${G>0?`=${G}`:\"\"}=${D}`)});if(j.restart)z.push(`Restart=${j.restart}`);if(j.restartSec)z.push(`RestartSec=${j.restartSec}`);if(j.environment)Object.entries(j.environment).forEach(([D,G])=>{z.push(`Environment=\"${D}=${G}\"`)});if(j.environmentFile)z.push(`EnvironmentFile=${j.environmentFile}`);if(j.standardOutput)z.push(`StandardOutput=${j.standardOutput}`);if(j.standardError)z.push(`StandardError=${j.standardError}`);if(j.nice!==void 0)z.push(`Nice=${j.nice}`);if(j.noNewPrivileges)z.push(\"NoNewPrivileges=true\");if(j.privateTmp)z.push(\"PrivateTmp=true\");if(j.protectSystem)z.push(`ProtectSystem=${j.protectSystem}`);if(j.protectHome===!0)z.push(\"ProtectHome=true\");else if(j.protectHome)z.push(`ProtectHome=${j.protectHome}`);if(j.readOnlyPaths?.length)z.push(`ReadOnlyPaths=${j.readOnlyPaths.join(\" \")}`);if(j.readWritePaths?.length)z.push(`ReadWritePaths=${j.readWritePaths.join(\" \")}`);if(j.restrictRealtime)z.push(\"RestrictRealtime=true\");if(j.memoryDenyWriteExecute)z.push(\"MemoryDenyWriteExecute=true\");if(j.protectKernelTunables)z.push(\"ProtectKernelTunables=true\");if(j.protectKernelModules)z.push(\"ProtectKernelModules=true\");if(j.protectControlGroups)z.push(\"ProtectControlGroups=true\");if(j.restrictAddressFamilies?.length)z.push(`RestrictAddressFamilies=${j.restrictAddressFamilies.join(\" \")}`);if(j.deviceAllow?.length)z.push(`DeviceAllow=${j.deviceAllow.join(\" \")}`);if(j.devicePolicy)z.push(`DevicePolicy=${j.devicePolicy}`);if(j.systemCallFilter?.length)z.push(`SystemCallFilter=${j.systemCallFilter.join(\" \")}`);if(j.restrictNamespaces===!0)z.push(\"RestrictNamespaces=true\");else if(Array.isArray(j.restrictNamespaces)&&j.restrictNamespaces.length>0)z.push(`RestrictNamespaces=${j.restrictNamespaces.join(\" \")}`);if(j.personality)z.push(`Personality=${j.personality}`);if(j.lockPersonality)z.push(\"LockPersonality=true\");if(j.removeCapability?.length)j.removeCapability.forEach((D)=>z.push(`RemoveCapability=${D}`));if(j.capabilityBoundingSet?.length)z.push(`CapabilityBoundingSet=${j.capabilityBoundingSet.join(\" \")}`);if(j.ambientCapabilities?.length)z.push(`AmbientCapabilities=${j.ambientCapabilities.join(\" \")}`);if(j.privateDevices)z.push(\"PrivateDevices=true\");if(j.protectKernelLogs)z.push(\"ProtectKernelLogs=true\");if(j.extras)z.push(\"\"),z.push(j.extras);return z.join(`\n`)}async function c(B,j){let z=`/etc/systemd/system/${B}.service`,D=x(B,j),G=await C(z,D,{context:j.context,mode:\"644\",env:j.env,timeout:j.timeout});if(!G.ok)return G;return await M([\"systemctl\",\"daemon-reload\"],j),{...G,unitPath:z}}async function i(B,j){return M([\"systemctl\",\"enable\",B],j)}async function n(B,j){return M([\"systemctl\",\"disable\",B],j)}async function e(B,j){return M([\"systemctl\",\"start\",B],j)}async function p(B,j){return M([\"systemctl\",\"stop\",B],j)}async function o(B,j){return M([\"systemctl\",\"restart\",B],j)}async function t(B,j){return M([\"systemctl\",\"reload\",B],j)}async function s(B,j){let z=await M([\"systemctl\",\"show\",B,\"--property=LoadState,ActiveState,SubState,MainPID,Description\"],{...j});if(!z.ok)return{loaded:!1,active:!1,subState:\"unknown\",mainPid:0,description:\"\"};let D=(G)=>{return z.stdout.match(new RegExp(`^${G}=(.+)$`,\"m\"))?.[1]?.trim()??\"\"};return{loaded:D(\"LoadState\")===\"loaded\",active:D(\"ActiveState\")===\"active\",subState:D(\"SubState\"),mainPid:parseInt(D(\"MainPID\")||\"0\",10),description:D(\"Description\")}}async function jj(B,j){return M([\"systemctl\",\"enable\",\"--now\",B],j)}async function zj(B,j){let z=await M([\"systemctl\",\"list-unit-files\",B+\".service\"],j);return z.ok&&z.stdout.includes(B)}async function Bj(B,j={}){let z=[\"journalctl\",\"-u\",B,\"-n\",String(j.lines??100)];if(j.since)z.push(\"--since\",j.since);if(!j.follow)z.push(\"-n\",String(j.lines??100));return(await M(z,j)).stdout}var d={strict:{noNewPrivileges:!0,privateTmp:!0,protectSystem:\"strict\",protectHome:!0,readOnlyPaths:[\"/\"],readWritePaths:[],restrictRealtime:!0,memoryDenyWriteExecute:!0,protectKernelTunables:!0,protectKernelModules:!0,protectControlGroups:!0,restrictAddressFamilies:[\"AF_UNIX\",\"AF_INET\",\"AF_INET6\"],devicePolicy:\"closed\",deviceAllow:[],restrictNamespaces:!0,privateDevices:!0,protectKernelLogs:!0,lockPersonality:!0,capabilityBoundingSet:[]},standard:{noNewPrivileges:!0,privateTmp:!0,protectSystem:\"full\",protectHome:!0,restrictRealtime:!0,memoryDenyWriteExecute:!0,protectKernelTunables:!0,protectKernelModules:!0,protectControlGroups:!0,restrictAddressFamilies:[\"AF_UNIX\",\"AF_INET\",\"AF_INET6\"],devicePolicy:\"auto\",restrictNamespaces:!0,privateDevices:!0,capabilityBoundingSet:[\"CAP_NET_BIND_SERVICE\"]},network:{noNewPrivileges:!0,privateTmp:!0,protectSystem:\"full\",protectHome:!0,restrictRealtime:!0,protectKernelTunables:!0,protectKernelModules:!0,protectControlGroups:!0,restrictAddressFamilies:[\"AF_UNIX\",\"AF_INET\",\"AF_INET6\"],devicePolicy:\"auto\",privateDevices:!0,capabilityBoundingSet:[\"CAP_NET_BIND_SERVICE\"],ambientCapabilities:[\"CAP_NET_BIND_SERVICE\"]},minimal:{noNewPrivileges:!0,privateTmp:!0,protectSystem:\"yes\",restrictRealtime:!0},deviceAccess:{noNewPrivileges:!0,privateTmp:!0,protectSystem:\"full\",protectHome:!0,restrictRealtime:!0,memoryDenyWriteExecute:!0,protectKernelTunables:!0,protectKernelModules:!0,protectControlGroups:!0,devicePolicy:\"auto\",restrictNamespaces:!0,privateDevices:!1}};function Dj(B,j){return{...d[B],...j}}async function Gj(B,j={}){let{requireSystemd:z=!0,onNoSystemd:D,context:G,env:J,timeout:K,quiet:V}=j,W=await h(G?{context:G,env:J,timeout:K,quiet:V}:{context:{type:\"local\"},env:J,timeout:K,quiet:V});if(!W.available){if(D)await D(W);if(z)throw Error(`Systemd required but not available: ${W.message}`);return}return B()}export{Dj as withSecurityPreset,p as stopService,e as startService,zj as serviceExists,Gj as safeSystemd,o as restartService,t as reloadService,h as hasSystemd,s as getServiceStatus,Bj as getServiceLogs,x as generateServiceUnit,i as enableService,jj as enableAndStartService,n as disableService,c as createServiceUnit,l as clearSystemdCache,d as SECURITY_PRESETS};\n\n//# debugId=ED63689B5988FB3964756E2164756E21\n//# sourceMappingURL=systemd.js.map\n",
|
|
8
8
|
"/**\n * Service management using @ebowwa/installations.\n *\n * Wraps systemd operations for package operations.\n *\n * @example\n * ```typescript\n * import { ServiceManager } from \"@ebowwa/pkg-ops/service-manager\";\n *\n * const manager = new ServiceManager();\n *\n * // Start a service\n * await manager.start(\"stack\");\n *\n * // Check status\n * const status = await manager.status(\"stack\");\n * console.log(status.active ? \"Running\" : \"Stopped\");\n *\n * // View logs\n * const logs = await manager.logs(\"stack\", { lines: 50 });\n * ```\n */\n\nimport {\n startService,\n stopService,\n restartService,\n getServiceStatus,\n enableService,\n disableService,\n serviceExists,\n getServiceLogs,\n type ServiceStatus,\n} from \"@ebowwa/installations/systemd\";\n\nimport type { SudoOptions } from \"@ebowwa/installations\";\n\n// Re-export ServiceStatus for other modules\nexport type { ServiceStatus } from \"@ebowwa/installations/systemd\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ServiceInfo {\n /** Service name (without .service suffix) */\n name: string;\n /** Whether the service exists */\n exists: boolean;\n /** Service status */\n status: ServiceStatus;\n /** Associated package (if known) */\n package?: string;\n}\n\nexport interface ServiceLogsOptions {\n /** Number of lines to show (default: 100) */\n lines?: number;\n /** Show logs since timestamp */\n since?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Service Manager Class\n// ---------------------------------------------------------------------------\n\n/**\n * Manages systemd services for packages.\n */\nexport class ServiceManager {\n private sudoOptions: SudoOptions;\n\n constructor(sudoOptions?: SudoOptions) {\n this.sudoOptions = sudoOptions ?? { context: { type: \"local\" } };\n }\n\n /**\n * Start a service.\n */\n async start(name: string): Promise<{ success: boolean; message: string }> {\n const result = await startService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} started` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Stop a service.\n */\n async stop(name: string): Promise<{ success: boolean; message: string }> {\n const result = await stopService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} stopped` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Restart a service.\n */\n async restart(name: string): Promise<{ success: boolean; message: string }> {\n const result = await restartService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} restarted` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Get service status.\n */\n async status(name: string): Promise<ServiceStatus> {\n return getServiceStatus(name, this.sudoOptions);\n }\n\n /**\n * Enable a service to start on boot.\n */\n async enable(name: string): Promise<{ success: boolean; message: string }> {\n const result = await enableService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} enabled` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Disable a service from starting on boot.\n */\n async disable(name: string): Promise<{ success: boolean; message: string }> {\n const result = await disableService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} disabled` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Check if a service exists.\n */\n async exists(name: string): Promise<boolean> {\n return serviceExists(name, this.sudoOptions);\n }\n\n /**\n * Get service logs.\n */\n async logs(name: string, options?: ServiceLogsOptions): Promise<string> {\n return getServiceLogs(name, {\n ...this.sudoOptions,\n lines: options?.lines ?? 100,\n since: options?.since,\n });\n }\n\n /**\n * Get comprehensive service info.\n */\n async info(name: string): Promise<ServiceInfo> {\n const [existsResult, statusResult] = await Promise.all([\n this.exists(name),\n this.status(name),\n ]);\n\n return {\n name,\n exists: existsResult,\n status: statusResult,\n };\n }\n\n /**\n * Check if a service is healthy (running and active).\n */\n async isHealthy(name: string): Promise<boolean> {\n const status = await this.status(name);\n return status.active && status.subState === \"running\";\n }\n\n /**\n * Wait for a service to become healthy.\n */\n async waitForHealthy(\n name: string,\n options?: { timeout?: number; interval?: number }\n ): Promise<boolean> {\n const timeout = options?.timeout ?? 30000;\n const interval = options?.interval ?? 1000;\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const healthy = await this.isHealthy(name);\n if (healthy) return true;\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Singleton Instance\n// ---------------------------------------------------------------------------\n\nlet defaultManager: ServiceManager | null = null;\n\n/**\n * Get the default service manager instance.\n */\nexport function getServiceManager(): ServiceManager {\n if (!defaultManager) {\n defaultManager = new ServiceManager();\n }\n return defaultManager;\n}\n",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"/**\n * Service management using @ebowwa/installations.\n *\n * Wraps systemd operations for package operations.\n *\n * @example\n * ```typescript\n * import { ServiceManager } from \"@ebowwa/pkg-ops/service-manager\";\n *\n * const manager = new ServiceManager();\n *\n * // Start a service\n * await manager.start(\"stack\");\n *\n * // Check status\n * const status = await manager.status(\"stack\");\n * console.log(status.active ? \"Running\" : \"Stopped\");\n *\n * // View logs\n * const logs = await manager.logs(\"stack\", { lines: 50 });\n * ```\n */\n\nimport {\n startService,\n stopService,\n restartService,\n getServiceStatus,\n enableService,\n disableService,\n serviceExists,\n getServiceLogs,\n type ServiceStatus,\n} from \"@ebowwa/installations/systemd\";\n\nimport type { SudoOptions } from \"@ebowwa/installations\";\n\n// Re-export ServiceStatus for other modules\nexport type { ServiceStatus } from \"@ebowwa/installations/systemd\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ServiceInfo {\n /** Service name (without .service suffix) */\n name: string;\n /** Whether the service exists */\n exists: boolean;\n /** Service status */\n status: ServiceStatus;\n /** Associated package (if known) */\n package?: string;\n}\n\nexport interface ServiceLogsOptions {\n /** Number of lines to show (default: 100) */\n lines?: number;\n /** Show logs since timestamp */\n since?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Service Manager Class\n// ---------------------------------------------------------------------------\n\n/**\n * Manages systemd services for packages.\n */\nexport class ServiceManager {\n private sudoOptions: SudoOptions;\n\n constructor(sudoOptions?: SudoOptions) {\n this.sudoOptions = sudoOptions ?? { context: { type: \"local\" } };\n }\n\n /**\n * Start a service.\n */\n async start(name: string): Promise<{ success: boolean; message: string }> {\n const result = await startService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} started` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Stop a service.\n */\n async stop(name: string): Promise<{ success: boolean; message: string }> {\n const result = await stopService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} stopped` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Restart a service.\n */\n async restart(name: string): Promise<{ success: boolean; message: string }> {\n const result = await restartService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} restarted` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Get service status.\n */\n async status(name: string): Promise<ServiceStatus> {\n return getServiceStatus(name, this.sudoOptions);\n }\n\n /**\n * Enable a service to start on boot.\n */\n async enable(name: string): Promise<{ success: boolean; message: string }> {\n const result = await enableService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} enabled` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Disable a service from starting on boot.\n */\n async disable(name: string): Promise<{ success: boolean; message: string }> {\n const result = await disableService(name, this.sudoOptions);\n return {\n success: result.ok,\n message: result.ok ? `Service ${name} disabled` : result.stderr || result.stdout,\n };\n }\n\n /**\n * Check if a service exists.\n */\n async exists(name: string): Promise<boolean> {\n return serviceExists(name, this.sudoOptions);\n }\n\n /**\n * Get service logs.\n */\n async logs(name: string, options?: ServiceLogsOptions): Promise<string> {\n return getServiceLogs(name, {\n ...this.sudoOptions,\n lines: options?.lines ?? 100,\n since: options?.since,\n });\n }\n\n /**\n * Get comprehensive service info.\n */\n async info(name: string): Promise<ServiceInfo> {\n const [existsResult, statusResult] = await Promise.all([\n this.exists(name),\n this.status(name),\n ]);\n\n return {\n name,\n exists: existsResult,\n status: statusResult,\n };\n }\n\n /**\n * Check if a service is healthy (running and active).\n */\n async isHealthy(name: string): Promise<boolean> {\n const status = await this.status(name);\n return status.active && status.subState === \"running\";\n }\n\n /**\n * Wait for a service to become healthy.\n */\n async waitForHealthy(\n name: string,\n options?: { timeout?: number; interval?: number }\n ): Promise<boolean> {\n const timeout = options?.timeout ?? 30000;\n const interval = options?.interval ?? 1000;\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const healthy = await this.isHealthy(name);\n if (healthy) return true;\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Singleton Instance\n// ---------------------------------------------------------------------------\n\nlet defaultManager: ServiceManager | null = null;\n\n/**\n * Get the default service manager instance.\n */\nexport function getServiceManager(): ServiceManager {\n if (!defaultManager) {\n defaultManager = new ServiceManager();\n }\n return defaultManager;\n}\n",
|
|
12
12
|
"/**\n * Configuration management for PkgOps.\n *\n * Handles reading/writing config file at /etc/pkg-ops/config.json\n *\n * @example\n * ```typescript\n * import { loadConfig, saveConfig, getConfigPath } from \"@ebowwa/pkg-ops/config\";\n *\n * const config = await loadConfig();\n * console.log(config.packages);\n *\n * config.packages[\"@ebowwa/stack\"] = { version: \"0.7.13\", service: \"stack.service\" };\n * await saveConfig(config);\n * ```\n */\n\nimport { accessSync, constants, mkdirSync, readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PackageConfig {\n /** Package version (semver or \"latest\") */\n version: string;\n /** Associated systemd service name (without .service suffix) */\n service?: string;\n /** Whether to auto-start the service after install */\n autoStart?: boolean;\n /** Custom environment variables for the service */\n environment?: Record<string, string>;\n}\n\nexport interface PkgOpsConfig {\n /** Managed packages */\n packages: Record<string, PackageConfig>;\n /** Health check HTTP port (default: 8914) */\n healthPort?: number;\n /** Working directory for installations (default: /root) */\n workDir?: string;\n /** Log level (default: \"info\") */\n logLevel?: \"debug\" | \"info\" | \"warn\" | \"error\";\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const DEFAULT_CONFIG: PkgOpsConfig = {\n packages: {},\n healthPort: 8914,\n workDir: \"/root\",\n logLevel: \"info\",\n};\n\nexport const CONFIG_DIR = \"/etc/pkg-ops\";\nexport const CONFIG_PATH = `${CONFIG_DIR}/config.json`;\n\n// ---------------------------------------------------------------------------\n// Functions\n// ---------------------------------------------------------------------------\n\n/**\n * Get the config file path.\n * Respects PKG_OPS_CONFIG env override.\n */\nexport function getConfigPath(): string {\n return process.env.PKG_OPS_CONFIG ?? CONFIG_PATH;\n}\n\n/**\n * Ensure config directory exists (requires sudo on most systems).\n */\nexport function ensureConfigDir(): void {\n const configDir = dirname(getConfigPath());\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true, mode: constants.S_IRWXU | constants.S_IRGRP | constants.S_IXGRP });\n }\n}\n\n/**\n * Load configuration from file.\n * Returns default config if file doesn't exist.\n */\nexport function loadConfig(): PkgOpsConfig {\n const configPath = getConfigPath();\n\n try {\n if (!existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n const content = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n // Merge with defaults\n return {\n ...DEFAULT_CONFIG,\n ...parsed,\n };\n } catch (error) {\n console.error(`Failed to load config from ${configPath}:`, error);\n return { ...DEFAULT_CONFIG };\n }\n}\n\n/**\n * Save configuration to file.\n * Creates directory if it doesn't exist.\n */\nexport function saveConfig(config: PkgOpsConfig): void {\n const configPath = getConfigPath();\n ensureConfigDir();\n\n const content = JSON.stringify(config, null, 2);\n writeFileSync(configPath, content, {\n encoding: \"utf-8\",\n mode: constants.S_IRUSR | constants.S_IWUSR | constants.S_IRGRP,\n });\n}\n\n/**\n * Update a package in the config.\n */\nexport function updatePackageConfig(\n packageName: string,\n packageConfig: PackageConfig\n): PkgOpsConfig {\n const config = loadConfig();\n config.packages[packageName] = packageConfig;\n saveConfig(config);\n return config;\n}\n\n/**\n * Remove a package from the config.\n */\nexport function removePackageConfig(packageName: string): PkgOpsConfig {\n const config = loadConfig();\n delete config.packages[packageName];\n saveConfig(config);\n return config;\n}\n\n/**\n * Get a specific package config.\n */\nexport function getPackageConfig(packageName: string): PackageConfig | undefined {\n const config = loadConfig();\n return config.packages[packageName];\n}\n\n/**\n * List all managed packages.\n */\nexport function listManagedPackages(): Array<{ name: string; config: PackageConfig }> {\n const config = loadConfig();\n return Object.entries(config.packages).map(([name, cfg]) => ({ name, config: cfg }));\n}\n\n/**\n * Validate package name (must be @ebowwa/* scope).\n */\nexport function isValidPackageName(name: string): boolean {\n return name.startsWith(\"@ebowwa/\");\n}\n\n/**\n * Parse package specifier into name and version.\n * @example\n * parsePackageSpec(\"@ebowwa/stack@0.7.12\") => { name: \"@ebowwa/stack\", version: \"0.7.12\" }\n * parsePackageSpec(\"@ebowwa/stack\") => { name: \"@ebowwa/stack\", version: \"latest\" }\n */\nexport function parsePackageSpec(spec: string): { name: string; version: string } {\n const atIndex = spec.lastIndexOf(\"@\");\n if (atIndex <= 0) {\n // No version specified or scoped package without version\n return { name: spec, version: \"latest\" };\n }\n\n const name = spec.slice(0, atIndex);\n const version = spec.slice(atIndex + 1);\n\n if (!version) {\n return { name, version: \"latest\" };\n }\n\n return { name, version };\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "95DFB12A97BB4D2664756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -858,3 +858,54 @@ main().catch((error) => {
|
|
|
858
858
|
console.error("Fatal error:", error);
|
|
859
859
|
process.exit(1);
|
|
860
860
|
});
|
|
861
|
+
|
|
862
|
+
// ---------------------------------------------------------------------------
|
|
863
|
+
// Re-exports for library usage
|
|
864
|
+
// ---------------------------------------------------------------------------
|
|
865
|
+
|
|
866
|
+
export {
|
|
867
|
+
loadConfig,
|
|
868
|
+
saveConfig,
|
|
869
|
+
parsePackageSpec,
|
|
870
|
+
isValidPackageName,
|
|
871
|
+
getPackageConfig,
|
|
872
|
+
updatePackageConfig,
|
|
873
|
+
removePackageConfig,
|
|
874
|
+
listManagedPackages,
|
|
875
|
+
getConfigPath,
|
|
876
|
+
ensureConfigDir,
|
|
877
|
+
type PackageConfig,
|
|
878
|
+
type PkgOpsConfig,
|
|
879
|
+
} from "./config.js";
|
|
880
|
+
|
|
881
|
+
export {
|
|
882
|
+
ServiceManager,
|
|
883
|
+
getServiceManager,
|
|
884
|
+
type ServiceInfo,
|
|
885
|
+
type ServiceLogsOptions,
|
|
886
|
+
} from "./service-manager.js";
|
|
887
|
+
|
|
888
|
+
export {
|
|
889
|
+
RustBridge,
|
|
890
|
+
startBridge,
|
|
891
|
+
stopBridge,
|
|
892
|
+
getBridge,
|
|
893
|
+
type InstallResult,
|
|
894
|
+
type PackageInfo,
|
|
895
|
+
type RollbackResult,
|
|
896
|
+
type VerifyResult,
|
|
897
|
+
type AuditResult,
|
|
898
|
+
type BundleSize,
|
|
899
|
+
type InstalledPackageInfo,
|
|
900
|
+
} from "./bridge.js";
|
|
901
|
+
|
|
902
|
+
export {
|
|
903
|
+
startHealthServer,
|
|
904
|
+
stopHealthServer,
|
|
905
|
+
getHealthServer,
|
|
906
|
+
HealthServer,
|
|
907
|
+
type HealthCheckResult,
|
|
908
|
+
type ServiceHealth,
|
|
909
|
+
type SystemHealth,
|
|
910
|
+
} from "./health-server.js";
|
|
911
|
+
|