mirror of https://github.com/docker/docs.git
Merge branch 'demo' of github.com:docker/vetinari into demo
This commit is contained in:
commit
9c11a13431
|
@ -47,7 +47,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/endophage/gotuf",
|
"ImportPath": "github.com/endophage/gotuf",
|
||||||
"Rev": "429e2920d26a5703bb9cbdeaf893d3b79d6b2085"
|
"Rev": "36214c0646639c7f94b3151df15dc417a67a9406"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/go-sql-driver/mysql",
|
"ImportPath": "github.com/go-sql-driver/mysql",
|
||||||
|
|
|
@ -387,6 +387,19 @@ func (tr *TufRepo) AddTargets(role string, targets data.Files) (data.Files, erro
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tr *TufRepo) RemoveTargets(role string, targets ...string) error {
|
||||||
|
t, ok := tr.Targets[role]
|
||||||
|
if !ok {
|
||||||
|
return errors.ErrInvalidRole{role}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, path := range targets {
|
||||||
|
delete(t.Signed.Targets, path)
|
||||||
|
}
|
||||||
|
t.Dirty = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (tr *TufRepo) UpdateSnapshot(role string, s *data.Signed) error {
|
func (tr *TufRepo) UpdateSnapshot(role string, s *data.Signed) error {
|
||||||
jsonData, err := json.Marshal(s)
|
jsonData, err := json.Marshal(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -24,9 +24,11 @@ const privDir string = configPath + "private/"
|
||||||
const tufDir string = configPath + "tuf/"
|
const tufDir string = configPath + "tuf/"
|
||||||
|
|
||||||
var caStore trustmanager.X509Store
|
var caStore trustmanager.X509Store
|
||||||
|
var rawOutput bool
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
logrus.SetLevel(logrus.ErrorLevel)
|
logrus.SetLevel(logrus.ErrorLevel)
|
||||||
|
logrus.SetOutput(os.Stderr)
|
||||||
// Retrieve current user to get home directory
|
// Retrieve current user to get home directory
|
||||||
usr, err := user.Current()
|
usr, err := user.Current()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -93,11 +95,13 @@ func main() {
|
||||||
NotaryCmd.AddCommand(cmdKeys)
|
NotaryCmd.AddCommand(cmdKeys)
|
||||||
NotaryCmd.AddCommand(cmdTufInit)
|
NotaryCmd.AddCommand(cmdTufInit)
|
||||||
NotaryCmd.AddCommand(cmdTufList)
|
NotaryCmd.AddCommand(cmdTufList)
|
||||||
|
cmdTufList.Flags().BoolVarP(&rawOutput, "raw", "", false, "Instructs notary list to output a non-pretty printed version of the targets list. Useful if you need to parse the list.")
|
||||||
NotaryCmd.AddCommand(cmdTufAdd)
|
NotaryCmd.AddCommand(cmdTufAdd)
|
||||||
NotaryCmd.AddCommand(cmdTufRemove)
|
NotaryCmd.AddCommand(cmdTufRemove)
|
||||||
NotaryCmd.AddCommand(cmdTufPublish)
|
NotaryCmd.AddCommand(cmdTufPublish)
|
||||||
cmdTufPublish.Flags().StringVarP(&remoteTrustServer, "remote", "r", "", "Remote trust server location")
|
cmdTufPublish.Flags().StringVarP(&remoteTrustServer, "remote", "r", "", "Remote trust server location")
|
||||||
NotaryCmd.AddCommand(cmdTufLookup)
|
NotaryCmd.AddCommand(cmdTufLookup)
|
||||||
|
cmdTufLookup.Flags().BoolVarP(&rawOutput, "raw", "", false, "Instructs notary lookup to output a non-pretty printed version of the targets list. Useful if you need to parse the list.")
|
||||||
cmdTufLookup.Flags().StringVarP(&remoteTrustServer, "remote", "r", "", "Remote trust server location")
|
cmdTufLookup.Flags().StringVarP(&remoteTrustServer, "remote", "r", "", "Remote trust server location")
|
||||||
|
|
||||||
NotaryCmd.Execute()
|
NotaryCmd.Execute()
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/endophage/gotuf"
|
"github.com/endophage/gotuf"
|
||||||
"github.com/endophage/gotuf/client"
|
"github.com/endophage/gotuf/client"
|
||||||
"github.com/endophage/gotuf/data"
|
"github.com/endophage/gotuf/data"
|
||||||
|
@ -76,64 +77,20 @@ func tufAdd(cmd *cobra.Command, args []string) {
|
||||||
signer := signed.NewSigner(NewCryptoService(gun))
|
signer := signed.NewSigner(NewCryptoService(gun))
|
||||||
repo := tuf.NewTufRepo(kdb, signer)
|
repo := tuf.NewTufRepo(kdb, signer)
|
||||||
|
|
||||||
filestore, err := store.NewFilesystemStore(
|
|
||||||
path.Join(viper.GetString("tufDir"), gun),
|
|
||||||
"metadata",
|
|
||||||
"json",
|
|
||||||
"targets",
|
|
||||||
)
|
|
||||||
|
|
||||||
b, err := ioutil.ReadFile(targetPath)
|
b, err := ioutil.ReadFile(targetPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatalf(err.Error())
|
fatalf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
rootJSON, err := filestore.GetMeta("root", 0)
|
filestore := bootstrapRepo(gun, repo)
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
root := &data.Signed{}
|
|
||||||
err = json.Unmarshal(rootJSON, root)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
repo.SetRoot(root)
|
|
||||||
targetsJSON, err := filestore.GetMeta("targets", 0)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
targets := &data.Signed{}
|
|
||||||
err = json.Unmarshal(targetsJSON, targets)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
repo.SetTargets("targets", targets)
|
|
||||||
snapshotJSON, err := filestore.GetMeta("snapshot", 0)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
snapshot := &data.Signed{}
|
|
||||||
err = json.Unmarshal(snapshotJSON, snapshot)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
repo.SetSnapshot(snapshot)
|
|
||||||
timestampJSON, err := filestore.GetMeta("timestamp", 0)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
timestamp := &data.Signed{}
|
|
||||||
err = json.Unmarshal(timestampJSON, timestamp)
|
|
||||||
if err != nil {
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
repo.SetTimestamp(timestamp)
|
|
||||||
|
|
||||||
|
fmt.Println("Generating metadata for target")
|
||||||
meta, err := data.NewFileMeta(bytes.NewBuffer(b))
|
meta, err := data.NewFileMeta(bytes.NewBuffer(b))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatalf(err.Error())
|
fatalf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Adding target \"%s\" with sha256 \"%s\" and size %s bytes.\n", targetName, meta.Hashes["sha256"], meta.Length)
|
||||||
_, err = repo.AddTargets("targets", data.Files{targetName: meta})
|
_, err = repo.AddTargets("targets", data.Files{targetName: meta})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatalf(err.Error())
|
fatalf(err.Error())
|
||||||
|
@ -206,37 +163,24 @@ func tufList(cmd *cobra.Command, args []string) {
|
||||||
"json",
|
"json",
|
||||||
"",
|
"",
|
||||||
)
|
)
|
||||||
rootJSON, err := remote.GetMeta("root", 5<<20)
|
c, err := bootstrapClient(remote, repo, kdb)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Couldn't get initial root")
|
return
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
}
|
||||||
root := &data.Signed{}
|
|
||||||
err = json.Unmarshal(rootJSON, root)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Couldn't parse initial root")
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
// TODO: Validate the root file against the key store
|
|
||||||
err = repo.SetRoot(root)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Error setting root")
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
c := client.NewClient(
|
|
||||||
repo,
|
|
||||||
remote,
|
|
||||||
kdb,
|
|
||||||
)
|
|
||||||
|
|
||||||
err = c.Update()
|
err = c.Update()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Update failed")
|
logrus.Error("Error updating client: ", err.Error())
|
||||||
fatalf(err.Error())
|
return
|
||||||
}
|
}
|
||||||
for name, meta := range repo.Targets["targets"].Signed.Targets {
|
|
||||||
fmt.Println(name, " ", meta.Hashes["sha256"], " ", meta.Length)
|
if rawOutput {
|
||||||
|
for name, meta := range repo.Targets["targets"].Signed.Targets {
|
||||||
|
fmt.Println(name, " ", meta.Hashes["sha256"], " ", meta.Length)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for name, meta := range repo.Targets["targets"].Signed.Targets {
|
||||||
|
fmt.Println(name, " ", meta.Hashes["sha256"], " ", meta.Length)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,49 +200,35 @@ func tufLookup(cmd *cobra.Command, args []string) {
|
||||||
"json",
|
"json",
|
||||||
"",
|
"",
|
||||||
)
|
)
|
||||||
rootJSON, err := remote.GetMeta("root", 5<<20)
|
c, err := bootstrapClient(remote, repo, kdb)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Couldn't get initial root")
|
return
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
}
|
||||||
root := &data.Signed{}
|
|
||||||
err = json.Unmarshal(rootJSON, root)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Couldn't parse initial root")
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
// TODO: Validate the root file against the key store
|
|
||||||
err = repo.SetRoot(root)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Error setting root")
|
|
||||||
fatalf(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
c := client.NewClient(
|
|
||||||
repo,
|
|
||||||
remote,
|
|
||||||
kdb,
|
|
||||||
)
|
|
||||||
|
|
||||||
err = c.Update()
|
err = c.Update()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Update failed")
|
logrus.Error("Error updating client: ", err.Error())
|
||||||
fatalf(err.Error())
|
return
|
||||||
}
|
}
|
||||||
meta := c.TargetMeta(targetName)
|
meta := c.TargetMeta(targetName)
|
||||||
if meta == nil {
|
if meta == nil {
|
||||||
|
logrus.Infof("Target %s not found in %s.", targetName, gun)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Println(targetName, fmt.Sprintf("sha256:%s", meta.Hashes["sha256"]), meta.Length)
|
if rawOutput {
|
||||||
|
fmt.Println(targetName, fmt.Sprintf("sha256:%s", meta.Hashes["sha256"]), meta.Length)
|
||||||
|
} else {
|
||||||
|
fmt.Println(targetName, fmt.Sprintf("sha256:%s", meta.Hashes["sha256"]), meta.Length)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func tufPublish(cmd *cobra.Command, args []string) {
|
func tufPublish(cmd *cobra.Command, args []string) {
|
||||||
if len(args) < 1 {
|
if len(args) < 1 {
|
||||||
cmd.Usage()
|
cmd.Usage()
|
||||||
fatalf("must specify a GUN")
|
fatalf("Must specify a GUN")
|
||||||
}
|
}
|
||||||
|
|
||||||
gun := args[0]
|
gun := args[0]
|
||||||
|
fmt.Println("Pushing changes to ", gun, ".")
|
||||||
|
|
||||||
remote, err := store.NewHTTPStore(
|
remote, err := store.NewHTTPStore(
|
||||||
"https://vetinari:4443/v2/"+gun+"/_trust/tuf/",
|
"https://vetinari:4443/v2/"+gun+"/_trust/tuf/",
|
||||||
|
@ -312,6 +242,9 @@ func tufPublish(cmd *cobra.Command, args []string) {
|
||||||
"json",
|
"json",
|
||||||
"targets",
|
"targets",
|
||||||
)
|
)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
root, err := filestore.GetMeta("root", 0)
|
root, err := filestore.GetMeta("root", 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -349,23 +282,38 @@ func tufPublish(cmd *cobra.Command, args []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func tufRemove(cmd *cobra.Command, args []string) {
|
func tufRemove(cmd *cobra.Command, args []string) {
|
||||||
if len(args) < 1 {
|
if len(args) < 2 {
|
||||||
cmd.Usage()
|
cmd.Usage()
|
||||||
fatalf("must specify a GUN")
|
fatalf("must specify a GUN and target name")
|
||||||
}
|
}
|
||||||
|
gun := args[0]
|
||||||
|
targetName := args[1]
|
||||||
|
kdb := keys.NewDB()
|
||||||
|
signer := signed.NewSigner(NewCryptoService(gun))
|
||||||
|
repo := tuf.NewTufRepo(kdb, signer)
|
||||||
|
|
||||||
|
fmt.Println("Removing target ", targetName, " from ", gun)
|
||||||
|
|
||||||
|
filestore := bootstrapRepo(gun, repo)
|
||||||
|
|
||||||
|
err := repo.RemoveTargets("targets", targetName)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
saveRepo(repo, filestore)
|
||||||
}
|
}
|
||||||
|
|
||||||
func saveRepo(repo *tuf.TufRepo, filestore store.MetadataStore) error {
|
func saveRepo(repo *tuf.TufRepo, filestore store.MetadataStore) error {
|
||||||
|
fmt.Println("Saving changes to TUF Repository.")
|
||||||
signedRoot, err := repo.SignRoot(data.DefaultExpires("root"))
|
signedRoot, err := repo.SignRoot(data.DefaultExpires("root"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println("Marshalling root")
|
|
||||||
rootJSON, _ := json.Marshal(signedRoot)
|
rootJSON, _ := json.Marshal(signedRoot)
|
||||||
filestore.SetMeta("root", rootJSON)
|
filestore.SetMeta("root", rootJSON)
|
||||||
|
|
||||||
for r, _ := range repo.Targets {
|
for r, _ := range repo.Targets {
|
||||||
fmt.Println("Marshalling ", r)
|
|
||||||
signedTargets, err := repo.SignTargets(r, data.DefaultExpires("targets"))
|
signedTargets, err := repo.SignTargets(r, data.DefaultExpires("targets"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -380,7 +328,6 @@ func saveRepo(repo *tuf.TufRepo, filestore store.MetadataStore) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println("Marshalling snapshot")
|
|
||||||
snapshotJSON, _ := json.Marshal(signedSnapshot)
|
snapshotJSON, _ := json.Marshal(signedSnapshot)
|
||||||
filestore.SetMeta("snapshot", snapshotJSON)
|
filestore.SetMeta("snapshot", snapshotJSON)
|
||||||
|
|
||||||
|
@ -388,8 +335,84 @@ func saveRepo(repo *tuf.TufRepo, filestore store.MetadataStore) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println("Marshalling timestamp")
|
|
||||||
timestampJSON, _ := json.Marshal(signedTimestamp)
|
timestampJSON, _ := json.Marshal(signedTimestamp)
|
||||||
filestore.SetMeta("timestamp", timestampJSON)
|
filestore.SetMeta("timestamp", timestampJSON)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bootstrapClient(remote store.RemoteStore, repo *tuf.TufRepo, kdb *keys.KeyDB) (*client.Client, error) {
|
||||||
|
rootJSON, err := remote.GetMeta("root", 5<<20)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
root := &data.Signed{}
|
||||||
|
err = json.Unmarshal(rootJSON, root)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// TODO: Validate the root file against the key store
|
||||||
|
err = repo.SetRoot(root)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return client.NewClient(
|
||||||
|
repo,
|
||||||
|
remote,
|
||||||
|
kdb,
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func bootstrapRepo(gun string, repo *tuf.TufRepo) store.MetadataStore {
|
||||||
|
filestore, err := store.NewFilesystemStore(
|
||||||
|
path.Join(viper.GetString("tufDir"), gun),
|
||||||
|
"metadata",
|
||||||
|
"json",
|
||||||
|
"targets",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Loading TUF Repository.")
|
||||||
|
rootJSON, err := filestore.GetMeta("root", 0)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
root := &data.Signed{}
|
||||||
|
err = json.Unmarshal(rootJSON, root)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
repo.SetRoot(root)
|
||||||
|
targetsJSON, err := filestore.GetMeta("targets", 0)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
targets := &data.Signed{}
|
||||||
|
err = json.Unmarshal(targetsJSON, targets)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
repo.SetTargets("targets", targets)
|
||||||
|
snapshotJSON, err := filestore.GetMeta("snapshot", 0)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
snapshot := &data.Signed{}
|
||||||
|
err = json.Unmarshal(snapshotJSON, snapshot)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
repo.SetSnapshot(snapshot)
|
||||||
|
timestampJSON, err := filestore.GetMeta("timestamp", 0)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
timestamp := &data.Signed{}
|
||||||
|
err = json.Unmarshal(timestampJSON, timestamp)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
repo.SetTimestamp(timestamp)
|
||||||
|
return filestore
|
||||||
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ func UpdateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
qdn := vars["imageName"]
|
gun := vars["imageName"]
|
||||||
tufRole := vars["tufRole"]
|
tufRole := vars["tufRole"]
|
||||||
input, err := ioutil.ReadAll(r.Body)
|
input, err := ioutil.ReadAll(r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -73,7 +73,7 @@ func UpdateHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
version := meta.Signed.Version
|
version := meta.Signed.Version
|
||||||
err = store.UpdateCurrent(qdn, tufRole, version, input)
|
err = store.UpdateCurrent(gun, tufRole, version, input)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &errors.HTTPError{
|
return &errors.HTTPError{
|
||||||
HTTPStatus: http.StatusInternalServerError,
|
HTTPStatus: http.StatusInternalServerError,
|
||||||
|
@ -96,11 +96,12 @@ func GetHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) *er
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
qdn := vars["imageName"]
|
gun := vars["imageName"]
|
||||||
tufRole := vars["tufRole"]
|
tufRole := vars["tufRole"]
|
||||||
data, err := store.GetCurrent(qdn, tufRole)
|
data, err := store.GetCurrent(gun, tufRole)
|
||||||
logrus.Debug("JSON: ", string(data))
|
logrus.Debug("JSON: ", string(data))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logrus.Errorf("[Vetinari] 500 GET repository: %s, role: %s", gun, tufRole)
|
||||||
return &errors.HTTPError{
|
return &errors.HTTPError{
|
||||||
HTTPStatus: http.StatusInternalServerError,
|
HTTPStatus: http.StatusInternalServerError,
|
||||||
Code: 9999,
|
Code: 9999,
|
||||||
|
@ -108,6 +109,7 @@ func GetHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) *er
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if data == nil {
|
if data == nil {
|
||||||
|
logrus.Errorf("[Vetinari] 404 GET repository: %s, role: %s", gun, tufRole)
|
||||||
return &errors.HTTPError{
|
return &errors.HTTPError{
|
||||||
HTTPStatus: http.StatusNotFound,
|
HTTPStatus: http.StatusNotFound,
|
||||||
Code: 9999,
|
Code: 9999,
|
||||||
|
|
Loading…
Reference in New Issue