Skip to content

Commit 1d8f8ea

Browse files
committed
update interactive / props
1 parent eabe245 commit 1d8f8ea

File tree

5 files changed

+138
-57
lines changed

5 files changed

+138
-57
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/gogrlx/grlx/v2
22

3-
go 1.24.2
3+
go 1.24.3
44

55
replace github.com/mattn/go-localereader v0.0.1 => github.com/taigrr/go-localereader v0.0.2
66

go.sum

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
1-
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
2-
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
31
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
42
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
3+
github.com/antithesishq/antithesis-sdk-go v0.4.3-default-no-op h1:+OSa/t11TFhqfrX0EOSqQBDJ0YlpmK0rDSiB19dg9M0=
4+
github.com/antithesishq/antithesis-sdk-go v0.4.3-default-no-op/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E=
55
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
66
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
77
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
88
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
9-
github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
10-
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
119
github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs=
1210
github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
13-
github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY=
14-
github.com/charmbracelet/bubbletea v1.3.3/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
1511
github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
1612
github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
1713
github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40=
1814
github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0=
19-
github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=
20-
github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo=
2115
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
2216
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
2317
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
@@ -26,7 +20,6 @@ github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ
2620
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
2721
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
2822
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
29-
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
3023
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
3124
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
3225
github.com/djherbis/atime v1.1.0 h1:rgwVbP/5by8BvvjBNrbh64Qz33idKT3pSnMSJsxhi0g=
@@ -45,8 +38,6 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN
4538
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
4639
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
4740
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
48-
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
49-
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
5041
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
5142
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
5243
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -67,24 +58,14 @@ github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D
6758
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
6859
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
6960
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
70-
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
71-
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
7261
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
7362
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
74-
github.com/nats-io/jwt/v2 v2.7.3 h1:6bNPK+FXgBeAqdj4cYQ0F8ViHRbi7woQLq4W29nUAzE=
75-
github.com/nats-io/jwt/v2 v2.7.3/go.mod h1:GvkcbHhKquj3pkioy5put1wvPxs78UlZ7D/pY+BgZk4=
7663
github.com/nats-io/jwt/v2 v2.7.4 h1:jXFuDDxs/GQjGDZGhNgH4tXzSUK6WQi2rsj4xmsNOtI=
7764
github.com/nats-io/jwt/v2 v2.7.4/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA=
78-
github.com/nats-io/nats-server/v2 v2.10.25 h1:J0GWLDDXo5HId7ti/lTmBfs+lzhmu8RPkoKl0eSCqwc=
79-
github.com/nats-io/nats-server/v2 v2.10.25/go.mod h1:/YYYQO7cuoOBt+A7/8cVjuhWTaTUEAlZbJT+3sMAfFU=
8065
github.com/nats-io/nats-server/v2 v2.11.2 h1:k5KBAuRpJW9qAF11Io2txNhR5m1KUmqVkalLAw2yLfk=
8166
github.com/nats-io/nats-server/v2 v2.11.2/go.mod h1:6Z6Fd+JgckqzKig7DYwhgrE7bJ6fypPHnGPND+DqgMY=
82-
github.com/nats-io/nats.go v1.39.0 h1:2/yg2JQjiYYKLwDuBzV0FbB2sIV+eFNkEevlRi4n9lI=
83-
github.com/nats-io/nats.go v1.39.0/go.mod h1:MgRb8oOdigA6cYpEPhXJuRVH6UE/V4jblJ2jQ27IXYM=
8467
github.com/nats-io/nats.go v1.41.2 h1:5UkfLAtu/036s99AhFRlyNDI1Ieylb36qbGjJzHixos=
8568
github.com/nats-io/nats.go v1.41.2/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g=
86-
github.com/nats-io/nkeys v0.4.10 h1:glmRrpCmYLHByYcePvnTBEAwawwapjCPMjy2huw20wc=
87-
github.com/nats-io/nkeys v0.4.10/go.mod h1:OjRrnIKnWBFl+s4YK5ChQfvHP2fxqZexrKJoVVyWB3U=
8869
github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0=
8970
github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE=
9071
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
@@ -96,11 +77,8 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
9677
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
9778
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
9879
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
99-
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
100-
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
10180
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
10281
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
103-
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
10482
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
10583
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
10684
github.com/taigrr/go-localereader v0.0.2 h1:aJoFCjlEAfmR1A2bajqV7WFyipxhE7kNzyCd4K4qM94=
@@ -113,27 +91,19 @@ github.com/taigrr/systemctl v1.0.9 h1:ASwTPXB5vcfOzG2pZk34ossJrWvVOFAjk/0AcroOnN
11391
github.com/taigrr/systemctl v1.0.9/go.mod h1:TpeHkNuHgYT63FI5jVLBf5VNAGbxEFH3FHqg5ReXnd0=
11492
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
11593
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
116-
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
117-
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
11894
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
11995
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
120-
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
121-
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
96+
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E=
97+
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
12298
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
12399
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
124100
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
125101
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
126102
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
127-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
128-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
129103
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
130104
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
131-
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
132-
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
133105
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
134106
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
135-
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
136-
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
137107
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
138108
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
139109
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

