Skip to main content

oaknut-afs

PyPI version CI Python versions License: MIT

A Python library for reading, writing, and creating Acorn Level 3 File Server (AFS) disc partitions — the private on-disc filesystem the Level 3 File Server served to BBC Micro, Master, and Archimedes clients over Econet.

AFS is a hierarchical, multi-user filesystem: it has real directories, a per-file owner and public access model, and a $.Passwords file of user accounts. It is identified by the AFS0 magic in its info sectors.

Part of a dual-partition disc. An AFS filesystem does not occupy a disc alone — it lives in the tail cylinders of an old-map ADFS disc. The real WFSINIT utility (and oaknut's initialise()) shrinks the ADFS partition and carves the AFS region out of the space freed. oaknut-afs reads and writes that region; oaknut-adfs handles the host.

Part of the oaknut monorepo.

What it does

  • Read and write an AFS partition: browse the directory tree, read and write files, create and remove directories, and edit metadata (owner and public access, the native two-byte datestamp).
  • Partition and initialise (initialise()): the WFSINIT analogue — repartition an old-map ADFS disc and lay down an empty AFS filesystem in the tail, with its map, root, and $.Passwords file.
  • Manage users (UserSpec, PasswordsFile): create accounts with passwords and disc-space allocations; the built-in Syst, Boot, and Welcome accounts are handled.
  • Import a host tree (import_host_tree()): populate a new filesystem from a directory of files with .inf sidecars.
  • Merge (merge()) two AFS partitions, and emplace shipped libraries (SHIPPED_LIBRARIES) such as the standard Library.

Passwords are stored as the file server stored them: up to six cleartext ASCII bytes in $.Passwords, with no encryption — oaknut reproduces the format faithfully rather than obscuring it.

Installation

uv add oaknut-afs         # or: pip install oaknut-afs

oaknut-afs works with any PEP 517 build front-end and package manager; the examples use uv.

Usage

Creating and populating a filesystem

from oaknut.afs import AFS, UserSpec

with AFS.create_file(
    "server.dat",
    capacity="10MB",
    disc_name="Server",
    users=[UserSpec(name="RJS", quota="2MB")],
) as afs:
    # Creating the RJS account also creates its home directory, $.RJS.
    (afs.root / "RJS" / "ReadMe").write_text("Welcome to the file server.\n")

Reading

from oaknut.afs import AFS

with AFS.from_file("server.dat") as afs:
    for entry in afs.root.iterdir():
        print(entry.name)
    text = (afs.root / "RJS" / "ReadMe").read_text()

For dual ADFS + AFS discs, the disc CLI reaches the AFS partition through the ADFS host with an afs: prefix (disc ls 'server.dat:afs:$'), routed by content identification.

Development

The package is developed in the oaknut workspace. From the repository root:

uv sync                                  # install all workspace members editable
uv run pytest packages/oaknut-afs/tests  # this package's tests
uv run ruff check                        # lint

Architecture

oaknut-afs depends on oaknut-adfs (to place and read the partition within its ADFS host), oaknut-discimage, and oaknut-file, and contributes AFS to the oaknut.filesystem extension axis so that AFS partitions are identified, listed, and read through the disc CLI alongside the disc-based filing systems. Sector-level access comes from oaknut-discimage; metadata and the acorn codec from oaknut-file.

Further reading

License

MIT — see LICENSE.

Metadata

Release files for oaknut-afs 13.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oaknut-afs 13.1.2
File Size Uploaded
oaknut_afs-13.1.2.tar.gz 209.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oaknut-afs 13.1.2
File Interpreter ABI Platform
oaknut_afs-13.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 368.7 kB

Release files / oaknut_afs-13.1.2.tar.gz

Download URL oaknut_afs-13.1.2.tar.gz
Size 209.0 kB
Tags Source
SHA-256 checksum
How to use checksums
f261ee6e63bc42194b973a4b8b9e43061c563cb01ff40ac6f649c06e25e33ea6
BLAKE2b-256 checksum
How to use checksums
d0f5e45b2be7be45852d1089cdbac67ccc60a14079bb60f6be9d3f4d463fbaf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / oaknut_afs-13.1.2-py3-none-any.whl

Download URL oaknut_afs-13.1.2-py3-none-any.whl
Size 159.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
208285130c2cc54b7757263843ff190fe6d9808c178a84552292dcfbdd22cc13
BLAKE2b-256 checksum
How to use checksums
c20f4bf6cb7ebb278e42f60054a4dbcc313cc55b15e9e3d129657f000d204e46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

13.4.0

2 release files

13.3.1

2 release files

This release

13.1.2 This release

2 release files

13.1.0

2 release files

13.0.0

2 release files

12.9.0

2 release files

12.8.2

2 release files

12.8.1

2 release files

12.8.0

2 release files

12.7.2

2 release files

12.7.1

2 release files

12.7.0

2 release files

12.5.0

2 release files

12.4.1

2 release files

12.4.0

2 release files

12.3.0

2 release files

12.2.0

2 release files

12.1.0

2 release files

12.0.1

2 release files

12.0.0

2 release files

11.2.0

2 release files

11.1.0

2 release files

11.0.2

2 release files

11.0.1

2 release files

11.0.0

2 release files

10.7.0

2 release files

10.6.0

2 release files

10.5.0

2 release files

10.4.0

2 release files

10.3.0

2 release files

10.2.0

2 release files

10.1.0

2 release files

10.0.5

2 release files

10.0.4

2 release files

10.0.3

2 release files

10.0.2

2 release files

10.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page