-
Notifications
You must be signed in to change notification settings - Fork 9
/
modif.go
158 lines (135 loc) · 3.59 KB
/
modif.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Copyright (c) 2018-2021, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE file distributed with the sources of this project regarding your
// rights to use or distribute this software.
package main
import (
"errors"
"flag"
"fmt"
"os"
"strconv"
"github.com/sylabs/sif/internal/app/siftool"
"github.com/sylabs/sif/pkg/sif" //nolint:staticcheck // In use until v2 API
)
var (
datatype = flag.Int("datatype", 0, "")
parttype = flag.Int("parttype", 0, "")
partfs = flag.Int("partfs", 0, "")
partarch = flag.Int("partarch", 0, "")
signhash = flag.Int("signhash", 0, "")
signentity = flag.String("signentity", "", "")
groupid = flag.Int("groupid", 0, "")
link = flag.Int("link", 0, "")
alignment = flag.Int("alignment", 0, "")
filename = flag.String("filename", "", "")
)
func cmdNew(args []string) error {
if len(args) != 1 {
return fmt.Errorf("usage")
}
return siftool.New(args[0])
}
func cmdAdd(args []string) error {
if len(args) != 2 {
return fmt.Errorf("usage")
}
opts := siftool.AddOptions{
Groupid: uint32(*groupid),
Link: uint32(*link),
Alignment: *alignment,
Filename: *filename,
Fp: os.Stdin,
}
switch *datatype {
case 1:
opts.Datatype = sif.DataDeffile
case 2:
opts.Datatype = sif.DataEnvVar
case 3:
opts.Datatype = sif.DataLabels
case 4:
opts.Datatype = sif.DataPartition
case 5:
opts.Datatype = sif.DataSignature
case 6:
opts.Datatype = sif.DataGenericJSON
case 7:
opts.Datatype = sif.DataGeneric
case 8:
opts.Datatype = sif.DataCryptoMessage
default:
return errors.New("-datatype flag is required with a valid range")
}
if opts.Datatype == sif.DataPartition {
if *partfs == 0 || *parttype == 0 || *partarch == 0 {
return errors.New("with partition datatype, -partfs, -parttype and -partarch must be passed")
}
opts.Parttype = sif.Parttype(*parttype)
opts.Partfs = sif.Fstype(*partfs)
switch *partarch {
case 1:
opts.Partarch = sif.HdrArch386
case 2:
opts.Partarch = sif.HdrArchAMD64
case 3:
opts.Partarch = sif.HdrArchARM
case 4:
opts.Partarch = sif.HdrArchARM64
case 5:
opts.Partarch = sif.HdrArchPPC64
case 6:
opts.Partarch = sif.HdrArchPPC64le
case 7:
opts.Partarch = sif.HdrArchMIPS
case 8:
opts.Partarch = sif.HdrArchMIPSle
case 9:
opts.Partarch = sif.HdrArchMIPS64
case 10:
opts.Partarch = sif.HdrArchMIPS64le
case 11:
opts.Partarch = sif.HdrArchS390x
default:
return errors.New("-partarch flag is required with a valid range")
}
} else if opts.Datatype == sif.DataSignature {
if *signhash == 0 || *signentity == "" {
return errors.New("with signature datatype, -signhash and -signentity must be passed")
}
opts.Signhash = sif.Hashtype(*signhash)
opts.Signentity = *signentity
}
if dataFile := args[1]; dataFile != "-" {
fp, err := os.Open(dataFile)
if err != nil {
return err
}
defer fp.Close()
opts.Fp = fp
if opts.Filename == "" {
opts.Filename = dataFile
}
}
return siftool.Add(args[0], opts)
}
func cmdDel(args []string) error {
if len(args) != 2 {
return fmt.Errorf("usage")
}
id, err := strconv.ParseUint(args[0], 10, 32)
if err != nil {
return fmt.Errorf("while converting input descriptor id: %s", err)
}
return siftool.Del(args[1], uint32(id))
}
func cmdSetPrim(args []string) error {
if len(args) != 2 {
return fmt.Errorf("usage")
}
id, err := strconv.ParseUint(args[0], 10, 32)
if err != nil {
return fmt.Errorf("while converting input descriptor id: %s", err)
}
return siftool.Setprim(args[0], uint32(id))
}