Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tftp: add docs #267

Merged
merged 2 commits into from
Feb 10, 2025
Merged

tftp: add docs #267

merged 2 commits into from
Feb 10, 2025

Conversation

bennyz
Copy link
Member

@bennyz bennyz commented Feb 8, 2025

Summary by CodeRabbit

  • Documentation
    • Added new guide covering the TFTP driver setup, configuration parameters (root directory, host, and port), usage examples, and error handling.
    • Enhanced clarity of the API reference with detailed descriptions and examples for TFTP operations like starting the server, uploading files, listing files, and shutting down.
    • Included new documentation for the TFTP driver in the reference section.
    • Introduced new exception classes related to TFTP operations for improved error handling.

Copy link
Contributor

coderabbitai bot commented Feb 8, 2025

Walkthrough

This pull request introduces comprehensive documentation updates for the TFTP driver. A new file, tftp.md, has been added to detail configuration parameters, usage examples, API references, and exception handling. The index.md file has been updated to include this new entry, with a minor formatting change. Additionally, the Tftp class in the driver code received extensive docstring updates for methods and attributes to improve clarity in driver behavior and error management.

Changes

File(s) Change Summary
docs/source/api-reference/drivers/index.md, docs/source/api-reference/drivers/tftp.md Added a new TFTP driver documentation file with API reference, configuration parameters (root_dir, host, port), usage examples, and exception details; updated the table of contents in index.md with a new entry and minor formatting adjustments.
packages/…/driver.py Expanded docstrings for the Tftp class and its methods (start, stop, list_files, put_file, delete_file, check_file_checksum, get_host, get_port), providing detailed descriptions, parameter types, return values, and error handling information.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant TFTPDriver as TFTP Driver
    Client->>TFTPDriver: start()
    TFTPDriver-->>Client: Acknowledgment or TftpError
    Client->>TFTPDriver: list_files()
    TFTPDriver-->>Client: List of files
    Client->>TFTPDriver: put_file(filename, stream, checksum)
    TFTPDriver-->>Client: Success confirmation or Exception
    Client->>TFTPDriver: stop()
    TFTPDriver-->>Client: Server stopped
Loading

Suggested Reviewers

  • mangelajo

Poem

I'm a rabbit with a hop so spry,
New TFTP docs make my spirits fly.
Methods and errors now clearly penned,
A driver refined with each friendly trend.
Through hosts and ports, our code does cheer,
Hoppy updates leap into a bright new year! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (7)
packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py (4)

123-130: Add missing information about server state.

The docstring should mention that the server runs in a separate thread, as this is important for understanding the server's behavior.

 """Start the TFTP server.

 The server will start listening for incoming TFTP requests on the configured
-host and port. If the server is already running, a warning will be logged.
+host and port in a separate thread. If the server is already running, a warning
+will be logged.

 Raises:
     TftpError: If the server fails to start or times out during initialization
 """

150-154: Add missing information about timeout.

The docstring should mention the 10-second timeout for server shutdown, as this is a crucial implementation detail.

 """Stop the TFTP server.

 Initiates a graceful shutdown of the server and waits for all active transfers
-to complete. If the server is not running, a warning will be logged.
+to complete with a 10-second timeout. If the server is not running, a warning
+will be logged.
 """

179-191: Add missing information about path validation.

The docstring should mention that the target path is validated to prevent directory traversal attacks, as this is a key security feature.

 """Upload a file to the TFTP server.

 Args:
     filename (str): Name of the file to create
     src_stream: Source stream to read the file data from
     client_checksum (str): SHA256 checksum of the file for verification

 Returns:
     str: The filename that was uploaded

 Raises:
-    TftpError: If the file upload fails or path validation fails
+    TftpError: If the file upload fails or if the target path is invalid
+             (e.g., attempts to traverse outside the root directory)
 """

234-242: Add missing information about checksum algorithm.

The docstring should specify that SHA256 is used for checksum computation.

 """Check if a file matches the expected checksum.

 Args:
     filename (str): Name of the file to check
-    client_checksum (str): Expected SHA256 checksum
+    client_checksum (str): Expected SHA256 checksum (hexadecimal string)

 Returns:
     bool: True if the file exists and matches the checksum, False otherwise
 """
docs/source/api-reference/drivers/tftp.md (3)

1-6: Add missing information about read-only nature.

The introduction should emphasize that this is a read-only TFTP server, as this is a key limitation.

 # TFTP Driver

 **driver**: `jumpstarter_driver_tftp.driver.Tftp`

-The TFTP driver provides a read-only TFTP server that can be used to serve files.
+The TFTP driver provides a read-only TFTP server that can be used to serve files.
+Note that this implementation only supports serving files and does not allow
+clients to write files to the server.

