Skip to content

Commit c808510

Browse files
committed
Use better ipc response/request types, send SIGTERM not SIGKILL to procs and print PID for ps
1 parent b2e8efa commit c808510

File tree

5 files changed

+53
-68
lines changed

5 files changed

+53
-68
lines changed

internal/daemon/daemon.go

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -116,39 +116,27 @@ func (d *Daemon) handleIpcConn(conn net.Conn) {
116116
rsp := ipc.Response{}
117117
switch req.Op {
118118
case ipc.OpPs:
119-
rsp.Data = d.ptable.Ps()
119+
rsp.Ps = d.ptable.Ps()
120120
case ipc.OpStop:
121-
names, ok := req.Data.([]any)
122-
if !ok {
123-
rsp.Err = "not a []any"
121+
if len(req.Names) == 0 {
122+
d.ptable.StopAll()
124123
} else {
125-
if len(names) == 0 {
126-
d.ptable.StopAll()
127-
} else {
128-
for _, v := range names {
129-
name, _ := v.(string)
130-
if err := d.ptable.Stop(name); err != nil {
131-
rsp.Err = err.Error()
132-
}
124+
for _, name := range req.Names {
125+
if err := d.ptable.Stop(name); err != nil {
126+
rsp.Err = err.Error()
133127
}
134128
}
135129
}
136130
case ipc.OpStart:
137-
names, ok := req.Data.([]any)
138-
if !ok {
139-
rsp.Err = "not a []any"
131+
if len(req.Names) == 0 {
132+
if err := d.ptable.StartAll(); err != nil {
133+
rsp.Err = err.Error()
134+
}
140135
} else {
141-
if len(names) == 0 {
142-
if err := d.ptable.StartAll(); err != nil {
136+
for _, name := range req.Names {
137+
if err := d.ptable.Start(name); err != nil {
143138
rsp.Err = err.Error()
144139
}
145-
} else {
146-
for _, v := range names {
147-
name, _ := v.(string)
148-
if err := d.ptable.Start(name); err != nil {
149-
rsp.Err = err.Error()
150-
}
151-
}
152140
}
153141
}
154142
default:

internal/ipc/ipc.go

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,22 @@ func (op Op) String() string {
3232
}
3333

3434
type Request struct {
35-
Op Op
36-
Data any `json:",omitempty"`
35+
Op Op
36+
37+
// for start/stop
38+
Names []string `json:",omitempty"`
3739
}
3840

3941
type Response struct {
40-
Err string
41-
Data any `json:",omitempty"`
42+
Err string
43+
44+
// for ps
45+
Ps []PsResult `json:",omitempty"`
4246
}
4347

4448
type PsResult struct {
4549
Name string
50+
Pid int
4651
Status string
4752
}
4853

@@ -54,25 +59,11 @@ func Ps() ([]PsResult, error) {
5459
if rsp.Err != "" {
5560
return nil, errors.New(rsp.Err)
5661
}
57-
data, ok := rsp.Data.([]any)
58-
if !ok {
59-
return nil, errors.New("response data is not a slice")
60-
}
61-
res := make([]PsResult, 0, len(data))
62-
for _, v := range data {
63-
vv, _ := v.(map[string]any)
64-
name, _ := vv["Name"].(string)
65-
status, _ := vv["Status"].(string)
66-
res = append(res, PsResult{
67-
Name: name,
68-
Status: status,
69-
})
70-
}
71-
return res, nil
62+
return rsp.Ps, nil
7263
}
7364

7465
func Stop(names ...string) error {
75-
rsp, err := execRequest(Request{Op: OpStop, Data: names})
66+
rsp, err := execRequest(Request{Op: OpStop, Names: names})
7667
if err != nil {
7768
return err
7869
}
@@ -83,7 +74,7 @@ func Stop(names ...string) error {
8374
}
8475

8576
func Start(names ...string) error {
86-
rsp, err := execRequest(Request{Op: OpStart, Data: names})
77+
rsp, err := execRequest(Request{Op: OpStart, Names: names})
8778
if err != nil {
8879
return err
8980
}

internal/ipc/ipc_test.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,6 @@ func TestPs(t *testing.T) {
7777
}
7878
})
7979

80-
t.Run("RspWithWrongDataType", func(t *testing.T) {
81-
started := make(chan struct{})
82-
done := make(chan struct{})
83-
84-
go fakeDaemon(started, done, Response{Data: "dummy"})
85-
86-
<-started
87-
defer func() { <-done }()
88-
89-
if _, err := Ps(); err == nil {
90-
t.Fatal("expected error")
91-
}
92-
})
93-
9480
t.Run("Ok", func(t *testing.T) {
9581
started := make(chan struct{})
9682
done := make(chan struct{})
@@ -100,7 +86,7 @@ func TestPs(t *testing.T) {
10086
{Name: "b", Status: "y"},
10187
}
10288

103-
go fakeDaemon(started, done, Response{Data: expected})
89+
go fakeDaemon(started, done, Response{Ps: expected})
10490

10591
<-started
10692
defer func() { <-done }()
@@ -115,8 +101,8 @@ func TestPs(t *testing.T) {
115101
return fmt.Errorf("different len: %d %d", len(result), len(expected))
116102
}
117103
for i := range result {
118-
if result[i] != expected[i] {
119-
return fmt.Errorf("different element at index %d: %s %s", i, result[i], expected[i])
104+
if err := psResultEqual(result[i], expected[i]); err != nil {
105+
return fmt.Errorf("different element at index %d: %w", i, err)
120106
}
121107
}
122108
return nil
@@ -128,6 +114,19 @@ func TestPs(t *testing.T) {
128114
})
129115
}
130116

117+
func psResultEqual(l, r PsResult) error {
118+
if l.Name != r.Name {
119+
return fmt.Errorf("different name: %s %s", l.Name, r.Name)
120+
}
121+
if l.Status != r.Status {
122+
return fmt.Errorf("different status: %s %s", l.Status, r.Status)
123+
}
124+
if l.Pid != r.Pid {
125+
return fmt.Errorf("different pid: %d %d", l.Pid, r.Pid)
126+
}
127+
return nil
128+
}
129+
131130
func TestStop(t *testing.T) {
132131
started := make(chan struct{})
133132
done := make(chan struct{})

internal/process/process.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,23 @@ type Process struct {
4848
}
4949

5050
func (p *Process) UpdateState() {
51+
p.State = Failed
5152
if p.Cmd == nil {
5253
return
5354
}
5455
if p.Cmd.ProcessState == nil {
5556
return
5657
}
5758
ps := p.Cmd.ProcessState
58-
p.State = Failed
59+
p.Cmd = nil
5960
if ps.Success() {
6061
p.State = Finished
6162
return
6263
}
6364
ws, _ := ps.Sys().(syscall.WaitStatus)
6465
if ws.Signaled() {
6566
sig := ws.Signal()
66-
if sig == syscall.SIGTERM || sig == syscall.SIGINT {
67+
if sig == syscall.SIGTERM || sig == syscall.SIGINT || sig == syscall.SIGKILL {
6768
p.State = Stopped
6869
}
6970
}
@@ -76,9 +77,10 @@ func (p *Process) Stop() {
7677
if p.State != Running {
7778
return
7879
}
79-
if err := p.Cmd.Process.Kill(); err != nil {
80+
if err := p.Cmd.Process.Signal(syscall.SIGTERM); err != nil {
8081
fmt.Printf("[daemon] failed to kill [%s]: %v\n", p.Name, err)
8182
}
83+
// TODO: this may not actually kill it => wait to see if it stopped then send SIGKILL
8284
}
8385

8486
type Table struct {
@@ -213,9 +215,14 @@ func (t *Table) Ps() []ipc.PsResult {
213215
defer t.mu.Unlock()
214216
var result []ipc.PsResult
215217
for _, p := range t.procs {
218+
pid := -1
219+
if p.Cmd != nil && p.Cmd.Process != nil {
220+
pid = p.Cmd.Process.Pid
221+
}
216222
result = append(result, ipc.PsResult{
217223
Name: p.Name,
218224
Status: p.State.String(),
225+
Pid: pid,
219226
})
220227
}
221228
return result

main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,11 @@ Options:
144144
w := tabwriter.NewWriter(os.Stdout, 0, 4, 2, ' ', 0)
145145
defer w.Flush()
146146

147-
fmt.Fprintf(w, "Name\tStatus\n")
148-
fmt.Fprintf(w, "----\t-------\n")
147+
fmt.Fprintf(w, "Name\tPID\tStatus\n")
148+
fmt.Fprintf(w, "----\t---\t-------\n")
149149

150150
for _, s := range services {
151-
fmt.Fprintf(w, "%s\t%s\n", s.Name, s.Status)
151+
fmt.Fprintf(w, "%s\t%d\t%s\n", s.Name, s.Pid, s.Status)
152152
}
153153

154154
return nil

0 commit comments

Comments
 (0)