binary data gets treated as base64
JSON, TOML, YAML file -> file system hierarchy
# puts the foo data into the bar directory (making bar if it doesn't exist)
cat foo.json | unpack --into bar
# puts the foo data into the foo directory (making foo if it doesn't exists)
unpack foo.json
# in both of those, it's an error if foo or bar exist and are non-empty
# unpack stdin (coming from baz) into quux, treating input as YAML
cat baz | unpack -s yaml --into quux
src/format.rs describes mappings from these formats into the Nodelike
trait
-
get JSON to work by hand
write some tests
-
get other formats work using
Nodelike
-
wrinkle: YAML has a special notion of anchor that would be cool to treat as a sym- or hardlink problem not actually worth thinking about
write some more tests
-
-
implement options
--debug --exact --no-xattr --quiet --time --unpadded --munge --dirmode, --mode, --gid, --uid -s, --source # rename to -t, --type ? -m, --mount # rename to -i, --into ?
write tests of unpack write separate tests that compare ffs and unpack's behavior
diff -r
might do the trick xattr/uid/gid/mtime/etc. stuff is a bit more subtle
-
read semi-structured data
- default to stdin
- but take a file (many files?!)
output is... at a default mountpoint, or at a directory based on the filename follow ffs lead here
-
options that matter
-
build the directory tree, write the data, set some xattrs as necessary, that's it
-
test
follow the general lead of run_tests.sh and tests/*.sh
how do we ensure that we don't hose the system?
in docker? in
chroot
? withpivot_root
?
file system hierarchy -> JSON, TOML, YAML file
# save /etc into a JSON file
pack /etc >config.json
pack -o lib.yaml /usr/share/lib
# -t specifying target type
pack -t toml . >bar.toml
-
get it to work for just JSON
-
wrinkle: special file types (devices, FIFOs, etc.) what does tar do? gunzip unzip and one other to see what's standard
-
wrinkle: permissions
pack -o everything.json /
what does tar etc. do? -
wrinkle: hard and symlinks
hardlinks are just files... worst case we copy would be cool in YAML to have them be anchors
symlinks can cause loops, can go outside of the root specified, etc. cf.
cp
,tar
,find
optionscp -L
to specify following symlinks,--nofollow
but also: don't infinite loop PATH_MAXi think there are good rust libraries for filesystem traversal
-
-
get it to work for
Nodelike
-
implement options that matter
--debug --keep-macos-xattr --pretty --time --munge --exact --quite --target --output
ffs and pack/unpack should behave as identically as possible we should explicitly test this on fixed and maybe also random inputs
generate random inputs and run unpack on them
generate random filesystems and run pack on them (or run pack on random points in the FS)
fuzz ffs itself?
-
think about ramdisks
-
compare pack/unpack and ffs in a bunch of ways lol