8-16: Add missing information about host auto-detection.

The configuration example should mention that the host is optional and will be auto-detected if not specified.

 ```yaml
 export:
   tftp:
     type: jumpstarter_driver_tftp.driver.Tftp
     config:
       root_dir: /var/lib/tftpboot  # Directory to serve files from
-      host: 192.168.1.100          # Host IP to bind to (optional)
+      host: 192.168.1.100          # Host IP to bind to (optional, auto-detected if not specified)
       port: 69                     # Port to listen on (optional)

---

`52-68`: **Add error handling example.**

The examples section should include error handling to demonstrate how to handle common exceptions.

```diff
 ### Starting a TFTP server
 ```python
 from jumpstarter_driver_tftp import Tftp
+from jumpstarter_driver_tftp.driver import TftpError, FileNotFound

 # Create and start a TFTP server
 tftp = Tftp(root_dir="/tftpboot", host="192.168.1.100")
-tftp.start()
+try:
+    tftp.start()
+except TftpError as e:
+    print(f"Failed to start server: {e}")
+    exit(1)

 # Upload a file
-tftp.put_file("kernel.img", file_stream, checksum)
+try:
+    tftp.put_file("kernel.img", file_stream, checksum)
+except TftpError as e:
+    print(f"Failed to upload file: {e}")

 # List available files
 files = tftp.list_files()

 # Stop the server
 tftp.stop()

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 03ff9e2403fb5993368bd078d436224f82b0411a and 6aac9e6c07d9c6739188403e96ba9ea85103adab.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `docs/source/api-reference/drivers/index.md` (1 hunks)
* `docs/source/api-reference/drivers/tftp.md` (1 hunks)
* `packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py` (7 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Learnings (1)</summary>

<details>
<summary>docs/source/api-reference/drivers/tftp.md (1)</summary>

Learnt from: bennyz
PR: #241
File: packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/client.py:52-60
Timestamp: 2025-01-29T11:52:43.554Z
Learning: The TFTP driver (packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py) handles all low-level concerns like path validation, error handling, and checksum computation. The client (packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/client.py) should remain simple as it delegates these responsibilities to the driver.


</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (4)</summary>

* GitHub Check: pytest-matrix (3.13)
* GitHub Check: pytest-matrix (3.12)
* GitHub Check: pytest-matrix (3.11)
* GitHub Check: e2e

</details>

<details>
<summary>🔇 Additional comments (2)</summary><blockquote>

<details>
<summary>packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py (1)</summary>

`32-55`: **LGTM! Well-structured class docstring.**

The class docstring is comprehensive and well-organized, including a clear description, attributes section, and practical examples.

</details>
<details>
<summary>docs/source/api-reference/drivers/index.md (1)</summary>

`13-13`: **LGTM! Correctly added to toctree.**

The TFTP driver documentation is properly added to the table of contents.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Signed-off-by: Benny Zlotnik <[email protected]>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (6)
docs/source/api-reference/drivers/tftp.md (2)

50-71: Examples Section – Comprehensive Usage.
The Examples section is thorough and well-organized, walking through the process of creating a temporary file, starting the TFTP server, listing files, and cleaning up. One suggestion is to mention (perhaps via a brief note) the importance of proper error handling around server startup and shutdown in production scenarios.


73-83: Test Setup Block for Documentation Examples.
The test setup block properly creates a persistent temporary directory and initializes the TFTP server using a context manager. This adds reliability to the examples. Consider adding a brief comment in the block to indicate its purpose for clarity.

packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py (4)

135-139: Document potential exceptions in stop() method.

The docstring should document that the method logs an error if the server thread fails to stop within the timeout.

Add the Raises section:

     """Stop the TFTP server.

     Initiates a graceful shutdown of the server and waits for all active transfers
     to complete. If the server is not running, a warning will be logged.
+
+    Raises:
+        RuntimeError: If the server thread fails to stop within the timeout
     """

155-159: Document potential exceptions in list_files() method.

The method could raise exceptions if the root directory is not accessible.

Add the Raises section:

     """List all files available in the TFTP server root directory.

     Returns:
         list[str]: A list of filenames present in the root directory
+
+    Raises:
+        OSError: If the root directory is not accessible
     """

219-227: Document potential exceptions in check_file_checksum() method.

The method could raise exceptions when reading the file.

Add the Raises section:

     """Check if a file matches the expected checksum.

     Args:
         filename (str): Name of the file to check
         client_checksum (str): Expected SHA256 checksum

     Returns:
         bool: True if the file exists and matches the checksum, False otherwise
+
+    Raises:
+        OSError: If the file exists but cannot be read
+        TftpError: If the checksum computation fails
     """

32-40: Add usage examples to class docstring.

Consider adding usage examples to help users understand how to use the driver effectively.

Add an Examples section:

     """TFTP Server driver for Jumpstarter

     This driver implements a TFTP read-only server.

     Attributes:
         root_dir (str): Root directory for the TFTP server. Defaults to "/var/lib/tftpboot"
         host (str): IP address to bind the server to. If empty, will use the default route interface
         port (int): Port number to listen on. Defaults to 69 (standard TFTP port)
+
+    Examples:
+        >>> tftp = Tftp(root_dir="/tmp/tftp")
+        >>> tftp.start()
+        >>> await tftp.put_file("example.txt", source_stream, "checksum")
+        >>> tftp.list_files()
+        ['example.txt']
+        >>> tftp.stop()
     """
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6aac9e6 and 3d5e145.

📒 Files selected for processing (3)
  • docs/source/api-reference/drivers/index.md (1 hunks)
  • docs/source/api-reference/drivers/tftp.md (1 hunks)
  • packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/source/api-reference/drivers/index.md
🧰 Additional context used
📓 Learnings (1)
docs/source/api-reference/drivers/tftp.md (1)
Learnt from: bennyz
PR: jumpstarter-dev/jumpstarter#241
File: packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/client.py:52-60
Timestamp: 2025-01-29T11:52:43.554Z
Learning: The TFTP driver (packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py) handles all low-level concerns like path validation, error handling, and checksum computation. The client (packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/client.py) should remain simple as it delegates these responsibilities to the driver.
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: pytest-matrix (3.13)
  • GitHub Check: pytest-matrix (3.12)
  • GitHub Check: pytest-matrix (3.11)
  • GitHub Check: e2e
🔇 Additional comments (6)
docs/source/api-reference/drivers/tftp.md (6)

1-7: Documentation Header & Introduction.
The header (“# TFTP Driver”) and introductory text clearly indicate the purpose of the document. It succinctly reviews that the driver is read-only and serves files.


8-17: Driver Configuration YAML Block – Verify Default Consistency.
The YAML snippet clearly shows the configuration for the TFTP driver. However, note that the “host” field is hard-coded as “192.168.1.100” in this snippet while the parameters table (lines 22–25) specifies the default as “auto-detect”. Please verify and update the default value in one of the sections so that both are consistent.


18-25: Config Parameters Table Clarity.
The table is well formatted and provides clear details regarding each configuration parameter. Just ensure that the default values (especially for “host”) accurately reflect the intended configuration when compared with the YAML example.


26-32: TftpServerClient API Documentation.
The use of the Sphinx autodoc directive for documenting “jumpstarter_driver_tftp.client.TftpServerClient” is correctly implemented. This ensures that any updates to the client’s API are automatically reflected in the docs, keeping the reference up-to-date.


34-48: Exception Classes Documentation.
The sections for documenting the exception classes (TftpError, ServerNotRunning, FileNotFound) are clearly laid out with consistent formatting using the autodoc directives. This structured approach will help users quickly understand error handling in the driver.


85-89: Test Cleanup Block.
The cleanup block correctly ensures that the test environment is properly dismantled by calling exit on the instance and removing the temporary directory safely with rmtree. This helps in avoiding leftover artifacts after tests run.

Comment on lines +32 to +40
"""TFTP Server driver for Jumpstarter

This driver implements a TFTP read-only server.

Attributes:
root_dir (str): Root directory for the TFTP server. Defaults to "/var/lib/tftpboot"
host (str): IP address to bind the server to. If empty, will use the default route interface
port (int): Port number to listen on. Defaults to 69 (standard TFTP port)
"""
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Update docstring to accurately reflect server capabilities.

The docstring states this is a "read-only server", but the implementation includes write operations (put_file, delete_file). This inconsistency could mislead users.

Update the docstring to accurately reflect the server's capabilities:

-    This driver implements a TFTP read-only server.
+    This driver implements a TFTP server supporting both read and write operations.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"""TFTP Server driver for Jumpstarter
This driver implements a TFTP read-only server.
Attributes:
root_dir (str): Root directory for the TFTP server. Defaults to "/var/lib/tftpboot"
host (str): IP address to bind the server to. If empty, will use the default route interface
port (int): Port number to listen on. Defaults to 69 (standard TFTP port)
"""
"""TFTP Server driver for Jumpstarter
- This driver implements a TFTP read-only server.
+ This driver implements a TFTP server supporting both read and write operations.
Attributes:
root_dir (str): Root directory for the TFTP server. Defaults to "/var/lib/tftpboot"
host (str): IP address to bind the server to. If empty, will use the default route interface
port (int): Port number to listen on. Defaults to 69 (standard TFTP port)
"""

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the server is read only though. the upload is done via the driver client, not the tftp server.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bennyz I apologize for my confusion. You are absolutely correct - I now understand that while the driver provides file management capabilities through its client interface, the TFTP server itself is indeed read-only. The current docstring accurately reflects this architecture. Thank you for the clarification.


✏️ Learnings added
Learnt from: bennyz
PR: jumpstarter-dev/jumpstarter#267
File: packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py:32-40
Timestamp: 2025-02-08T16:08:34.480Z
Learning: In the TFTP driver (jumpstarter_driver_tftp), the TFTP server component is read-only, while file management operations (upload, delete) are handled through the driver's client interface, not through the TFTP protocol itself.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
docs/source/api-reference/drivers/tftp.md (4)

7-17: Driver Configuration YAML Example

The YAML snippet under "## Driver Configuration" is well-formatted and demonstrates the expected structure. However, note that the host parameter is set to 192.168.1.100 here, which later conflicts with the table default of "auto-detect".

Consider updating the YAML example or the parameter table so that both consistently reflect the intended default value for host.


18-25: Configuration Parameters Table Consistency

The parameters table clearly describes each configuration option. There is a discrepancy for the host parameter: the YAML snippet uses a hardcoded IP (192.168.1.100), while the table lists its default as "auto-detect". Ensure that the documentation reflects the correct default value.


50-72: Usage Examples Clarity

The examples provided in the doctest block effectively demonstrate a typical use-case of starting a TFTP server, listing files, and shutting down properly.

As a suggestion, consider adding an example on handling exceptions (such as a TftpError) to guide users on error management.


84-89: Test Cleanup Block

The {testcleanup} block cleanly handles resource deallocation by calling instance.__exit__ and removing the temporary directory.

For increased robustness, you might consider wrapping the cleanup in a try-finally construct to ensure that resources are freed even if an error occurs.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3d5e145 and f0f240e.

📒 Files selected for processing (1)
  • docs/source/api-reference/drivers/tftp.md (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
docs/source/api-reference/drivers/tftp.md (2)
Learnt from: bennyz
PR: jumpstarter-dev/jumpstarter#267
File: packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py:32-40
Timestamp: 2025-02-08T16:08:34.616Z
Learning: In the TFTP driver (jumpstarter_driver_tftp), the TFTP server component is read-only, while file management operations (upload, delete) are handled through the driver's client interface, not through the TFTP protocol itself.
Learnt from: bennyz
PR: jumpstarter-dev/jumpstarter#241
File: packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/client.py:52-60
Timestamp: 2025-01-29T11:52:43.554Z
Learning: The TFTP driver (packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/driver.py) handles all low-level concerns like path validation, error handling, and checksum computation. The client (packages/jumpstarter-driver-tftp/jumpstarter_driver_tftp/client.py) should remain simple as it delegates these responsibilities to the driver.
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: e2e
🔇 Additional comments (6)
docs/source/api-reference/drivers/tftp.md (6)

1-2: Document Title - Clear and Descriptive

The header "# TFTP Driver" immediately communicates the purpose of this documentation.


3-4: Driver Reference Clarity

The bold driver reference "driver: jumpstarter_driver_tftp.driver.Tftp" is concise and clearly points users to the relevant module.


5-6: Driver Description

The brief description succinctly explains that the driver provides a read-only TFTP server. This is consistent with the read-only nature noted in previous learnings.


26-32: TftpServerClient API Documentation

The autodoc directive for the TftpServerClient is implemented correctly with :members: and :show-inheritance:.

Note: In previous reviews (e.g., NickCao’s comment), it was suggested to hide irrelevant __init__ parameters. You might consider adding an :exclude-members: directive if those details are not necessary for the reader.


34-49: Exception Classes Documentation

The sections for Exception Classes using reStructuredText directives are clear and comprehensive. The use of :members: and :show-inheritance: ensures that developers have visibility into the class details.


73-83: Test Setup Block

The {testsetup} block is clear and well-organized. It appropriately creates a persistent temporary directory and initializes the TFTP server for testing.

@bennyz bennyz requested review from NickCao and mangelajo February 10, 2025 15:06
@NickCao NickCao merged commit b7ad12c into jumpstarter-dev:main Feb 10, 2025
10 checks passed
@bennyz bennyz deleted the tftp-docs branch February 10, 2025 15:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants