@dmgnr/kuber 2.3.3 → 2.3.4
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.js +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -953,6 +953,6 @@ Headers: `+JSON.stringify(Q));this.code=$,this.body=K,this.headers=Q}}class Z${c
|
|
|
953
953
|
`)}var La=F$({meta:{name:"ls",description:"List operations"},args:{workspace:{type:"string",alias:"w",description:"Filter by workspace"}},async run({args:$}){console.log(await Ia($.workspace??$._[0]))}}),ja=F$({meta:{name:"get",description:"Get an operation"},async run({args:$}){let X=String($._[0]??"").trim();if(!X)throw Error("Operation ID is required");console.log(await Ea(X))}}),RM=F$({meta:{name:"operations",description:"Inspect server operations"},subCommands:{get:ja,ls:La}});var N4={reset:"\x1B[0m",fgBlack:"\x1B[30m",fgBlue:"\x1B[34m",fgPurple:"\x1B[35m",fgYellow:"\x1B[33m",fgGreen:"\x1B[32m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgRed:"\x1B[41m"};function Pa($){return`${$.level==="good"?N4.bgGreen:$.level==="bad"?N4.bgRed:N4.bgYellow}${N4.fgBlack} ${$.label} ${N4.reset}`}function ka($){let X=$.split("/",1)[0],K=X==="Deployment"?N4.fgBlue:X==="Service"?N4.fgPurple:X==="Ingress"?N4.fgYellow:X==="Pod"?N4.fgGreen:void 0;return K?`${K}${$}${N4.reset}`:$}function AM($){let X=[],K=(Q,G,Y)=>{X.push(`${G}${Y?"\u2514\u2500 ":"\u251C\u2500 "}${ka(Q.id)} ${Pa(Q.status)}`);let Z=G+(Y?" ":"\u2502 ");Q.children.forEach((J,U)=>{K(J,Z,U===Q.children.length-1)})};for(let Q of $)X.push(Q.namespace),Q.roots.forEach((G,Y)=>{K(G,"",Y===Q.roots.length-1)}),X.push("");return X.join(`
|
|
954
954
|
`)}async function Ta($,X=!1,K=W$){let Q=X?"?includeIdle=true":"",G=await K(`/workspaces/${encodeURIComponent($)}/status${Q}`);return AM(G)}var gM=F$({meta:{name:"ps",description:"List deployments"},args:{all:{type:"boolean",alias:"a",description:"Show all stopped deployments (including those created by the run command)"}},async run({args:{all:$}}){console.log(await Ta(A$().project,$))}});function Ra($,X,K=W$){return K(`/workspaces/${encodeURIComponent($)}/lifecycle`,{method:"POST",json:{action:"restart",...X&&{services:[X]}}})}var _M=F$({meta:{name:"restart",description:"Roll out a restart for managed deployments"},args:{deployment:{type:"positional",description:"Deployment name to restart (defaults to all managed)",required:!1}},async run({args:$}){await new V6([{title:"Restart deployments",task:async(X,K)=>{let{deployments:Q}=await Ra(A$().project,$.deployment);K.output=`${Q.length} deployments queued`}}]).run()}});function Aa($,X,K,Q=W$){return Q(`/workspaces/${encodeURIComponent($)}/rollback`,{method:"POST",json:{...X&&{services:[X]},timeoutMs:K}})}var SM=F$({meta:{name:"rollback",description:"Roll deployments back to the previous release",alias:"fuck"},args:{deployment:{type:"positional",description:"Deployment name to roll back (defaults to all managed)",required:!1}},async run({args:$}){let{project:X,config:K}=A$(),Q=[];if(await new V6([{title:"Roll back deployments",task:async(G,Y)=>{({deployments:Q}=await Aa(X,$.deployment,K.rolloutTimeoutMs)),Y.output=`${Q.length} deployment${Q.length===1?"":"s"} queued`}}]).run(),Q.length===0)if($.deployment)console.log(`${$.deployment} has no previous release to roll back to`);else console.log("No deployments have a previous release to roll back to")}});var ga="http://garage-ui.garage-system.svc.cluster.local";function _a($,X,K=W$){return K(`/workspaces/${encodeURIComponent($)}/storage/credentials`,{method:"POST",json:{claim:X}})}function Sa($){return`${ga}/buckets/${encodeURIComponent($)}/objects`}async function qM($){let X=hF(await A$().compose()).find((K)=>K.service===$);if(!X)throw Error(`Service ${$} does not declare a managed S3 volume.`);return X}var qa=F$({meta:{name:"ls",description:"List managed S3 claims"},async run(){let $=hF(await A$().compose());if($.length===0){console.log("No managed S3 volumes declared");return}console.log(M6($.map((X)=>({service:X.service,key:X.key,bucket:X.bucket}))))}}),ba=F$({meta:{name:"creds",description:"Print S3 environment variables for a service"},async run({args:$}){let X=$._[0];if(!X)throw Error("Service name is required");let K=await _a(A$().project,await qM(X));for(let[Q,G]of Object.entries(K))console.log(`${Q}=${G}`)}}),Ma=F$({meta:{name:"ui",description:"Print the Garage UI URL for a service bucket"},async run({args:$}){let X=$._[0];if(!X)throw Error("Service name is required");console.log(Sa((await qM(X)).bucket))}}),bM=F$({meta:{name:"s3",description:"Inspect managed S3 storage"},subCommands:{creds:ba,ls:qa,ui:Ma}});var MM=F$({meta:{name:"start",description:"Start deployments without rebuilding images"},async run(){await wN(!1)}});function xa($,X=W$){return X(`/workspaces/${encodeURIComponent($)}/lifecycle`,{method:"POST",json:{action:"stop"}})}var xM=F$({meta:{name:"stop",description:"Scale managed deployments to zero"},async run(){await new V6([{title:"Scale deployments",task:async($,X)=>{let{deployments:K}=await xa(A$().project);X.output=`${K.length} deployments queued`}}]).run()}});import{stdin as H4,stdout as RP}from"process";import{createInterface as Ca}from"readline/promises";function g4($){let X=String($??"").trim();if(!X)throw Error("Username is required");return X}function VM($){let X=String($??"").split(",").map((Q)=>Q.trim()).filter(Boolean);if(X.length===0)throw Error("At least one role is required (for example: --roles admin)");let K=X.find((Q)=>!["viewer","operator","admin"].includes(Q));if(K)throw Error(`Unknown role: ${K}`);return[...new Set(X)]}function Va($){let X=String($??"").split(",").map((Q)=>Q.trim()).filter(Boolean),K=new Set(["kubernetes:read","kubernetes:write","kubernetes:exec","users:read","users:write","sessions:revoke","platform:adopt"]);if(!X.length||X.some((Q)=>!K.has(Q)))throw Error("Provide at least one valid capability");return[...new Set(X)]}function AP($){if($.length===0)return"No users";return M6($.map((X)=>({username:X.username,roles:X.roles.join(","),disabled:X.disabled?"yes":"no",updated:X.updatedAt})))}async function fM($="Password: "){if(!H4.isTTY||!H4.setRawMode)throw Error("Password input requires an interactive terminal");return RP.write($),H4.setRawMode(!0),H4.resume(),new Promise((X,K)=>{let Q="",G=()=>{H4.off("data",Z),H4.setRawMode(!1),H4.pause(),RP.write(`
|
|
955
955
|
`)},Y=(J)=>{if(G(),J)K(J);else if(!Q)K(Error("Password is required"));else X(Q)},Z=(J)=>{for(let U of J.toString()){if(U==="\x03"||U==="\x04"){Y(Error("Password input cancelled"));return}if(U==="\r"||U===`
|
|
956
|
-
`){Y();return}if(U==="\x7F"||U==="\b")Q=Q.slice(0,-1);else Q+=U}};H4.on("data",Z)})}async function yM($){if(!H4.isTTY)throw Error("Confirmation requires an interactive terminal; use --yes");let X=Ca({input:H4,output:RP});try{return(await X.question(`Delete user '${$}'? [y/N] `)).trim().toLowerCase()==="y"}finally{X.close()}}async function fa($=W$){let X=await $("/users");return AP(X.items)}async function ya($,X,K,Q=W$){let Y=await Q("/users",{method:"POST",json:{username:$,password:X,roles:K}});return AP([Y])}async function hM($,X,K=W$){if(Object.keys(X).length===0)throw Error("No user updates specified");let Q=await K(`/users/${encodeURIComponent($)}`,{method:"PATCH",json:X});return AP([Q])}function ha($,X,K=W$){return hM($,{disabled:X},K)}async function la($,X,K=W$){if(!X)return"Deletion cancelled";return await K(`/users/${encodeURIComponent($)}`,{method:"DELETE"}),`Deleted user ${$}`}async function ca($,X=W$){let K=await X(`/users/${encodeURIComponent($)}/sessions/revoke`,{method:"POST"});return`Revoked ${K.revoked} session${K.revoked===1?"":"s"} for ${K.username}`}function lM($){if(!$.length)return"No API keys";return M6($.map((X)=>({id:X.id,capabilities:X.capabilities.join(","),workspace:X.workspace??"",expires:X.expiresAt,disabled:X.disabled?"yes":"no"})))}async function da($,X=W$){let K=await X(`/users/${encodeURIComponent($)}/keys`);return lM(K.items)}async function ia($,X,K=W$){return K(`/users/${encodeURIComponent($)}/keys`,{method:"POST",json:X})}async function ua($,X,K,Q=W$){if(!K)return"API key revocation cancelled";return await Q(`/users/${encodeURIComponent($)}/keys/${encodeURIComponent(X)}`,{method:"DELETE"}),`Revoked API key ${X} for ${$}`}var ma=F$({meta:{name:"ls",description:"List users"},async run(){console.log(await fa())}}),ta=F$({meta:{name:"add",description:"Add a user"},args:{roles:{type:"string",description:"Comma-separated roles"}},async run({args:$}){let X=g4($._[0]);console.log(await ya(X,await fM(),VM($.roles)))}}),na=F$({meta:{name:"update",description:"Update a user's roles or password"},args:{roles:{type:"string",description:"Comma-separated roles"},password:{type:"boolean",description:"Prompt for a new password"}},async run({args:$}){let X=g4($._[0]),K={};if($.roles!==void 0)K.roles=VM($.roles);if($.password)K.password=await fM("New password: ");console.log(await hM(X,K))}});function CM($,X){return F$({meta:{name:$,description:`${X?"Disable":"Enable"} a user`},async run({args:K}){console.log(await ha(g4(K._[0]),X))}})}var pa=F$({meta:{name:"delete",description:"Delete a user"},args:{yes:{type:"boolean",alias:"y",description:"Delete without confirmation"}},async run({args:$}){let X=g4($._[0]),K=Boolean($.yes)||await yM(X);console.log(await la(X,K))}}),oa=F$({meta:{name:"revoke",description:"Revoke all sessions for a user"},async run({args:$}){console.log(await ca(g4($._[0])))}}),ra=F$({meta:{name:"keys",description:"Manage user API keys"},subCommands:{ls:F$({meta:{name:"ls",description:"List a user's API keys"},async run({args:$}){console.log(await da(g4($._[0])))}}),create:F$({meta:{name:"create",description:"Create an API key"},args:{capabilities:{type:"string",required:!0,description:"Comma-separated capabilities"},workspace:{type:"string",description:"Restrict the key to a workspace"},expiresDays:{type:"string",default:"90",description:"Expiry in days (1-365)"}},async run({args:$}){let X=Number($.expiresDays);if(!Number.isSafeInteger(X)||X<1||X>365)throw Error("--expires-days must be an integer from 1 to 365");let K=await ia(g4($._[0]),{capabilities:Va($.capabilities),...$.workspace&&{workspace:$.workspace},expiresAt:new Date(Date.now()+X*24*60*60*1000).toISOString()});console.log("Store this API key securely now. It will not be shown again:"),console.log(K.token),console.log(lM([K]))}}),revoke:F$({meta:{name:"revoke",description:"Revoke an API key"},args:{yes:{type:"boolean",alias:"y",description:"Revoke without confirmation"}},async run({args:$}){let X=g4($._[0]),K=g4($._[1]),Q=Boolean($.yes)||await yM(`API key '${K}' for ${X}`);console.log(await ua(X,K,Q))}})}}),cM=F$({meta:{name:"users",description:"Administer users"},subCommands:{add:ta,delete:pa,disable:CM("disable",!0),enable:CM("enable",!1),keys:ra,ls:ma,revoke:oa,update:na}});function _P($){return`/workspaces/${encodeURIComponent($)}/trust`}async function gP(){let{project:$,cwd:X}=A$();return jU($,X)}async function aa($,X=W$){await X(_P($.project),{method:"POST",json:{fingerprint:$.fingerprint}}),await jE((K)=>[...K.filter((Q)=>Q.project!==$.project||Q.fingerprint!==$.fingerprint),$]),console.log(`Trusted this directory for namespace ${$.project}`)}async function sa($,X=W$){let K=(await EW()).some((Y)=>Y.project===$.project&&Y.fingerprint===$.fingerprint),G=(await X(_P($.project))).fingerprints.includes($.fingerprint);console.log(`Namespace: ${$.project}`),console.log(`Local: ${K?"trusted":"untrusted"}`),console.log(`Server: ${G?"registered":"not registered"}`)}async function ea($,X=W$){let K;try{await X(`${_P($.project)}?fingerprint=${encodeURIComponent($.fingerprint)}`,{method:"DELETE"})}catch(Q){if(!(Q instanceof n6&&Q.status===404))K=Q}if(await jE((Q)=>Q.filter((G)=>G.project!==$.project||G.fingerprint!==$.fingerprint)),K){let Q=K instanceof Error?K.message:String(K);throw Error(`Removed local trust for namespace ${$.project}, but failed to revoke the server registration: ${Q}`,{cause:K})}console.log(`Revoked trust for namespace ${$.project}`)}var dM=F$({meta:{name:"trust",description:"Trust this directory for kuber up"},subCommands:{status:F$({meta:{name:"status",description:"Show local and server trust"},async run(){await sa(await gP())}}),revoke:F$({meta:{name:"revoke",description:"Revoke this directory trust"},async run(){await ea(await gP())}})},async run(){await aa(await gP())}});var KD=F$({meta:{name:"kuber",version:"2.3.
|
|
956
|
+
`){Y();return}if(U==="\x7F"||U==="\b")Q=Q.slice(0,-1);else Q+=U}};H4.on("data",Z)})}async function yM($){if(!H4.isTTY)throw Error("Confirmation requires an interactive terminal; use --yes");let X=Ca({input:H4,output:RP});try{return(await X.question(`Delete user '${$}'? [y/N] `)).trim().toLowerCase()==="y"}finally{X.close()}}async function fa($=W$){let X=await $("/users");return AP(X.items)}async function ya($,X,K,Q=W$){let Y=await Q("/users",{method:"POST",json:{username:$,password:X,roles:K}});return AP([Y])}async function hM($,X,K=W$){if(Object.keys(X).length===0)throw Error("No user updates specified");let Q=await K(`/users/${encodeURIComponent($)}`,{method:"PATCH",json:X});return AP([Q])}function ha($,X,K=W$){return hM($,{disabled:X},K)}async function la($,X,K=W$){if(!X)return"Deletion cancelled";return await K(`/users/${encodeURIComponent($)}`,{method:"DELETE"}),`Deleted user ${$}`}async function ca($,X=W$){let K=await X(`/users/${encodeURIComponent($)}/sessions/revoke`,{method:"POST"});return`Revoked ${K.revoked} session${K.revoked===1?"":"s"} for ${K.username}`}function lM($){if(!$.length)return"No API keys";return M6($.map((X)=>({id:X.id,capabilities:X.capabilities.join(","),workspace:X.workspace??"",expires:X.expiresAt,disabled:X.disabled?"yes":"no"})))}async function da($,X=W$){let K=await X(`/users/${encodeURIComponent($)}/keys`);return lM(K.items)}async function ia($,X,K=W$){return K(`/users/${encodeURIComponent($)}/keys`,{method:"POST",json:X})}async function ua($,X,K,Q=W$){if(!K)return"API key revocation cancelled";return await Q(`/users/${encodeURIComponent($)}/keys/${encodeURIComponent(X)}`,{method:"DELETE"}),`Revoked API key ${X} for ${$}`}var ma=F$({meta:{name:"ls",description:"List users"},async run(){console.log(await fa())}}),ta=F$({meta:{name:"add",description:"Add a user"},args:{roles:{type:"string",description:"Comma-separated roles"}},async run({args:$}){let X=g4($._[0]);console.log(await ya(X,await fM(),VM($.roles)))}}),na=F$({meta:{name:"update",description:"Update a user's roles or password"},args:{roles:{type:"string",description:"Comma-separated roles"},password:{type:"boolean",description:"Prompt for a new password"}},async run({args:$}){let X=g4($._[0]),K={};if($.roles!==void 0)K.roles=VM($.roles);if($.password)K.password=await fM("New password: ");console.log(await hM(X,K))}});function CM($,X){return F$({meta:{name:$,description:`${X?"Disable":"Enable"} a user`},async run({args:K}){console.log(await ha(g4(K._[0]),X))}})}var pa=F$({meta:{name:"delete",description:"Delete a user"},args:{yes:{type:"boolean",alias:"y",description:"Delete without confirmation"}},async run({args:$}){let X=g4($._[0]),K=Boolean($.yes)||await yM(X);console.log(await la(X,K))}}),oa=F$({meta:{name:"revoke",description:"Revoke all sessions for a user"},async run({args:$}){console.log(await ca(g4($._[0])))}}),ra=F$({meta:{name:"keys",description:"Manage user API keys"},subCommands:{ls:F$({meta:{name:"ls",description:"List a user's API keys"},async run({args:$}){console.log(await da(g4($._[0])))}}),create:F$({meta:{name:"create",description:"Create an API key"},args:{capabilities:{type:"string",required:!0,description:"Comma-separated capabilities"},workspace:{type:"string",description:"Restrict the key to a workspace"},expiresDays:{type:"string",default:"90",description:"Expiry in days (1-365)"}},async run({args:$}){let X=Number($.expiresDays);if(!Number.isSafeInteger(X)||X<1||X>365)throw Error("--expires-days must be an integer from 1 to 365");let K=await ia(g4($._[0]),{capabilities:Va($.capabilities),...$.workspace&&{workspace:$.workspace},expiresAt:new Date(Date.now()+X*24*60*60*1000).toISOString()});console.log("Store this API key securely now. It will not be shown again:"),console.log(K.token),console.log(lM([K]))}}),revoke:F$({meta:{name:"revoke",description:"Revoke an API key"},args:{yes:{type:"boolean",alias:"y",description:"Revoke without confirmation"}},async run({args:$}){let X=g4($._[0]),K=g4($._[1]),Q=Boolean($.yes)||await yM(`API key '${K}' for ${X}`);console.log(await ua(X,K,Q))}})}}),cM=F$({meta:{name:"users",description:"Administer users"},subCommands:{add:ta,delete:pa,disable:CM("disable",!0),enable:CM("enable",!1),keys:ra,ls:ma,revoke:oa,update:na}});function _P($){return`/workspaces/${encodeURIComponent($)}/trust`}async function gP(){let{project:$,cwd:X}=A$();return jU($,X)}async function aa($,X=W$){await X(_P($.project),{method:"POST",json:{fingerprint:$.fingerprint}}),await jE((K)=>[...K.filter((Q)=>Q.project!==$.project||Q.fingerprint!==$.fingerprint),$]),console.log(`Trusted this directory for namespace ${$.project}`)}async function sa($,X=W$){let K=(await EW()).some((Y)=>Y.project===$.project&&Y.fingerprint===$.fingerprint),G=(await X(_P($.project))).fingerprints.includes($.fingerprint);console.log(`Namespace: ${$.project}`),console.log(`Local: ${K?"trusted":"untrusted"}`),console.log(`Server: ${G?"registered":"not registered"}`)}async function ea($,X=W$){let K;try{await X(`${_P($.project)}?fingerprint=${encodeURIComponent($.fingerprint)}`,{method:"DELETE"})}catch(Q){if(!(Q instanceof n6&&Q.status===404))K=Q}if(await jE((Q)=>Q.filter((G)=>G.project!==$.project||G.fingerprint!==$.fingerprint)),K){let Q=K instanceof Error?K.message:String(K);throw Error(`Removed local trust for namespace ${$.project}, but failed to revoke the server registration: ${Q}`,{cause:K})}console.log(`Revoked trust for namespace ${$.project}`)}var dM=F$({meta:{name:"trust",description:"Trust this directory for kuber up"},subCommands:{status:F$({meta:{name:"status",description:"Show local and server trust"},async run(){await sa(await gP())}}),revoke:F$({meta:{name:"revoke",description:"Revoke this directory trust"},async run(){await ea(await gP())}})},async run(){await aa(await gP())}});var KD=F$({meta:{name:"kuber",version:"2.3.4",description:"Docker Compose -> K8s translation layer"},args:{config:{type:"string",description:"Path to a kuber configuration file"}},subCommands:{audit:Hk,ci:WM,db:wM,down:OM,export:jM,exec:EM,logs:kM,login:zM,logout:DM,operations:RM,ps:gM,restart:_M,rollback:SM,s3:bM,start:MM,stop:xM,up:HM,users:cM,trust:dM,whoami:vM}}),iM;function uM(){return iM??=mP(KD),iM}var mM=Symbol("wrappedCommand");function SP($){if($ instanceof DI)return BW.prettifyError($);if($ instanceof Error){let X=$.stack?.split(`
|
|
957
957
|
`).slice(0,3).join(`
|
|
958
958
|
`);return X&&X.trim().length>0?X:$.message}try{return JSON.stringify($,null,2)}catch{return String($)}}function $s($){console.error(SP($)),process.exitCode=1}function qP($,X=$s){let K=$;if(K[mM])return;if(K[mM]=!0,$.run){let Q=$.run;$.run=async(...G)=>{try{return await Q(...G)}catch(Y){X(Y)}}}if(!$.subCommands||typeof $.subCommands!=="object")return;for(let Q of Object.values($.subCommands))if(Q&&typeof Q==="object")qP(Q,X)}async function Xs(){await uM(),qP(KD);let $=hP(KD),{configPath:X,rawArgs:K}=zk(process.argv.slice(2)),Q=new Set(["login","logout","whoami"]);if(K[0]&&Q.has(K[0])){await $({rawArgs:K});return}await kR(()=>$({rawArgs:K}),X)}Xs().catch(($)=>{console.error(SP($)),process.exitCode=1});
|