1
0
Fork 0
mirror of https://github.com/arangodb/kube-arangodb.git synced 2024-12-14 11:57:37 +00:00
kube-arangodb/integrations/config/v1/impl_darwin.go
2024-10-18 15:16:20 +02:00

80 lines
2.7 KiB
Go

//
// DISCLAIMER
//
// Copyright 2024 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package v1
import (
"fmt"
"os"
"path"
"strings"
"syscall"
"time"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb"
pbConfigV1 "github.com/arangodb/kube-arangodb/integrations/config/v1/definition"
"github.com/arangodb/kube-arangodb/pkg/util"
"github.com/arangodb/kube-arangodb/pkg/util/errors"
)
func (i *impl) fileDetails(module ModuleDefinition, file string, checksum bool) (*pbConfigV1.ConfigV1File, error) {
expectedPath := path.Clean(path.Join(module.Path, file))
if !strings.HasPrefix(expectedPath, fmt.Sprintf("%s/", module.Path)) {
return nil, status.Errorf(codes.InvalidArgument, "File name cannot be empty")
}
stat, err := os.Stat(expectedPath)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
return nil, status.Errorf(codes.NotFound, "File `%s` not found within module `%s`", file, module.Name)
}
logger.Err(err).Str("module", module.Name).Str("file", file).Str("real-path", expectedPath).Warn("Unable to get file")
return nil, status.Errorf(codes.Internal, "Unable to list directory for module `%s`", module.Name)
}
finfo, ok := stat.Sys().(*syscall.Stat_t)
if !ok {
logger.Str("module", module.Name).Str("file", file).Str("real-path", expectedPath).Warn("Invalid Stat Pointer for file")
return nil, status.Errorf(codes.Internal, "Fetch of file `%s` within module `%s` failed", file, module.Name)
}
var f pbConfigV1.ConfigV1File
f.Path = strings.TrimPrefix(expectedPath, fmt.Sprintf("%s/", module.Path))
f.Size = finfo.Size
f.Created = timestamppb.New(time.Unix(finfo.Ctimespec.Sec, finfo.Ctimespec.Nsec))
f.Updated = timestamppb.New(time.Unix(finfo.Mtimespec.Sec, finfo.Mtimespec.Nsec))
if checksum {
c, err := util.SHA256FromFile(expectedPath)
if err != nil {
logger.Str("module", module.Name).Str("file", file).Str("real-path", expectedPath).Warn("Unable to get file checksum")
return nil, status.Errorf(codes.Internal, "Unable to calculate checksum of file `%s` within module `%s` failed", file, module.Name)
}
f.Checksum = util.NewType(c)
}
return &f, nil
}