@@ -8,9 +8,12 @@ import (
8
8
"net/http"
9
9
"net/http/pprof"
10
10
"os"
11
+ "path/filepath"
11
12
"time"
12
13
13
14
"github.com/containers/selinuxd/pkg/datastore"
15
+ seiface "github.com/containers/selinuxd/pkg/semodule/interface"
16
+ "github.com/containers/selinuxd/pkg/utils"
14
17
"github.com/go-logr/logr"
15
18
"github.com/gorilla/mux"
16
19
)
@@ -31,12 +34,27 @@ type StatusServerConfig struct {
31
34
type statusServer struct {
32
35
cfg StatusServerConfig
33
36
ds datastore.ReadOnlyDataStore
37
+ sh seiface.Handler
34
38
l logr.Logger
39
+ mPath string
35
40
lst net.Listener
36
41
ready bool
37
42
}
38
43
39
- func initStatusServer (cfg StatusServerConfig , ds datastore.ReadOnlyDataStore , l logr.Logger ) (* statusServer , error ) {
44
+ type policyStatus struct {
45
+ Policy string `json:"-"`
46
+ Status string `json:"status"`
47
+ Message string `json:"msg"`
48
+ Checksum string `json:"-"`
49
+ }
50
+
51
+ func initStatusServer (
52
+ cfg StatusServerConfig ,
53
+ ds datastore.ReadOnlyDataStore ,
54
+ sh seiface.Handler ,
55
+ l logr.Logger ,
56
+ mPath string ,
57
+ ) (* statusServer , error ) {
40
58
if cfg .Path == "" {
41
59
cfg .Path = DefaultUnixSockAddr
42
60
}
@@ -48,7 +66,7 @@ func initStatusServer(cfg StatusServerConfig, ds datastore.ReadOnlyDataStore, l
48
66
return nil , fmt .Errorf ("setting up socket: %w" , err )
49
67
}
50
68
51
- ss := & statusServer {cfg , ds , l , lst , false }
69
+ ss := & statusServer {cfg , ds , sh , l , mPath , lst , false }
52
70
return ss , nil
53
71
}
54
72
@@ -111,13 +129,17 @@ func (ss *statusServer) initializeRoutes(r *mux.Router) {
111
129
}
112
130
113
131
func (ss * statusServer ) listPoliciesHandler (w http.ResponseWriter , r * http.Request ) {
114
- modules , err := ss .ds .List ()
132
+ modules , err := ss .sh .List ()
115
133
if err != nil {
116
134
http .Error (w , "Cannot list modules" , http .StatusInternalServerError )
117
135
return
118
136
}
119
137
120
- err = json .NewEncoder (w ).Encode (modules )
138
+ moduleList := []string {}
139
+ for _ , module := range modules {
140
+ moduleList = append (moduleList , module .Name )
141
+ }
142
+ err = json .NewEncoder (w ).Encode (moduleList )
121
143
if err != nil {
122
144
ss .l .Error (err , "error writing list response" )
123
145
http .Error (w , "Cannot list modules" , http .StatusInternalServerError )
@@ -127,17 +149,50 @@ func (ss *statusServer) listPoliciesHandler(w http.ResponseWriter, r *http.Reque
127
149
func (ss * statusServer ) getPolicyStatusHandler (w http.ResponseWriter , r * http.Request ) {
128
150
vars := mux .Vars (r )
129
151
policy := vars ["policy" ]
130
- status , err := ss .ds . Get (policy )
131
- if errors .Is (err , datastore .ErrPolicyNotFound ) {
132
- http .Error (w , "couldn't find requested policy " , http .StatusNotFound )
152
+ module , err := ss .sh . GetPolicyModule (policy )
153
+ if errors .Is (err , seiface .ErrPolicyNotFound ) {
154
+ http .Error (w , "policy is not installed " , http .StatusNotFound )
133
155
return
134
156
} else if err != nil {
135
157
ss .l .Error (err , "error getting status" )
136
158
http .Error (w , "Cannot get status" , http .StatusInternalServerError )
137
159
return
138
160
}
139
161
140
- err = json .NewEncoder (w ).Encode (status )
162
+ var policyFile string
163
+ err = filepath .Walk (ss .mPath , func (path string , info os.FileInfo , err error ) error {
164
+ if info == nil {
165
+ return nil
166
+ }
167
+ if ! info .IsDir () && (filepath .Base (path ) == policy + ".cil" || filepath .Base (path ) == policy + ".pp" ) {
168
+ policyFile = path
169
+ return nil
170
+ }
171
+ return nil
172
+ })
173
+ if err != nil {
174
+ ss .l .Error (err , "error getting status" )
175
+ http .Error (w , "Cannot get status" , http .StatusInternalServerError )
176
+ return
177
+ }
178
+
179
+ cs , csErr := utils .Checksum (policyFile )
180
+
181
+ if csErr != nil {
182
+ http .Error (w , "cannot find policy file " + policyFile , http .StatusNotFound )
183
+ return
184
+ }
185
+
186
+ if cs != module .Checksum {
187
+ http .Error (w , "Installed policy " + module .Name + " does not much policy file " + policyFile , http .StatusNotFound )
188
+ return
189
+ }
190
+ err = json .NewEncoder (w ).Encode (policyStatus {
191
+ Policy : policy ,
192
+ Status : "Installed" ,
193
+ Message : "" ,
194
+ Checksum : module .Checksum ,
195
+ })
141
196
if err != nil {
142
197
ss .l .Error (err , "error writing status response" )
143
198
http .Error (w , "Cannot get status" , http .StatusInternalServerError )
0 commit comments