props/interactive.go

Lines changed: 119 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,131 @@
11
package props
22

33
import (
4-
"sync"
4+
"bytes"
5+
"context"
6+
"encoding/json"
7+
"fmt"
8+
"io"
9+
"math"
10+
"os"
11+
"os/exec"
12+
"os/user"
13+
"runtime"
14+
"strconv"
15+
"syscall"
16+
"time"
517

618
nats "github.com/nats-io/nats.go"
7-
)
19+
"github.com/taigrr/log-socket/log"
820

9-
var (
10-
nc *nats.Conn
11-
envMutex sync.Mutex
21+
"github.com/gogrlx/grlx/v2/types"
1222
)
1323

24+
var nc *nats.Conn
25+
1426
func RegisterNatsConn(conn *nats.Conn) {
1527
nc = conn
1628
}
1729

18-
// TODO: finalize and export this function
19-
//func FGet(target types.KeyManager, cmdRun types.CmdRun) (types.CmdRun, error) {
20-
// topic := "grlx.sprouts." + target.SproutID + ".props.get"
21-
// var results types.CmdRun
22-
// err := ec.Request(topic, cmdRun, &results, time.Second*15+cmdRun.Timeout)
23-
// return results, err
24-
//}
25-
26-
// TODO: finalize and export this function
27-
//func SRun(cmd types.CmdRun) (types.CmdRun, error) {
28-
// return FGet(cmd.Target, cmd)
29-
//}
30+
func FCache(target types.KeyManager, cmdRun types.CmdRun) (types.CmdRun, error) {
31+
topic := "grlx.sprouts." + target.SproutID + ".props.cache"
32+
var results types.CmdRun
33+
b, _ := json.Marshal(cmdRun)
34+
msg, err := nc.Request(topic, b, time.Second*15+cmdRun.Timeout)
35+
if err != nil {
36+
return results, err
37+
}
38+
err = json.Unmarshal(msg.Data, &results)
39+
return results, err
40+
}
41+
42+
func FGet(target types.KeyManager, cmdRun types.CmdRun) (types.CmdRun, error) {
43+
topic := "grlx.sprouts." + target.SproutID + ".props.get"
44+
var results types.CmdRun
45+
b, _ := json.Marshal(cmdRun)
46+
msg, err := nc.Request(topic, b, time.Second*15+cmdRun.Timeout)
47+
if err != nil {
48+
return results, err
49+
}
50+
err = json.Unmarshal(msg.Data, &results)
51+
return results, err
52+
}
53+
54+
func FSet(target types.KeyManager, cmdRun types.CmdRun) (types.CmdRun, error) {
55+
topic := "grlx.sprouts." + target.SproutID + ".props.set"
56+
var results types.CmdRun
57+
b, _ := json.Marshal(cmdRun)
58+
msg, err := nc.Request(topic, b, time.Second*15+cmdRun.Timeout)
59+
if err != nil {
60+
return results, err
61+
}
62+
err = json.Unmarshal(msg.Data, &results)
63+
return results, err
64+
}
65+
66+
func SRun(cmd types.CmdRun) (types.CmdRun, error) {
67+
ctx, cancel := context.WithTimeout(context.Background(), cmd.Timeout)
68+
defer cancel()
69+
envMutex.Lock()
70+
osPath := os.Getenv("PATH")
71+
newPath := ""
72+
if val, ok := cmd.Env["PATH"]; cmd.Path == "" && (!ok || (ok && val == "")) {
73+
_, err := exec.LookPath(cmd.Command)
74+
if err != nil {
75+
envMutex.Unlock()
76+
cmd.Error = err
77+
return cmd, err
78+
}
79+
} else {
80+
if cmd.Path != "" {
81+
newPath += cmd.Path + string(os.PathListSeparator)
82+
}
83+
if ok && val != "" {
84+
newPath += val + string(os.PathListSeparator)
85+
}
86+
}
87+
os.Setenv("PATH", newPath+osPath)
88+
command := exec.CommandContext(ctx, cmd.Command, cmd.Args...)
89+
os.Setenv("PATH", osPath)
90+
env := os.Environ()
91+
envMutex.Unlock()
92+
for key, val := range cmd.Env {
93+
env = append(env, key+"="+val)
94+
}
95+
command.Env = env
96+
97+
var uid uint32
98+
// TODO fix for windows support
99+
if cmd.RunAs != "" && runtime.GOOS != "windows" {
100+
u, err := user.Lookup(cmd.RunAs)
101+
if err != nil {
102+
return cmd, err
103+
}
104+
uid64, err := strconv.Atoi(u.Uid)
105+
if err != nil {
106+
return cmd, err
107+
}
108+
if uid64 > math.MaxInt32 {
109+
return cmd, fmt.Errorf("UID %d is invalid", uid64)
110+
}
111+
uid = uint32(uid64)
112+
command.SysProcAttr = &syscall.SysProcAttr{}
113+
command.SysProcAttr.Credential = &syscall.Credential{Uid: uid}
114+
}
115+
command.Dir = cmd.CWD
116+
117+
// TODO replace os.Stdout/err here with writes to websocket to get live returnable data
118+
var stdoutBuf, stderrBuf bytes.Buffer
119+
command.Stdout = io.MultiWriter(&stdoutBuf) //, os.Stdout)
120+
command.Stderr = io.MultiWriter(&stderrBuf) //, os.Stderr)
121+
timer := time.Now()
122+
err := command.Run()
123+
cmd.Duration = time.Since(timer)
124+
if err != nil {
125+
log.Errorf("cmd.Run() failed with %s\n", err)
126+
}
127+
cmd.Stdout = stdoutBuf.String()
128+
cmd.Stderr = stderrBuf.String()
129+
cmd.ErrCode = command.ProcessState.ExitCode()
130+
return cmd, err
131+
}

