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 12.17.1

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 12.17.1
File Size Uploaded
oaknut_afs-12.17.1.tar.gz 207.6 kB Details

Built distribution (wheel)

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

Total release size: 366.5 kB

Release files / oaknut_afs-12.17.1.tar.gz

Download URL oaknut_afs-12.17.1.tar.gz
Size 207.6 kB
Tags Source
SHA-256 checksum
How to use checksums
4ccfe26a9535727673d79544c221c1d2cf140f7653350ec014adae950a120a86
BLAKE2b-256 checksum
How to use checksums
2fdb7093a60264c8a2b7446da33b0564d4d4dd00b87e5d4f2f72a1be8f1a7d37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","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-12.17.1-py3-none-any.whl

Download URL oaknut_afs-12.17.1-py3-none-any.whl
Size 159.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
25029b5dfb88543a97a437eac7277d8ccb3b3375c76a15ccbe39794894759351
BLAKE2b-256 checksum
How to use checksums
0ec2d9ec294094696957eb3b7416134934d45e66dab376bb648df5cb0e615da3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","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

13.1.0

2 release files

13.0.0

2 release files

This release

12.17.1 This release

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