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.2.0

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.2.0
File Size Uploaded
oaknut_afs-13.2.0.tar.gz 209.7 kB Details

Built distribution (wheel)

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

Total release size: 369.6 kB

Release files / oaknut_afs-13.2.0.tar.gz

Download URL oaknut_afs-13.2.0.tar.gz
Size 209.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a4322cc99f415a5aa8b678076b9500e11ace2bc1f04952a9080a3ffb73f45c18
BLAKE2b-256 checksum
How to use checksums
9eb5a3ffdf9cd92fd71925a69d46ba4d373932766ef832787e14c9ab73c3369a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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.2.0-py3-none-any.whl

Download URL oaknut_afs-13.2.0-py3-none-any.whl
Size 159.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a03d8de945ba41b464094de2fb4fcaf99f0b9bdcf4c2ba616c8c20f78ed00bf5
BLAKE2b-256 checksum
How to use checksums
7f70137f5bd18960ddaebb23f3347894306fa55a03db9ed084c0fcf498b7a5a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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.2.0 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