props/props_sprout.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@ import (
88
"github.com/gogrlx/grlx/v2/pki"
99
)
1010

11+
const propFile = "/var/grlx/props"
12+
1113
var propFileLock sync.Mutex
1214

1315
// TODO: finalize and export this function
1416

15-
func saveToDiskFunc() error {
17+
func SaveToDisk() error {
1618
propFileLock.Lock()
1719
defer propFileLock.Unlock()
1820
return saveToDisk()
1921
}
2022

2123
func saveToDisk() error {
2224
// save to disk
23-
f, err := os.Create("/etc/grlx/props")
25+
f, err := os.Create(propFile)
2426
if err != nil {
2527
return err
2628
}
@@ -43,9 +45,9 @@ func loadFromDiskFunc() error {
4345

4446
func loadFromDisk() error {
4547
// load from disk
46-
_, err := os.Stat("/etc/grlx/props")
48+
_, err := os.Stat(propFile)
4749
if os.IsNotExist(err) {
48-
_, err := os.Create("/etc/grlx/props")
50+
_, err := os.Create(propFile)
4951
if err != nil {
5052
return err
5153
}
@@ -56,7 +58,7 @@ func loadFromDisk() error {
5658
if err != nil {
5759
return err
5860
}
59-
f, err := os.Open("/etc/grlx/props")
61+
f, err := os.Open(propFile)
6062
if err != nil {
6163
return err
6264
}

types/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,13 @@ type (
223223

224224
Error error `json:"error"`
225225
}
226+
PropsGet struct {
227+
Key string `json:"key"`
228+
}
229+
PropsSet struct {
230+
Key string `json:"key"`
231+
Value any `json:"value"`
232+
}
226233

227234
EnvVar map[string]string
228235

0 commit comments

Comments
 (0)