forked from TrueCloudLab/restic
restore: remove unexpected xattrs from files
This commit is contained in:
parent
ebbd4e26d7
commit
4d6042fe95
2 changed files with 66 additions and 0 deletions
|
@ -40,6 +40,11 @@ func setxattr(path, name string, data []byte) error {
|
||||||
return handleXattrErr(xattr.LSet(path, name, data))
|
return handleXattrErr(xattr.LSet(path, name, data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// removexattr removes the attribute name from path.
|
||||||
|
func removexattr(path, name string) error {
|
||||||
|
return handleXattrErr(xattr.LRemove(path, name))
|
||||||
|
}
|
||||||
|
|
||||||
func handleXattrErr(err error) error {
|
func handleXattrErr(err error) error {
|
||||||
switch e := err.(type) {
|
switch e := err.(type) {
|
||||||
case nil:
|
case nil:
|
||||||
|
@ -70,12 +75,29 @@ func (node *Node) fillGenericAttributes(_ string, _ os.FileInfo, _ *statT) (allo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (node Node) restoreExtendedAttributes(path string) error {
|
func (node Node) restoreExtendedAttributes(path string) error {
|
||||||
|
expectedAttrs := map[string]struct{}{}
|
||||||
for _, attr := range node.ExtendedAttributes {
|
for _, attr := range node.ExtendedAttributes {
|
||||||
err := setxattr(path, attr.Name, attr.Value)
|
err := setxattr(path, attr.Name, attr.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
expectedAttrs[attr.Name] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove unexpected xattrs
|
||||||
|
xattrs, err := listxattr(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, name := range xattrs {
|
||||||
|
if _, ok := expectedAttrs[name]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := removexattr(path, name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
44
internal/restic/node_xattr_all_test.go
Normal file
44
internal/restic/node_xattr_all_test.go
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
//go:build darwin || freebsd || linux || solaris || windows
|
||||||
|
// +build darwin freebsd linux solaris windows
|
||||||
|
|
||||||
|
package restic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
rtest "github.com/restic/restic/internal/test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func setAndVerifyXattr(t *testing.T, file string, attrs []ExtendedAttribute) {
|
||||||
|
node := Node{
|
||||||
|
ExtendedAttributes: attrs,
|
||||||
|
}
|
||||||
|
rtest.OK(t, node.restoreExtendedAttributes(file))
|
||||||
|
|
||||||
|
nodeActual := Node{}
|
||||||
|
rtest.OK(t, nodeActual.fillExtendedAttributes(file, false))
|
||||||
|
|
||||||
|
rtest.Assert(t, nodeActual.sameExtendedAttributes(node), "xattr mismatch got %v expected %v", nodeActual.ExtendedAttributes, node.ExtendedAttributes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOverwriteXattr(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
file := filepath.Join(dir, "file")
|
||||||
|
rtest.OK(t, os.WriteFile(file, []byte("hello world"), 0o600))
|
||||||
|
|
||||||
|
setAndVerifyXattr(t, file, []ExtendedAttribute{
|
||||||
|
{
|
||||||
|
Name: "user.foo",
|
||||||
|
Value: []byte("bar"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
setAndVerifyXattr(t, file, []ExtendedAttribute{
|
||||||
|
{
|
||||||
|
Name: "user.other",
|
||||||
|
Value: []byte("some"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in a new issue