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