From 44ac2b0d53500bb1fa7159479d3067a06c79a8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 30 Nov 2023 17:26:34 +0100 Subject: [PATCH 01/12] wip smb --- go.mod | 22 ++-- go.sum | 50 +++++++++ go.work.sum | 8 +- smbtst/smb.go | 273 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 341 insertions(+), 12 deletions(-) create mode 100644 smbtst/smb.go diff --git a/go.mod b/go.mod index 3e79957..1a5343c 100644 --- a/go.mod +++ b/go.mod @@ -65,6 +65,7 @@ require ( github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bep/debounce v1.2.1 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cockroachdb/errors v1.8.1 // indirect @@ -108,6 +109,9 @@ require ( github.com/filecoin-project/specs-actors/v7 v7.0.1 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/geoffgarside/ber v1.1.0 // indirect + github.com/go-ini/ini v1.67.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.5 // indirect @@ -121,6 +125,7 @@ require ( github.com/google/gopacket v1.1.19 // indirect github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/grandcat/zeroconf v1.0.0 // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c // indirect github.com/hannahhoward/go-pubsub v1.0.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -171,13 +176,14 @@ require ( github.com/libp2p/go-netroute v0.2.1 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect + github.com/macos-fuse-t/go-smb2 v0.0.0-20231113122722-c2eaf9fa0180 // indirect github.com/magefile/mage v1.9.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.10 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.55 // indirect + github.com/miekg/dns v1.1.56 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect @@ -196,6 +202,7 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/xattr v0.4.9 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect @@ -212,7 +219,9 @@ require ( github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v2.18.12+incompatible // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.0.1 // indirect github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba // indirect @@ -226,14 +235,15 @@ require ( go.uber.org/dig v1.17.0 // indirect go.uber.org/fx v1.20.0 // indirect go.uber.org/zap v1.25.0 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.13.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/go.sum b/go.sum index 6687b25..7689838 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,7 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= @@ -107,6 +108,7 @@ github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtE github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -182,6 +184,7 @@ github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzA github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -330,9 +333,12 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= +github.com/geoffgarside/ber v1.1.0 h1:qTmFG4jJbwiSzSXoNJeHcOprVzZ8Ulde2Rrrifu5U9w= +github.com/geoffgarside/ber v1.1.0/go.mod h1:jVPKeCbj6MvQZhwLYsGwaGI52oUorHoHKNecGT85ZCc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= @@ -343,12 +349,15 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -469,6 +478,8 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= +github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -584,6 +595,7 @@ github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjv github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= @@ -602,6 +614,7 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IW github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= +github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= github.com/ipfs/go-ipfs-cmds v0.9.0 h1:K0VcXg1l1k6aY6sHnoxYcyimyJQbcV1ueXuWgThmK9Q= github.com/ipfs/go-ipfs-cmds v0.9.0/go.mod h1:SBFHK8WNwC416QWH9Vz1Ql42SSMAOqKpaHUMBu3jpLo= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -766,6 +779,7 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -1013,13 +1027,17 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= +github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/macos-fuse-t/go-smb2 v0.0.0-20231113122722-c2eaf9fa0180 h1:R9nBH1vgKxvEEd+I8DB0Zpp2DSdtvfPUh8hqfJyX4g0= +github.com/macos-fuse-t/go-smb2 v0.0.0-20231113122722-c2eaf9fa0180/go.mod h1:uuaCnBNqDHH0WcjKjxYbZaO65a9rxUk0k1YyTOGP8gs= github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1028,6 +1046,9 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= +github.com/marten-seemann/qtls-go1-17 v0.1.1/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s= +github.com/marten-seemann/qtls-go1-18 v0.1.1/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1067,10 +1088,13 @@ github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00v github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -1100,6 +1124,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -1194,6 +1219,7 @@ github.com/nkovacs/streamquote v1.0.0 h1:PmVIV08Zlx2lZK5fFZlMZ04eHcDTIFJCv/5/0tw github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -1205,6 +1231,7 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1248,6 +1275,8 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE= +github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= @@ -1360,6 +1389,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -1388,6 +1419,8 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1473,6 +1506,7 @@ github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvX github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= @@ -1592,6 +1626,8 @@ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1662,6 +1698,7 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1681,6 +1718,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1771,15 +1810,20 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1794,6 +1838,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1846,6 +1892,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E= golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1939,6 +1987,8 @@ gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8 gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= diff --git a/go.work.sum b/go.work.sum index d683b4b..d105564 100644 --- a/go.work.sum +++ b/go.work.sum @@ -569,7 +569,6 @@ github.com/buger/goterm v1.0.3 h1:7V/HeAQHrzPk/U4BvyH2g9u+xbUW9nr4yRPyG59W4fM= github.com/buger/goterm v1.0.3/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 h1:D21IyuvjDCshj1/qq+pCNd3VZOAEI9jy6Bi131YlXgI= github.com/casbin/casbin/v2 v2.1.2 h1:bTwon/ECRx9dwBy2ewRVr5OiqjeXSGiTUY74sDPQi/g= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= @@ -742,7 +741,6 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCg github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gammazero/channelqueue v0.2.1 h1:AcK6wnLrj8koTTn3RxjRCyfmS677TjhIZb1FSMi14qc= github.com/gammazero/channelqueue v0.2.1/go.mod h1:824o5HHE+yO1xokh36BIuSv8YWwXW0364ku91eRMFS4= github.com/gammazero/deque v0.2.1 h1:qSdsbG6pgp6nL7A0+K/B7s12mcCY/5l5SIUpMOl+dC0= @@ -1576,8 +1574,6 @@ github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t6 github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= @@ -1900,9 +1896,7 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.1-0.20221102194838-fc697a31fa06/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1917,6 +1911,8 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= diff --git a/smbtst/smb.go b/smbtst/smb.go new file mode 100644 index 0000000..9cbde84 --- /dev/null +++ b/smbtst/smb.go @@ -0,0 +1,273 @@ +package smbtst + +// NOTE: This file is dual licensed MIT/Apache like the rest of the repo +// but it pulls in macos-fuse-t/go-smb2 which is AGPL + +import ( + "context" + "fmt" + dag "github.com/ipfs/boxo/ipld/merkledag" + ft "github.com/ipfs/boxo/ipld/unixfs" + "github.com/ipfs/boxo/mfs" + format "github.com/ipfs/go-ipld-format" + "github.com/macos-fuse-t/go-smb2/vfs" + "golang.org/x/xerrors" + "os" + "strings" + "sync" + "time" +) + +const ( + blockSize = 4092 + volSize = 400 << 50 + + // todo show filecoin metrics in those + volBlocks = volSize / blockSize + volBavail = volBlocks * 10 / 9 + + // todo cid.contact metrics + totalFsFiles = 12_000_000_000_000 * 10 + freeFileNodes = totalFsFiles / 10 + + ioSize = 256 << 20 +) + +var fileTime = time.Date(2020, 10, 14, 0, 0, 0, 0, time.UTC) + +type mfsSmbFs struct { + mr *mfs.Root + + fdlk sync.Mutex + fds map[vfs.VfsHandle]*mfsHandle +} + +type mfsHandle struct { + lk sync.Mutex + + path string +} + +func (m *mfsSmbFs) getOpenHandle(handle vfs.VfsHandle) (*mfsHandle, func(), error) { + m.fdlk.Lock() + hnd, ok := m.fds[handle] + if !ok { + m.fdlk.Unlock() + return nil, nil, xerrors.Errorf("handle %d not found", handle) + } + hnd.lk.Lock() // todo this may block m.fdlk for an undesirably long time + m.fdlk.Unlock() + + return hnd, func() { + hnd.lk.Unlock() + }, nil +} + +func (m *mfsSmbFs) GetAttr(handle vfs.VfsHandle) (*vfs.Attributes, error) { + hnd, done, err := m.getOpenHandle(handle) + if err != nil { + return nil, err + } + defer done() + + nd, err := getNodeFromPath(context.TODO(), m.mr, hnd.path) + if err != nil { + return nil, err + } + + switch n := nd.(type) { + case *dag.ProtoNode: + d, err := ft.FSNodeFromBytes(n.Data()) + if err != nil { + return nil, err + } + + mode := os.FileMode(0644) + if d.Type() == ft.TDirectory { + mode = os.FileMode(0755) | os.ModeDir + } + + a := vfs.Attributes{} + a.SetInodeNumber(123) // todo this may be very bad + a.SetSizeBytes(d.FileSize()) + a.SetDiskSizeBytes(d.FileSize()) + a.SetUnixMode(uint32(mode)) + a.SetPermissions(vfs.NewPermissionsFromMode(uint32(mode))) + + a.SetAccessTime(fileTime) // todo can we not set those 4? + a.SetLastDataModificationTime(fileTime) + a.SetBirthTime(fileTime) + a.SetLastStatusChangeTime(fileTime) + + if d.Type() == ft.TDirectory { + a.SetFileType(vfs.FileTypeDirectory) + } else if d.Type() == ft.TSymlink { + a.SetFileType(vfs.FileTypeSymlink) + } else { + a.SetFileType(vfs.FileTypeRegularFile) + } + return &a, nil + case *dag.RawNode: + a := vfs.Attributes{} + a.SetInodeNumber(123) // todo this may be very bad + a.SetSizeBytes(uint64(len(n.RawData()))) + a.SetDiskSizeBytes(uint64(len(n.RawData()))) + a.SetUnixMode(uint32(0644)) + a.SetPermissions(vfs.NewPermissionsFromMode(uint32(0644))) + + a.SetAccessTime(fileTime) // todo can we not set those 4? + a.SetLastDataModificationTime(fileTime) + a.SetBirthTime(fileTime) + a.SetLastStatusChangeTime(fileTime) + a.SetFileType(vfs.FileTypeRegularFile) + return &a, nil + default: + return nil, fmt.Errorf("not unixfs node (proto or raw)") + } +} + +func (m *mfsSmbFs) SetAttr(handle vfs.VfsHandle, attributes *vfs.Attributes) (*vfs.Attributes, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { + a := vfs.FSAttributes{} + a.SetAvailableBlocks(volBavail) + a.SetBlockSize(blockSize) + a.SetBlocks(volBlocks) + a.SetFiles(totalFsFiles) + a.SetFreeBlocks(volBavail) + a.SetFreeFiles(freeFileNodes) + a.SetIOSize(ioSize) + return &a, nil +} + +func (m *mfsSmbFs) FSync(handle vfs.VfsHandle) error { + hnd, done, err := m.getOpenHandle(handle) + if err != nil { + return err + } + defer done() + +} + +func (m *mfsSmbFs) Flush(handle vfs.VfsHandle) error { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Open(s string, i int, i2 int) (vfs.VfsHandle, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Close(handle vfs.VfsHandle) error { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Lookup(handle vfs.VfsHandle, s string) (*vfs.Attributes, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Mkdir(s string, mode int) (*vfs.Attributes, error) { + err := mfs.Mkdir(m.mr, s, mfs.MkdirOpts{ + Mkparents: false, + Flush: false, + }) + if err != nil { + return nil, xerrors.Errorf("mfs mkdir: %w", err) + } + +} + +func (m *mfsSmbFs) Read(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (int, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Write(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (int, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) OpenDir(s string) (vfs.VfsHandle, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) ReadDir(handle vfs.VfsHandle, i int, i2 int) ([]vfs.DirInfo, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Readlink(handle vfs.VfsHandle) (string, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Unlink(handle vfs.VfsHandle) error { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Truncate(handle vfs.VfsHandle, u uint64) error { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Rename(handle vfs.VfsHandle, s string, i int) error { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Symlink(handle vfs.VfsHandle, s string, i int) (*vfs.Attributes, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Link(node vfs.VfsNode, node2 vfs.VfsNode, s string) (*vfs.Attributes, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Listxattr(handle vfs.VfsHandle) ([]string, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Getxattr(handle vfs.VfsHandle, s string, bytes []byte) (int, error) { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Setxattr(handle vfs.VfsHandle, s string, bytes []byte) error { + //TODO implement me + panic("implement me") +} + +func (m *mfsSmbFs) Removexattr(handle vfs.VfsHandle, s string) error { + //TODO implement me + panic("implement me") +} + +var _ vfs.VFSFileSystem = &mfsSmbFs{} + +func getNodeFromPath(ctx context.Context, mr *mfs.Root, p string) (format.Node, error) { + switch { + case strings.HasPrefix(p, "/ipfs/"): + //return api.ResolveNode(ctx, path.New(p)) + panic("todo") + default: + fsn, err := mfs.Lookup(mr, p) + if err != nil { + return nil, err + } + + return fsn.GetNode() + } +} + +// todo grep log use of closed file From 6f04e1b8a88825d227482a4fb2624c264691c645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 10:25:11 +0100 Subject: [PATCH 02/12] more smb --- smbtst/smb.go | 259 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 245 insertions(+), 14 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 9cbde84..b54e2fb 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -5,19 +5,27 @@ package smbtst import ( "context" + "errors" "fmt" dag "github.com/ipfs/boxo/ipld/merkledag" ft "github.com/ipfs/boxo/ipld/unixfs" "github.com/ipfs/boxo/mfs" + "github.com/ipfs/go-cid" format "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log/v2" "github.com/macos-fuse-t/go-smb2/vfs" + mh "github.com/multiformats/go-multihash" "golang.org/x/xerrors" + "io" "os" + gopath "path" "strings" "sync" "time" ) +var log = logging.Logger("mfssmb") + const ( blockSize = 4092 volSize = 400 << 50 @@ -33,21 +41,44 @@ const ( ioSize = 256 << 20 ) +var v1CidPrefix = cid.Prefix{ + Codec: cid.DagProtobuf, + MhLength: -1, + MhType: mh.SHA2_256, + Version: 1, +} + var fileTime = time.Date(2020, 10, 14, 0, 0, 0, 0, time.UTC) type mfsSmbFs struct { mr *mfs.Root - fdlk sync.Mutex - fds map[vfs.VfsHandle]*mfsHandle + fdlk sync.Mutex + fdctr vfs.VfsHandle + fds map[vfs.VfsHandle]*mfsHandle } type mfsHandle struct { lk sync.Mutex + mr *mfs.Root + mfdf mfs.FileDescriptor // if file + mfdi *mfs.Directory // if dir + path string } +func (m *mfsSmbFs) allocHandle(fh *mfsHandle) vfs.VfsHandle { + m.fdlk.Lock() + defer m.fdlk.Unlock() + + out := m.fdctr + m.fdctr++ + + m.fds[out] = fh + return out +} + func (m *mfsSmbFs) getOpenHandle(handle vfs.VfsHandle) (*mfsHandle, func(), error) { m.fdlk.Lock() hnd, ok := m.fds[handle] @@ -144,12 +175,15 @@ func (m *mfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { } func (m *mfsSmbFs) FSync(handle vfs.VfsHandle) error { - hnd, done, err := m.getOpenHandle(handle) + /*hnd, done, err := m.getOpenHandle(handle) if err != nil { return err } defer done() + */ + + panic("impl") } func (m *mfsSmbFs) Flush(handle vfs.VfsHandle) error { @@ -157,9 +191,132 @@ func (m *mfsSmbFs) Flush(handle vfs.VfsHandle) error { panic("implement me") } -func (m *mfsSmbFs) Open(s string, i int, i2 int) (vfs.VfsHandle, error) { - //TODO implement me - panic("implement me") +func (m *mfsSmbFs) Open(name string, flag int, perm int) (vfs.VfsHandle, error) { + return m.open(name, flag, perm, false) // todo allow dir?? +} + +func (m *mfsSmbFs) open(name string, flag int, perm int, mustDir bool) (vfs.VfsHandle, error) { + log.Errorw("OPEN FILE", "name", name, "flag", flag, "perm", perm) + + path, err := checkPath(name) + if err != nil { + return 0, err + } + + create := flag&os.O_CREATE != 0 + truncate := flag&os.O_TRUNC != 0 + exclusive := flag&os.O_EXCL != 0 + write := flag&os.O_WRONLY != 0 || flag&os.O_RDWR != 0 + read := flag&os.O_RDWR != 0 + app := flag&os.O_APPEND != 0 + flush := flag&os.O_SYNC != 0 + + if flag == os.O_RDONLY { // read only (O_RDONLY is 0x0) + read = true + } + + _ = exclusive + + var fi *mfs.File + + target, err := mfs.Lookup(m.mr, path) + switch err { + case nil: + var ok bool + fi, ok = target.(*mfs.File) + if !ok { + _, isdir := target.(*mfs.Directory) + if !isdir { + return 0, xerrors.Errorf("file '%s' is neither a file or a directory", path) + } + if !mustDir { + return 0, xerrors.Errorf("can open a dir as a file") + } + return m.allocHandle(&mfsHandle{ + mr: m.mr, + mfdf: nil, + mfdi: target.(*mfs.Directory), + path: path, + }), nil + } + + case os.ErrNotExist: + if !create || mustDir { + return 0, err + } + + // if create is specified and the file doesn't exist, we create the file + dirname, fname := gopath.Split(path) + pdir, err := getParentDir(m.mr, dirname) + if err != nil { + return 0, err + } + + nd := dag.NodeWithData(ft.FilePBData(nil, 0)) + nd.SetCidBuilder(v1CidPrefix) + err = pdir.AddChild(fname, nd) + if err != nil { + return 0, err + } + + fsn, err := pdir.Child(fname) + if err != nil { + return 0, err + } + + var ok bool + fi, ok = fsn.(*mfs.File) + if !ok { + return 0, xerrors.New("expected *mfs.File, didn't get it. This is likely a race condition") + } + default: + return 0, err + } + + fi.RawLeaves = true + + fd, err := fi.Open(mfs.Flags{Read: read, Write: write, Sync: flush}) + if err != nil { + return 0, xerrors.Errorf("mfsfile open (%t %t %t, %x): %w", read, write, flush, flag, err) + } + + if truncate { + if err := fd.Truncate(0); err != nil { + return 0, xerrors.Errorf("truncate: %w", err) + } + } + + seek := io.SeekStart + if app { + seek = io.SeekEnd + } + + _, err = fd.Seek(0, seek) + if err != nil { + return 0, xerrors.Errorf("mfs open seek: %w", err) + } + + return m.allocHandle(&mfsHandle{ + mr: m.mr, + + mfdf: fd, + mfdi: nil, + + path: path, + }), nil +} + +func getParentDir(root *mfs.Root, dir string) (*mfs.Directory, error) { + parent, err := mfs.Lookup(root, dir) + if err != nil { + return nil, err + } + + pdir, ok := parent.(*mfs.Directory) + if !ok { + return nil, xerrors.New("expected *mfs.Directory, didn't get it. This is likely a race condition") + } + return pdir, nil } func (m *mfsSmbFs) Close(handle vfs.VfsHandle) error { @@ -173,9 +330,11 @@ func (m *mfsSmbFs) Lookup(handle vfs.VfsHandle, s string) (*vfs.Attributes, erro } func (m *mfsSmbFs) Mkdir(s string, mode int) (*vfs.Attributes, error) { + panic("mkparents") + err := mfs.Mkdir(m.mr, s, mfs.MkdirOpts{ Mkparents: false, - Flush: false, + Flush: true, }) if err != nil { return nil, xerrors.Errorf("mfs mkdir: %w", err) @@ -193,14 +352,72 @@ func (m *mfsSmbFs) Write(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (i panic("implement me") } -func (m *mfsSmbFs) OpenDir(s string) (vfs.VfsHandle, error) { - //TODO implement me - panic("implement me") +func (m *mfsSmbFs) OpenDir(name string) (vfs.VfsHandle, error) { + return m.open(name, 0, 0, true) } -func (m *mfsSmbFs) ReadDir(handle vfs.VfsHandle, i int, i2 int) ([]vfs.DirInfo, error) { - //TODO implement me - panic("implement me") +var errHalt = errors.New("halt readdir") + +func (m *mfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs.DirInfo, error) { + hnd, done, err := m.getOpenHandle(handle) + if err != nil { + return nil, err + } + defer done() + + if hnd.mfdi == nil { + return nil, xerrors.Errorf("not a directory") + } + + var out []vfs.DirInfo + + // todo fd dir pos AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + err = hnd.mfdi.ForEachEntry(context.TODO(), func(nl mfs.NodeListing) error { + if pos > 0 { + pos-- + return nil + } + + if maxEntries == 0 { + return errHalt + } + + if maxEntries > 0 { + maxEntries-- + } + + var a vfs.DirInfo + a.Name = nl.Name + + mode := os.FileMode(0644) + if nl.Type == int(mfs.TDir) { + mode = os.FileMode(0755) | os.ModeDir + } + + a.SetInodeNumber(123) // todo this may be very bad) + a.SetSizeBytes(uint64(nl.Size)) + a.SetDiskSizeBytes(uint64(nl.Size)) + a.SetUnixMode(uint32(mode)) + a.SetPermissions(vfs.NewPermissionsFromMode(uint32(mode))) + a.SetAccessTime(fileTime) + a.SetLastDataModificationTime(fileTime) + a.SetBirthTime(fileTime) + a.SetLastStatusChangeTime(fileTime) + + if nl.Type == int(mfs.TDir) { + a.SetFileType(vfs.FileTypeDirectory) + } else { + a.SetFileType(vfs.FileTypeRegularFile) + } + + out = append(out) + return nil + }) + if err != nil && err != errHalt { + return nil, err + } + return out, nil } func (m *mfsSmbFs) Readlink(handle vfs.VfsHandle) (string, error) { @@ -270,4 +487,18 @@ func getNodeFromPath(ctx context.Context, mr *mfs.Root, p string) (format.Node, } } -// todo grep log use of closed file +func checkPath(p string) (string, error) { + if len(p) == 0 { + return "", fmt.Errorf("paths must not be empty") + } + + if p[0] != '/' { + return "", fmt.Errorf("paths must start with a leading slash") + } + + cleaned := gopath.Clean(p) + if p[len(p)-1] == '/' && p != "/" { + cleaned += "/" + } + return cleaned, nil +} From 8acee62a73240c9195466a22a3138d9cb023e052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:23:17 +0100 Subject: [PATCH 03/12] smb: wire up to kuri --- integrations/kuri/ribsplugin/kuboribs.go | 4 + smbtst/smb.go | 102 ++++++++++++++++------- 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/integrations/kuri/ribsplugin/kuboribs.go b/integrations/kuri/ribsplugin/kuboribs.go index af5ed54..0dd068f 100644 --- a/integrations/kuri/ribsplugin/kuboribs.go +++ b/integrations/kuri/ribsplugin/kuboribs.go @@ -3,6 +3,7 @@ package kuboribs import ( "context" "fmt" + "github.com/lotus-web3/ribs/smbtst" "os" lotusbstore "github.com/filecoin-project/lotus/blockstore" @@ -78,6 +79,9 @@ func (p *ribsPlugin) Options(info core.FXNodeInfo) ([]fx.Option, error) { fx.Decorate(RibsFiles), fx.Invoke(StartMfsDav), + + fx.Provide(smbtst.NewMfsSmbFs), + fx.Invoke(smbtst.StartMfsSmbFs), ) return opts, nil } diff --git a/smbtst/smb.go b/smbtst/smb.go index b54e2fb..122c933 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -13,8 +13,10 @@ import ( "github.com/ipfs/go-cid" format "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log/v2" + smb2 "github.com/macos-fuse-t/go-smb2/server" "github.com/macos-fuse-t/go-smb2/vfs" mh "github.com/multiformats/go-multihash" + "go.uber.org/fx" "golang.org/x/xerrors" "io" "os" @@ -50,7 +52,7 @@ var v1CidPrefix = cid.Prefix{ var fileTime = time.Date(2020, 10, 14, 0, 0, 0, 0, time.UTC) -type mfsSmbFs struct { +type MfsSmbFs struct { mr *mfs.Root fdlk sync.Mutex @@ -58,6 +60,45 @@ type mfsSmbFs struct { fds map[vfs.VfsHandle]*mfsHandle } +func NewMfsSmbFs(mr *mfs.Root) (*MfsSmbFs, error) { + return &MfsSmbFs{ + mr: mr, + fds: make(map[vfs.VfsHandle]*mfsHandle), + }, nil +} + +func StartMfsSmbFs(lc fx.Lifecycle, fs *MfsSmbFs) error { + hostname, err := os.Hostname() + if err != nil { + return xerrors.Errorf("getting hostname: %w", err) + } + + srv := smb2.NewServer( + &smb2.ServerConfig{ + AllowGuest: true, + MaxIOReads: 1024, + MaxIOWrites: 1024, + Xatrrs: false, + }, + &smb2.NTLMAuthenticator{ + TargetSPN: "", + NbDomain: hostname, + NbName: hostname, + DnsName: hostname + ".local", + DnsDomain: ".local", + UserPassword: map[string]string{"a": "a"}, + AllowGuest: true, + }, + map[string]vfs.VFSFileSystem{"filecoin": fs}, + ) + + listen := ":4455" + log.Infof("Starting SMB server at %s", listen) + go srv.Serve(listen) + + return nil +} + type mfsHandle struct { lk sync.Mutex @@ -68,7 +109,7 @@ type mfsHandle struct { path string } -func (m *mfsSmbFs) allocHandle(fh *mfsHandle) vfs.VfsHandle { +func (m *MfsSmbFs) allocHandle(fh *mfsHandle) vfs.VfsHandle { m.fdlk.Lock() defer m.fdlk.Unlock() @@ -79,7 +120,7 @@ func (m *mfsSmbFs) allocHandle(fh *mfsHandle) vfs.VfsHandle { return out } -func (m *mfsSmbFs) getOpenHandle(handle vfs.VfsHandle) (*mfsHandle, func(), error) { +func (m *MfsSmbFs) getOpenHandle(handle vfs.VfsHandle) (*mfsHandle, func(), error) { m.fdlk.Lock() hnd, ok := m.fds[handle] if !ok { @@ -94,7 +135,7 @@ func (m *mfsSmbFs) getOpenHandle(handle vfs.VfsHandle) (*mfsHandle, func(), erro }, nil } -func (m *mfsSmbFs) GetAttr(handle vfs.VfsHandle) (*vfs.Attributes, error) { +func (m *MfsSmbFs) GetAttr(handle vfs.VfsHandle) (*vfs.Attributes, error) { hnd, done, err := m.getOpenHandle(handle) if err != nil { return nil, err @@ -157,12 +198,12 @@ func (m *mfsSmbFs) GetAttr(handle vfs.VfsHandle) (*vfs.Attributes, error) { } } -func (m *mfsSmbFs) SetAttr(handle vfs.VfsHandle, attributes *vfs.Attributes) (*vfs.Attributes, error) { +func (m *MfsSmbFs) SetAttr(handle vfs.VfsHandle, attributes *vfs.Attributes) (*vfs.Attributes, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { +func (m *MfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { a := vfs.FSAttributes{} a.SetAvailableBlocks(volBavail) a.SetBlockSize(blockSize) @@ -174,7 +215,7 @@ func (m *mfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { return &a, nil } -func (m *mfsSmbFs) FSync(handle vfs.VfsHandle) error { +func (m *MfsSmbFs) FSync(handle vfs.VfsHandle) error { /*hnd, done, err := m.getOpenHandle(handle) if err != nil { return err @@ -186,16 +227,16 @@ func (m *mfsSmbFs) FSync(handle vfs.VfsHandle) error { panic("impl") } -func (m *mfsSmbFs) Flush(handle vfs.VfsHandle) error { +func (m *MfsSmbFs) Flush(handle vfs.VfsHandle) error { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Open(name string, flag int, perm int) (vfs.VfsHandle, error) { +func (m *MfsSmbFs) Open(name string, flag int, perm int) (vfs.VfsHandle, error) { return m.open(name, flag, perm, false) // todo allow dir?? } -func (m *mfsSmbFs) open(name string, flag int, perm int, mustDir bool) (vfs.VfsHandle, error) { +func (m *MfsSmbFs) open(name string, flag int, perm int, mustDir bool) (vfs.VfsHandle, error) { log.Errorw("OPEN FILE", "name", name, "flag", flag, "perm", perm) path, err := checkPath(name) @@ -319,46 +360,45 @@ func getParentDir(root *mfs.Root, dir string) (*mfs.Directory, error) { return pdir, nil } -func (m *mfsSmbFs) Close(handle vfs.VfsHandle) error { +func (m *MfsSmbFs) Close(handle vfs.VfsHandle) error { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Lookup(handle vfs.VfsHandle, s string) (*vfs.Attributes, error) { +func (m *MfsSmbFs) Lookup(handle vfs.VfsHandle, s string) (*vfs.Attributes, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Mkdir(s string, mode int) (*vfs.Attributes, error) { - panic("mkparents") - +func (m *MfsSmbFs) Mkdir(s string, mode int) (*vfs.Attributes, error) { err := mfs.Mkdir(m.mr, s, mfs.MkdirOpts{ Mkparents: false, Flush: true, }) if err != nil { - return nil, xerrors.Errorf("mfs mkdir: %w", err) + return nil, err } + return nil, nil } -func (m *mfsSmbFs) Read(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (int, error) { +func (m *MfsSmbFs) Read(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (int, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Write(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (int, error) { +func (m *MfsSmbFs) Write(handle vfs.VfsHandle, bytes []byte, u uint64, i int) (int, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) OpenDir(name string) (vfs.VfsHandle, error) { +func (m *MfsSmbFs) OpenDir(name string) (vfs.VfsHandle, error) { return m.open(name, 0, 0, true) } var errHalt = errors.New("halt readdir") -func (m *mfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs.DirInfo, error) { +func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs.DirInfo, error) { hnd, done, err := m.getOpenHandle(handle) if err != nil { return nil, err @@ -420,57 +460,57 @@ func (m *mfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs return out, nil } -func (m *mfsSmbFs) Readlink(handle vfs.VfsHandle) (string, error) { +func (m *MfsSmbFs) Readlink(handle vfs.VfsHandle) (string, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Unlink(handle vfs.VfsHandle) error { +func (m *MfsSmbFs) Unlink(handle vfs.VfsHandle) error { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Truncate(handle vfs.VfsHandle, u uint64) error { +func (m *MfsSmbFs) Truncate(handle vfs.VfsHandle, u uint64) error { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Rename(handle vfs.VfsHandle, s string, i int) error { +func (m *MfsSmbFs) Rename(handle vfs.VfsHandle, s string, i int) error { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Symlink(handle vfs.VfsHandle, s string, i int) (*vfs.Attributes, error) { +func (m *MfsSmbFs) Symlink(handle vfs.VfsHandle, s string, i int) (*vfs.Attributes, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Link(node vfs.VfsNode, node2 vfs.VfsNode, s string) (*vfs.Attributes, error) { +func (m *MfsSmbFs) Link(node vfs.VfsNode, node2 vfs.VfsNode, s string) (*vfs.Attributes, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Listxattr(handle vfs.VfsHandle) ([]string, error) { +func (m *MfsSmbFs) Listxattr(handle vfs.VfsHandle) ([]string, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Getxattr(handle vfs.VfsHandle, s string, bytes []byte) (int, error) { +func (m *MfsSmbFs) Getxattr(handle vfs.VfsHandle, s string, bytes []byte) (int, error) { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Setxattr(handle vfs.VfsHandle, s string, bytes []byte) error { +func (m *MfsSmbFs) Setxattr(handle vfs.VfsHandle, s string, bytes []byte) error { //TODO implement me panic("implement me") } -func (m *mfsSmbFs) Removexattr(handle vfs.VfsHandle, s string) error { +func (m *MfsSmbFs) Removexattr(handle vfs.VfsHandle, s string) error { //TODO implement me panic("implement me") } -var _ vfs.VFSFileSystem = &mfsSmbFs{} +var _ vfs.VFSFileSystem = &MfsSmbFs{} func getNodeFromPath(ctx context.Context, mr *mfs.Root, p string) (format.Node, error) { switch { From c1e8397788b636e592e96e57cc31c1f2f55d6943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:36:19 +0100 Subject: [PATCH 04/12] smb: Lookup --- smbtst/smb.go | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 122c933..811f533 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -113,8 +113,8 @@ func (m *MfsSmbFs) allocHandle(fh *mfsHandle) vfs.VfsHandle { m.fdlk.Lock() defer m.fdlk.Unlock() - out := m.fdctr m.fdctr++ + out := m.fdctr m.fds[out] = fh return out @@ -136,6 +136,8 @@ func (m *MfsSmbFs) getOpenHandle(handle vfs.VfsHandle) (*mfsHandle, func(), erro } func (m *MfsSmbFs) GetAttr(handle vfs.VfsHandle) (*vfs.Attributes, error) { + log.Errorw("GET ATTR", "handle", handle) + hnd, done, err := m.getOpenHandle(handle) if err != nil { return nil, err @@ -147,6 +149,10 @@ func (m *MfsSmbFs) GetAttr(handle vfs.VfsHandle) (*vfs.Attributes, error) { return nil, err } + return m.attrForNode(nd) +} + +func (m *MfsSmbFs) attrForNode(nd format.Node) (*vfs.Attributes, error) { switch n := nd.(type) { case *dag.ProtoNode: d, err := ft.FSNodeFromBytes(n.Data()) @@ -236,9 +242,13 @@ func (m *MfsSmbFs) Open(name string, flag int, perm int) (vfs.VfsHandle, error) return m.open(name, flag, perm, false) // todo allow dir?? } -func (m *MfsSmbFs) open(name string, flag int, perm int, mustDir bool) (vfs.VfsHandle, error) { +func (m *MfsSmbFs) open(name string, flag int, perm int, mustDir bool) (h vfs.VfsHandle, err error) { log.Errorw("OPEN FILE", "name", name, "flag", flag, "perm", perm) + defer func() { + log.Errorw("OPEN FILE DONE", "name", name, "flag", flag, "perm", perm, "h", h, "err", err) + }() + path, err := checkPath(name) if err != nil { return 0, err @@ -365,9 +375,29 @@ func (m *MfsSmbFs) Close(handle vfs.VfsHandle) error { panic("implement me") } -func (m *MfsSmbFs) Lookup(handle vfs.VfsHandle, s string) (*vfs.Attributes, error) { - //TODO implement me - panic("implement me") +func (m *MfsSmbFs) Lookup(handle vfs.VfsHandle, subPath string) (*vfs.Attributes, error) { + log.Errorw("LOOKUP", "handle", handle, "subPath", subPath) + + p := "/" + + if handle != 0 { + hnd, done, err := m.getOpenHandle(handle) + if err != nil { + return nil, err + } + defer done() + + p = hnd.path + } + + p = gopath.Join(p, subPath) + + nd, err := getNodeFromPath(context.TODO(), m.mr, p) + if err != nil { + return nil, err + } + + return m.attrForNode(nd) } func (m *MfsSmbFs) Mkdir(s string, mode int) (*vfs.Attributes, error) { From a90baf5c930fa27f7b92563bd6c82b00955e6eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:36:45 +0100 Subject: [PATCH 05/12] fix log --- smbtst/smb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 811f533..eb1a109 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -93,7 +93,7 @@ func StartMfsSmbFs(lc fx.Lifecycle, fs *MfsSmbFs) error { ) listen := ":4455" - log.Infof("Starting SMB server at %s", listen) + log.Errorf("Starting SMB server at %s", listen) go srv.Serve(listen) return nil From 70645b4bd904724bc4d6ef4dc5619b68d1d7b3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:39:25 +0100 Subject: [PATCH 06/12] smb: Close --- smbtst/smb.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index eb1a109..e767915 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -243,7 +243,7 @@ func (m *MfsSmbFs) Open(name string, flag int, perm int) (vfs.VfsHandle, error) } func (m *MfsSmbFs) open(name string, flag int, perm int, mustDir bool) (h vfs.VfsHandle, err error) { - log.Errorw("OPEN FILE", "name", name, "flag", flag, "perm", perm) + log.Errorw("OPEN FILE", "name", name, "flag", flag, "perm", perm, "mustDir", mustDir) defer func() { log.Errorw("OPEN FILE DONE", "name", name, "flag", flag, "perm", perm, "h", h, "err", err) @@ -371,8 +371,22 @@ func getParentDir(root *mfs.Root, dir string) (*mfs.Directory, error) { } func (m *MfsSmbFs) Close(handle vfs.VfsHandle) error { - //TODO implement me - panic("implement me") + log.Errorw("CLOSE", "handle", handle) + + hnd, done, err := m.getOpenHandle(handle) + if err != nil { + return err + } + defer done() + + if hnd.mfdf != nil { + return hnd.mfdf.Close() + } + if hnd.mfdi != nil { + return hnd.mfdi.Flush() + } + + return nil } func (m *MfsSmbFs) Lookup(handle vfs.VfsHandle, subPath string) (*vfs.Attributes, error) { From d76253f45bb184cef900d5ffaae0a0b69b98dd77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:44:30 +0100 Subject: [PATCH 07/12] smb: More logs --- smbtst/smb.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/smbtst/smb.go b/smbtst/smb.go index e767915..7489df9 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -210,6 +210,8 @@ func (m *MfsSmbFs) SetAttr(handle vfs.VfsHandle, attributes *vfs.Attributes) (*v } func (m *MfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { + log.Errorw("STAT FS", "handle", handle) + a := vfs.FSAttributes{} a.SetAvailableBlocks(volBavail) a.SetBlockSize(blockSize) @@ -222,6 +224,7 @@ func (m *MfsSmbFs) StatFS(handle vfs.VfsHandle) (*vfs.FSAttributes, error) { } func (m *MfsSmbFs) FSync(handle vfs.VfsHandle) error { + log.Errorw("FSYNC", "handle", handle) /*hnd, done, err := m.getOpenHandle(handle) if err != nil { return err @@ -415,6 +418,8 @@ func (m *MfsSmbFs) Lookup(handle vfs.VfsHandle, subPath string) (*vfs.Attributes } func (m *MfsSmbFs) Mkdir(s string, mode int) (*vfs.Attributes, error) { + log.Errorw("MKDIR", "s", s, "mode", mode) + err := mfs.Mkdir(m.mr, s, mfs.MkdirOpts{ Mkparents: false, Flush: true, @@ -443,6 +448,8 @@ func (m *MfsSmbFs) OpenDir(name string) (vfs.VfsHandle, error) { var errHalt = errors.New("halt readdir") func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs.DirInfo, error) { + log.Errorw("READ DIR", "handle", handle, "pos", pos, "maxEntries", maxEntries) + hnd, done, err := m.getOpenHandle(handle) if err != nil { return nil, err @@ -501,6 +508,9 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs if err != nil && err != errHalt { return nil, err } + + log.Errorw("READ DIR DONE", "handle", handle, "pos", pos, "maxEntries", maxEntries, "out", out) + return out, nil } From 70dd6fa8be3079c1f8ffb8b97db60adbd6b3d231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:50:21 +0100 Subject: [PATCH 08/12] smb: Fix readdir --- smbtst/smb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 7489df9..88a2513 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -502,14 +502,14 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs a.SetFileType(vfs.FileTypeRegularFile) } - out = append(out) + out = append(out, a) return nil }) if err != nil && err != errHalt { return nil, err } - log.Errorw("READ DIR DONE", "handle", handle, "pos", pos, "maxEntries", maxEntries, "out", out) + log.Errorw("READ DIR DONE", "handle", handle, "pos", pos, "maxEntries", maxEntries, "out", out, "err", err) return out, nil } From e96e0c3e3152afdf9a2d0a3284661c948292a55e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 13:59:52 +0100 Subject: [PATCH 09/12] smb: Less broken ReadDir --- smbtst/smb.go | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 88a2513..94a523f 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -106,6 +106,8 @@ type mfsHandle struct { mfdf mfs.FileDescriptor // if file mfdi *mfs.Directory // if dir + dirPos int + path string } @@ -450,6 +452,10 @@ var errHalt = errors.New("halt readdir") func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs.DirInfo, error) { log.Errorw("READ DIR", "handle", handle, "pos", pos, "maxEntries", maxEntries) + if pos != 0 { + panic("todo") + } + hnd, done, err := m.getOpenHandle(handle) if err != nil { return nil, err @@ -462,11 +468,44 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs var out []vfs.DirInfo - // todo fd dir pos AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + if maxEntries != 0 && maxEntries < 2 { + return nil, xerrors.Errorf("maxEntries must be 0 or >= 2") + } + + if hnd.dirPos == 0 { + dnd, err := hnd.mfdi.GetNode() + if err != nil { + return nil, xerrors.Errorf("get dir attr: %w", err) + } + + rootAttr, err := m.attrForNode(dnd) + if err != nil { + return nil, xerrors.Errorf("get dir attr: %w", err) + } + + out = append(out, + vfs.DirInfo{ + Name: ".", + Attributes: *rootAttr, + }, + vfs.DirInfo{ + Name: "..", + Attributes: *rootAttr, + }) + + if maxEntries > 0 { + maxEntries -= 2 + } + + hnd.dirPos = 2 + } + + seekPos := hnd.dirPos - 2 + // todo start iter in goroutine for better seq reads err = hnd.mfdi.ForEachEntry(context.TODO(), func(nl mfs.NodeListing) error { - if pos > 0 { - pos-- + if seekPos > 0 { + seekPos-- return nil } @@ -502,6 +541,7 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs a.SetFileType(vfs.FileTypeRegularFile) } + hnd.dirPos++ out = append(out, a) return nil }) @@ -509,7 +549,7 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs return nil, err } - log.Errorw("READ DIR DONE", "handle", handle, "pos", pos, "maxEntries", maxEntries, "out", out, "err", err) + log.Errorw("READ DIR DONE", "handle", handle, "pos", pos, "seekPos", seekPos, "hpos", hnd.dirPos, "maxEntries", maxEntries, "out", out, "err", err) return out, nil } From 6e6371d32ff4186868d319bbfaec0f82cb0b4fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 14:04:36 +0100 Subject: [PATCH 10/12] smb: Handle pos better --- smbtst/smb.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 94a523f..e195abd 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -449,12 +449,8 @@ func (m *MfsSmbFs) OpenDir(name string) (vfs.VfsHandle, error) { var errHalt = errors.New("halt readdir") -func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs.DirInfo, error) { - log.Errorw("READ DIR", "handle", handle, "pos", pos, "maxEntries", maxEntries) - - if pos != 0 { - panic("todo") - } +func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, posFlag int, maxEntries int) ([]vfs.DirInfo, error) { + log.Errorw("READ DIR", "handle", handle, "posFlag", posFlag, "maxEntries", maxEntries) hnd, done, err := m.getOpenHandle(handle) if err != nil { @@ -466,6 +462,12 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs return nil, xerrors.Errorf("not a directory") } + if posFlag != 0 { + // non-zero pos means we want to reset the dir pos + + hnd.dirPos = 0 + } + var out []vfs.DirInfo if maxEntries != 0 && maxEntries < 2 { @@ -549,7 +551,7 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, pos int, maxEntries int) ([]vfs return nil, err } - log.Errorw("READ DIR DONE", "handle", handle, "pos", pos, "seekPos", seekPos, "hpos", hnd.dirPos, "maxEntries", maxEntries, "out", out, "err", err) + log.Errorw("READ DIR DONE", "handle", handle, "posFlag", posFlag, "seekPos", seekPos, "hpos", hnd.dirPos, "maxEntries", maxEntries, "out", out, "err", err) return out, nil } From 3120a2c96aab7620d7b9c1a1d1b55d4f3a2174f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 14:09:47 +0100 Subject: [PATCH 11/12] smb: Return eof in readdir correctly --- smbtst/smb.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smbtst/smb.go b/smbtst/smb.go index e195abd..64e9a00 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -553,6 +553,10 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, posFlag int, maxEntries int) ([ log.Errorw("READ DIR DONE", "handle", handle, "posFlag", posFlag, "seekPos", seekPos, "hpos", hnd.dirPos, "maxEntries", maxEntries, "out", out, "err", err) + if len(out) == 0 { + return nil, io.EOF + } + return out, nil } From 1435d79b502a608a841f804341cf20b6e0943d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sun, 10 Dec 2023 16:18:44 +0100 Subject: [PATCH 12/12] maybe less broken readdir --- smbtst/smb.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/smbtst/smb.go b/smbtst/smb.go index 64e9a00..df30eb0 100644 --- a/smbtst/smb.go +++ b/smbtst/smb.go @@ -519,32 +519,35 @@ func (m *MfsSmbFs) ReadDir(handle vfs.VfsHandle, posFlag int, maxEntries int) ([ maxEntries-- } - var a vfs.DirInfo - a.Name = nl.Name + var dirInfo vfs.DirInfo + dirInfo.Name = nl.Name mode := os.FileMode(0644) if nl.Type == int(mfs.TDir) { mode = os.FileMode(0755) | os.ModeDir } - a.SetInodeNumber(123) // todo this may be very bad) - a.SetSizeBytes(uint64(nl.Size)) - a.SetDiskSizeBytes(uint64(nl.Size)) - a.SetUnixMode(uint32(mode)) - a.SetPermissions(vfs.NewPermissionsFromMode(uint32(mode))) - a.SetAccessTime(fileTime) - a.SetLastDataModificationTime(fileTime) - a.SetBirthTime(fileTime) - a.SetLastStatusChangeTime(fileTime) + var attr vfs.Attributes + attr.SetInodeNumber(10 + uint64(hnd.dirPos)) // todo this may be very bad) + attr.SetSizeBytes(uint64(nl.Size)) + attr.SetDiskSizeBytes(uint64(nl.Size)) + attr.SetUnixMode(uint32(mode)) + attr.SetPermissions(vfs.NewPermissionsFromMode(uint32(mode))) + attr.SetAccessTime(fileTime) + attr.SetLastDataModificationTime(fileTime) + attr.SetBirthTime(fileTime) + attr.SetLastStatusChangeTime(fileTime) if nl.Type == int(mfs.TDir) { - a.SetFileType(vfs.FileTypeDirectory) + attr.SetFileType(vfs.FileTypeDirectory) } else { - a.SetFileType(vfs.FileTypeRegularFile) + attr.SetFileType(vfs.FileTypeRegularFile) } + dirInfo.Attributes = attr + hnd.dirPos++ - out = append(out, a) + out = append(out, dirInfo) return nil }) if err != nil && err != errHalt {