Back to home page

EIC code displayed by LXR

 
 

    


Warning, /firebird/pyrobird/README.md is written in an unsupported language. File is not indexed.

0001 # pyrobird
0002 
0003 [![PyPI - Version](https://img.shields.io/pypi/v/pyrobird.svg)](https://pypi.org/project/pyrobird)
0004 [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pyrobird.svg)](https://pypi.org/project/pyrobird)
0005 
0006 -----
0007 
0008 ## Installation
0009 
0010 ```bash
0011 pip install pyrobird
0012 ```
0013 
0014 Optional dependencies:
0015 
0016 - `batch` - install pyppeteer, that allows to make screenshots in batch mode
0017 - `xrootd` - install libraries to read xrootd located files and URLs starting with `root://`
0018 - `test` - install pytest, mainly to run tests in development build
0019 
0020 If installed via pip, `xrootd` library requires compilation, so the system should have cmake,
0021 compiler and some xrootd dependencies installed.
0022 
0023 For debian/ubuntu the packages to install to use xrootd: 
0024 
0025 ```bash
0026 sudo apt install build-essential libxrootd-client-dev cmake zlib1g-dev uuid-dev libssl-dev python3-dev
0027 
0028 ```
0029 
0030 
0031 Development installation 
0032 
0033 ```bash
0034 python -m pip install --editable .[test,batch]
0035 
0036 # with xrootd
0037 python -m pip install --editable .[test,batch,xrootd]
0038 ```
0039 
0040 Running with Gunicorn (development mode)
0041 
0042 ```bash
0043 gunicorn --bind 0.0.0.0:5454 pyrobird.server:flask_app --log-level debug --capture-output
0044 ```
0045 
0046 
0047 ## Contributing
0048 
0049 - [PEP8](https://peps.python.org/pep-0008/) is required
0050 - [Use Numpy style dockstring comments](https://numpydoc.readthedocs.io/en/latest/format.html)
0051 - [pytest](https://docs.pytest.org/en/latest/) is used for unit tests. Aim for comprehensive coverage of the new code.
0052 - Utilize [type hints](https://docs.python.org/3/library/typing.html) wherever is possible to enhance readability and reduce errors.
0053 - Use of specific exceptions for error handling is better. As described in the [Python documentation](https://docs.python.org/3/tutorial/errors.html) rather than general exceptions.
0054 - Contributions are subject to code review. Please submit pull requests (PRs) against the `main` branch for any contributions.
0055 - Manage dependencies appropriately. Add new dependencies to `pyproject.toml`. Provide a justification for new dependencies
0056 
0057 ## Testing
0058 
0059 To install dependencies with testing libraries included 
0060 
0061 ```bash
0062 pip install .[test]
0063 ```
0064 
0065 Navigate to the pyrobird/tests and execute:
0066 
0067 ```bash
0068 pytest
0069 
0070 # To stop immediately on error and enter debugging mode
0071 pytest -x --pdb 
0072 ```
0073 
0074 
0075 ## Development install
0076 
0077 ```
0078 python -m pip install --upgrade --editable  .[test]
0079 ```
0080 
0081 # Pyrobird Server
0082 
0083 This server allows Firebird to work with local files and the local file system as
0084 well as to complement frontend features such as opening XRootD files, etc.
0085 
0086 Serve Firobird locally and have access to files in current directory: 
0087 
0088 ```bash
0089 pyrobird serve
0090 ```
0091 
0092 **pyrobird** (backend) allows **Firebird** (frontend) to access certain files on your system. 
0093 For this reason pyrobird server has multiple endpoints such as `/api/v1/download` 
0094 which allows to download files. There are library files served and by default Firebird
0095 has access to files in your current directory or a directory provided via `--work-path` flag
0096 
0097 
0098 #### **Available Options**
0099 
0100 | Option                     | Short | Type    | Default | Description                                                                                                                                                                                                                                   |
0101 |----------------------------|-------|---------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
0102 | `--allow-any-file`         |       | Flag    | `False` | Allow unrestricted access to download files in the system. When enabled, the server allows downloads of all files which the running user has access to. **Use with caution**: It is considered dangerous in production environments.            |
0103 | `--allow-cors`             |       | Flag    | `False` | Enable CORS for downloaded files. This option should be used if you need to support web applications from different domains accessing the files, such as serving your server from a central Firebird server.                                       |
0104 | `--disable-files`          |       | Flag    | `False` | Disable all file downloads from the server. This option will prevent any file from being downloaded, enhancing security by restricting file access.                                                                                              |
0105 | `--work-path TEXT`         |       | String  | `CWD`   | Set the base directory path for file downloads. Defaults to the current working directory. Use this option to specify where the server should look for files when handling download requests.                                                       |
0106 
0107 
0108 > `--allow-any-file` - allows unrestricted access to download files in a system.
0109 > When enabled, the server allows downloads of all files that user has access to.
0110 > When disabled - only files in `--work-path` and its subdirectories are allowed to be downloaded.
0111 > This option could be considered safe on personal machines with a single user, 
0112 > who runs localhost server in a terminal
0113 > 
0114 > (!) It is considered dangerous in all other cases: farms, interactive nodes, production environments, servers, etc.
0115 > Just think `/etc/passwd` will be accessible through  `localhost:port/api/v1/download?f=/etc/passwd`
0116 > 
0117 > So security wise, it is better to use `--work-path` than `--allow-any-file`
0118 
0119 
0120 - Start server with default settings, Firebird works with files in current directory:
0121    ```bash
0122   pyrobird serve
0123    ```
0124 
0125 - Set where Firebird will take files from:
0126    
0127    ```bash
0128    pyrobird serve --work-path=/home/username/datafiles
0129    ```
0130 
0131    Now if you set file `local://filename.root` in Firebird UI,
0132    the file `/home/username/datafiles/filename.root` will be opened
0133 
0134 
0135 ## API Documentation
0136 
0137 This is technical explanation of what is under the hood of the server part
0138 
0139 ## Features
0140 
0141 - **Secure File Downloading**: Download files with access control to prevent unauthorized access.
0142 - **EDM4eic Event Processing**: Extract and convert specific events from EDM4eic files to JSON.
0143 - **Static File Serving**: Serve frontend assets seamlessly alongside API endpoints.
0144 - **Dynamic Configuration**: Serve configuration files with real-time server information.
0145 - **CORS Support**: Enable Cross-Origin Resource Sharing for specified routes.
0146 
0147 ### Configuration Options
0148 - **DOWNLOAD_PATH**: `str[getcwd()]`, Specifies the directory from which files can be downloaded when using relative paths.
0149 - **PYROBIRD_DOWNLOAD_IS_DISABLED**: `bool[False]` If set to `True`, all download functionalities are disabled.
0150 - **PYROBIRD_DOWNLOAD_IS_UNRESTRICTED**: `bool[False]`, allows unrestricted access to download any file, including sensitive ones.
0151 - **CORS_IS_ALLOWED**: `bool[False]`, If set to `True`, enables Cross-Origin Resource Sharing (CORS) for download routes.
0152 
0153 
0154 
0155 
0156 The API provides endpoints for downloading files, processing EDM4eic events, and serving configuration files. It also includes static file serving for frontend assets.
0157 
0158 ---
0159 
0160 ### Download File
0161 
0162 #### **Endpoint**
0163 
0164 ```
0165 GET /api/v1/download
0166 GET /api/v1/download/<path:filename>
0167 ```
0168 
0169 #### **Description**
0170 
0171 Allows users to download specified files. The download can be restricted based on configuration settings to prevent unauthorized access to sensitive files.
0172 
0173 #### **Parameters**
0174 
0175 - **Query Parameters**:
0176     - `filename` (optional): The name or path of the file to download.
0177     - `f` (optional): An alternative parameter for the filename.
0178 
0179 - **Path Parameters**:
0180     - `filename` (optional): The path of the file to download.
0181 
0182 **Note**: You can provide the filename either as a query parameter or as part of the URL path.
0183 
0184 #### **Usage**
0185 
0186 1. **Download via Query Parameter**
0187 
0188    ```bash
0189    curl -O "http://localhost:5454/api/v1/download?filename=example.txt"
0190    ```
0191 
0192 2. **Download via URL Path**
0193 
0194    ```bash
0195    curl -O "http://localhost:5454/api/v1/download/example.txt"
0196    ```
0197 
0198 #### **Security Considerations**
0199 
0200 - **Access Control**: Ensure that `DOWNLOAD_ALLOW_UNRESTRICTED` is set appropriately to prevent unauthorized access.
0201 - **Path Traversal**: The server sanitizes file paths to prevent directory traversal attacks.
0202 
0203 ---
0204 
0205 ### Open EDM4eic Event
0206 
0207 #### **Endpoint**
0208 
0209 ```
0210 GET /api/v1/convert/edm4eic/<int:event_number>
0211 GET /api/v1/convert/edm4eic/<int:event_number>/<path:filename>
0212 ```
0213 
0214 #### **Description**
0215 
0216 Processes an EDM4eic file to extract a specific event and returns the event data in JSON format. Supports both local and remote files.
0217 
0218 #### **Parameters**
0219 
0220 - **Path Parameters**:
0221     - `event_number` (required): The number of the event to extract.
0222     - `filename` (optional): The path or URL of the EDM4eic file.
0223 
0224 - **Query Parameters**:
0225     - `filename` (optional): The name or path of the file to process.
0226     - `f` (optional): An alternative parameter for the filename.
0227 
0228 **Note**: You can provide the filename either as a query parameter or as part of the URL path.
0229 
0230 #### **Usage**
0231 
0232 1. **Process Local File via Query Parameter**
0233 
0234    ```bash
0235    curl "http://localhost:5454/api/v1/convert/edm4eic/5?filename=path/to/file.edm4eic.root"
0236    ```
0237 
0238 2. **Process Remote File via URL Path**
0239 
0240    ```bash
0241    curl "http://localhost:5454/api/v1/convert/edm4eic/5/http://example.com/data/file.edm4eic.root"
0242    ```
0243 
0244 ### Asset Configuration
0245 
0246 #### **Endpoint**
0247 
0248 ```
0249 GET /assets/config.jsonc
0250 ```
0251 
0252 #### **Description**
0253 
0254 Serves the asset configuration file (`config.jsonc`) with additional server information injected dynamically.
0255 
0256 #### **Usage**
0257 
0258 ```bash
0259 curl "http://localhost:5454/assets/config.jsonc"
0260 ```
0261 
0262 ### Publishing
0263 
0264 ```bash
0265 pip install --upgrade build twine
0266 python -m build && python -m twine upload dist/* 
0267 
0268 # You will have to setup your pip authentication key
0269 ```