Skip to content

Commit bd3ab9c

Browse files
committed
Add device set-system-factory-default command.
1 parent c412a8d commit bd3ab9c

File tree

3 files changed

+69
-8
lines changed

3 files changed

+69
-8
lines changed

cmd/gonvif/device/cmd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func init() {
2020
getDeviceInformation,
2121
getNetworkInterfaces,
2222
getServices,
23+
setSystemFactoryDefault,
2324
systemReboot,
2425
)
2526
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package device
2+
3+
import (
4+
"github.com/spf13/cobra"
5+
6+
"github.com/eyetowers/gonvif/cmd/gonvif/root"
7+
"github.com/eyetowers/gonvif/pkg/generated/onvif/www_onvif_org/ver10/device/wsdl"
8+
"github.com/eyetowers/gonvif/pkg/generated/onvif/www_onvif_org/ver10/schema"
9+
)
10+
11+
var (
12+
hard bool
13+
)
14+
15+
var setSystemFactoryDefault = &cobra.Command{
16+
Use: "set-system-factory-default",
17+
Short: "Set Onvif device system factory default",
18+
Args: cobra.NoArgs,
19+
RunE: func(cmd *cobra.Command, args []string) error {
20+
client, err := ServiceClient(root.URL, root.Username, root.Password, root.Verbose)
21+
if err != nil {
22+
return err
23+
}
24+
return runSetSystemFactoryDefault(client, hard)
25+
},
26+
}
27+
28+
func init() {
29+
setSystemFactoryDefault.Flags().BoolVarP(&hard, "hard", "", false,
30+
"Require a hard factory reset which will also reset camera network settings and thus its reachability.")
31+
}
32+
33+
func runSetSystemFactoryDefault(client wsdl.Device, hard bool) error {
34+
reset := schema.FactoryDefaultTypeSoft
35+
if hard {
36+
reset = schema.FactoryDefaultTypeHard
37+
}
38+
39+
resp, err := client.SetSystemFactoryDefault(&wsdl.SetSystemFactoryDefault{
40+
FactoryDefault: &reset,
41+
})
42+
if err != nil {
43+
return err
44+
}
45+
return root.OutputJSON(resp)
46+
}

pkg/gonvif/client.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -211,16 +211,30 @@ func AuthorizedSOAPClient(serviceURL, username, password string, verbose bool) *
211211

212212
func logResponse(resp *http.Response) {
213213
log.Printf("<-- %d %s", resp.StatusCode, resp.Request.URL)
214-
defer resp.Body.Close()
215-
body, _ := io.ReadAll(resp.Body)
216-
log.Printf("BODY:\n%s", string(body))
217-
resp.Body = io.NopCloser(bytes.NewReader(body))
214+
resp.Body = logBodyAndHeaders(resp.Body, resp.Header)
218215
}
219216

220217
func logRequest(req *http.Request) {
221218
log.Printf("--> %s %s", req.Method, req.URL)
222-
defer req.Body.Close()
223-
body, _ := io.ReadAll(req.Body)
224-
log.Printf("BODY:\n%s", string(body))
225-
req.Body = io.NopCloser(bytes.NewReader(body))
219+
req.Body = logBodyAndHeaders(req.Body, req.Header)
220+
}
221+
222+
func logBodyAndHeaders(body io.ReadCloser, headers http.Header) io.ReadCloser {
223+
defer body.Close()
224+
bytes, copy := readAndDuplicate(body)
225+
log.Printf("HEADERS:\n")
226+
for k, vals := range headers {
227+
for _, val := range vals {
228+
log.Printf("%s: %s\n", k, val)
229+
}
230+
}
231+
log.Printf("BODY:\n%s", string(bytes))
232+
return copy
233+
}
234+
235+
func readAndDuplicate(body io.ReadCloser) ([]byte, io.ReadCloser) {
236+
defer body.Close()
237+
buf, _ := io.ReadAll(body)
238+
239+
return buf, io.NopCloser(bytes.NewReader(buf))
226240
}

0 commit comments

Comments
 (0)