pax_global_header00006660000000000000000000000064146762365140014530gustar00rootroot0000000000000052 comment=8799b9f5d8f05b3ce263900bf29d623eb96bd71f py-synologydsm-api-2.5.3/000077500000000000000000000000001467623651400153235ustar00rootroot00000000000000py-synologydsm-api-2.5.3/.darglint000066400000000000000000000000361467623651400171270ustar00rootroot00000000000000[darglint] strictness = short py-synologydsm-api-2.5.3/.devcontainer/000077500000000000000000000000001467623651400200625ustar00rootroot00000000000000py-synologydsm-api-2.5.3/.devcontainer/Dockerfile000066400000000000000000000004731467623651400220600ustar00rootroot00000000000000FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.9 # install test requirements COPY requirements*.txt /tmp/pip-tmp/ RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements_dev.txt \ && rm -rf /tmp/pip-tmp # Set the default shell to bash instead of sh ENV SHELL /bin/bash py-synologydsm-api-2.5.3/.devcontainer/devcontainer.json000066400000000000000000000023331467623651400234370ustar00rootroot00000000000000{ "name": "Python Synology DSM API", "context": "..", "dockerFile": "Dockerfile", "postCreateCommand": "scripts/setup", "containerEnv": { "DEVCONTAINER": "1" }, "runArgs": ["-e", "GIT_EDITOR=code --wait"], "customizations": { "vscode": { "extensions": [ "ms-python.vscode-pylance", "ms-python.black-formatter", "ms-python.pylint", "ms-python.mypy-type-checker", "visualstudioexptteam.vscodeintellicode", "esbenp.prettier-vscode" ], // Please keep this file in sync with settings in .vscode/settings.default.json "settings": { "python.pythonPath": "/usr/local/bin/python", "python.testing.pytestArgs": ["tests"], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "mypy-type-checker.args": ["--config-file=pyproject.toml"], "editor.formatOnPaste": false, "editor.formatOnSave": true, "editor.formatOnType": true, "files.trimTrailingWhitespace": true, "terminal.integrated.profiles.linux": { "zsh": { "path": "/usr/bin/zsh" } }, "terminal.integrated.defaultProfile.linux": "zsh" } } } } py-synologydsm-api-2.5.3/.flake8000066400000000000000000000010341467623651400164740ustar00rootroot00000000000000[flake8] select = B,B9,C,D,DAR,E,F,N,RST,S,W # Some rules are ignore on top of the standard ones. # C901 (complexity) will be processed in a dedicated PR # DARxxx (documentation in docstrings) will be processed in a dedicated PR # Final target is: # ignore = E203,E501,RST201,RST203,RST301,W503 ignore = E203,E501,RST201,RST203,RST301,W503,C901,DAR101,DAR201,N818 max-line-length = 80 max-complexity = 10 docstring-convention = google per-file-ignores = tests/*:S101,S105 tests/**/const_*.py:B950 src/synology_dsm/const.py:B950 py-synologydsm-api-2.5.3/.gitattributes000066400000000000000000000000231467623651400202110ustar00rootroot00000000000000* text=auto eol=lf py-synologydsm-api-2.5.3/.github/000077500000000000000000000000001467623651400166635ustar00rootroot00000000000000py-synologydsm-api-2.5.3/.github/CODEOWNERS000066400000000000000000000006411467623651400202570ustar00rootroot00000000000000* @mib1185 .github/* @oncleben31 .darglint @oncleben31 .flake8 @oncleben31 */surveillance_station/* @shenxn src/synology_dsm/api/core/share.py @Gestas src/synology_dsm/api/core/system.py @mib1185 src/synology_dsm/api/core/upgrade.py @mib1185 tests/api_data/dsm_6/core/const_6_core_share.py @Gestas tests/api_data/dsm_6/core/const_6_core_system.py @mib1185 tests/api_data/dsm_6/core/const_6_core_upgrade.py @mib1185 py-synologydsm-api-2.5.3/.github/dependabot.yml000066400000000000000000000004711467623651400215150ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: github-actions directory: "/" schedule: interval: monthly groups: gh-actions: patterns: ["*"] - package-ecosystem: pip directory: "/" schedule: interval: monthly groups: pip-dependencies: patterns: ["*"] py-synologydsm-api-2.5.3/.github/release-drafter.yml000066400000000000000000000014101467623651400224470ustar00rootroot00000000000000categories: - title: ":boom: Breaking Changes" label: "breaking" - title: ":rocket: Features" label: "enhancement" - title: ":fire: Removals and Deprecations" label: "removal" - title: ":beetle: Fixes" labels: - "bug" - "bugfix" - title: ":racehorse: Performance" label: "performance" - title: ":rotating_light: Testing" label: "testing" - title: ":construction_worker: Continuous Integration" label: "ci" - title: ":books: Documentation" label: "documentation" - title: ":hammer: Refactoring" label: "refactoring" - title: ":lipstick: Style" label: "style" - title: ":package: Dependencies" collapse-after: 1 labels: - "dependencies" - "build" template: | ## Changes $CHANGES py-synologydsm-api-2.5.3/.github/workflows/000077500000000000000000000000001467623651400207205ustar00rootroot00000000000000py-synologydsm-api-2.5.3/.github/workflows/release.yml000066400000000000000000000053611467623651400230700ustar00rootroot00000000000000name: Release on: push: branches: - main - master jobs: release: name: Release runs-on: ubuntu-latest permissions: contents: write id-token: write pull-requests: read steps: - name: Check out the repository uses: actions/checkout@v4.2.0 with: fetch-depth: 2 - name: Set up Python uses: actions/setup-python@v5.2.0 with: python-version: "3.12" - name: Install build dependencies run: | python -m pip install --upgrade pip pip install setuptools wheel build - name: Check if there is a parent commit id: check-parent-commit run: | echo "::set-output name=sha::$(git rev-parse --verify --quiet HEAD^)" - name: Detect and tag new version id: check-version if: steps.check-parent-commit.outputs.sha uses: salsify/action-detect-and-tag-new-version@v2.0.3 with: version-command: | sed -n 's/version = \"\(.*\)\"/\1/p' pyproject.toml - name: Bump version for developmental release if: "! steps.check-version.outputs.tag" run: | sed "s/version = \"\(.*\)\"/version = \"\1\.dev\.`date +%Y%m%d%H%M%S`\"/" -i pyproject.toml - name: Build package run: | python -m build . --wheel - name: Publish package on PyPI if: steps.check-version.outputs.tag uses: pypa/gh-action-pypi-publish@v1.10.2 with: user: __token__ password: ${{ secrets.PYPI_TOKEN }} - name: Publish package on TestPyPI if: "! steps.check-version.outputs.tag" uses: pypa/gh-action-pypi-publish@v1.10.2 with: user: __token__ password: ${{ secrets.TEST_PYPI_TOKEN }} repository-url: https://test.pypi.org/legacy/ - name: Publish release notes uses: release-drafter/release-drafter@v6.0.0 with: publish: ${{ steps.check-version.outputs.tag != '' }} tag: ${{ steps.check-version.outputs.tag }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} analyze: name: Analyze if: ${{ !contains(github.ref, 'dependabot') }} runs-on: ubuntu-latest needs: release permissions: actions: read contents: read security-events: write strategy: fail-fast: false steps: - name: Checkout repository uses: actions/checkout@v4.2.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: python setup-python-dependencies: true - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 py-synologydsm-api-2.5.3/.github/workflows/tests.yml000066400000000000000000000070371467623651400226140ustar00rootroot00000000000000name: Tests on: push: branches: - master pull_request: ~ jobs: pre-commit: runs-on: ubuntu-latest steps: - name: Check out the repository uses: actions/checkout@v4.2.0 - name: Set up Python 3.9 uses: actions/setup-python@v5.2.0 with: python-version: "3.9" - name: Install dependencies run: | pip install -r requirements_dev.txt -e . - name: Compute pre-commit cache key id: pre-commit-cache shell: python run: | import hashlib import sys python = "py{}.{}".format(*sys.version_info[:2]) payload = sys.version.encode() + sys.executable.encode() digest = hashlib.sha256(payload).hexdigest() result = "${{ runner.os }}-{}-{}-pre-commit".format(python, digest[:8]) print("::set-output name=result::{}".format(result)) - name: Restore pre-commit cache uses: actions/cache@v4.0.2 with: path: ~/.cache/pre-commit key: ${{ steps.pre-commit-cache.outputs.result }}-${{ hashFiles('.pre-commit-config.yaml') }} restore-keys: | ${{ steps.pre-commit-cache.outputs.result }}- - name: Run pre-commit run: | pre-commit run --all-files --show-diff-on-failure tests: name: Python ${{ matrix.python-version }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - python-version: "3.9" - python-version: "3.10" - python-version: "3.11" - python-version: "3.12" steps: - name: Check out the repository uses: actions/checkout@v4.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5.2.0 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | pip install -r requirements_dev.txt -e . - name: Run pytest run: | coverage run --parallel -m pytest - name: Upload coverage data if: matrix.python-version == '3.10' uses: "actions/upload-artifact@v4.4.0" with: include-hidden-files: true name: coverage-data path: ".coverage.*" coverage: runs-on: ubuntu-latest needs: tests steps: - name: Check out the repository uses: actions/checkout@v4.2.0 - name: Set up Python 3.12 uses: actions/setup-python@v5.2.0 with: python-version: "3.12" - name: Install dependencies run: | pip install coverage[toml] - name: Download coverage data uses: actions/download-artifact@v4.1.8 with: name: coverage-data - name: Combine coverage data and display human readable report run: | coverage combine coverage report - name: Create coverage report run: | coverage xml - name: Upload coverage report uses: codecov/codecov-action@v4.5.0 build: runs-on: ubuntu-latest needs: tests steps: - name: Check out the repository uses: actions/checkout@v4.2.0 with: fetch-depth: 2 - name: Set up Python uses: actions/setup-python@v5.2.0 with: python-version: "3.12" - name: Install build dependencies run: | python -m pip install --upgrade pip pip install setuptools wheel build - name: Build package run: | python -m build . --wheel py-synologydsm-api-2.5.3/.gitignore000066400000000000000000000017561467623651400173240ustar00rootroot00000000000000# From cookiecutter-hypermodern-python .mypy_cache/ /.coverage /.nox/ /.python-version /.pytype/ /dist/ /docs/_build/ /src/*.egg-info/ __pycache__/ # Following are kept for not anoying current developers. Could be remove in # a future package release. # Python *.py[cod] # C extensions *.so # Packages *.egg *.egg-info dist build eggs .eggs parts bin var sdist develop-eggs .installed.cfg lib lib64 pip-wheel-metadata # Logs *.log pip-log.txt # Unit test / coverage reports .coverage .tox coverage.xml nosetests.xml htmlcov/ test-reports/ test-results.xml test-output.xml # Translations *.mo # Mac OS X .DS_Store .AppleDouble .LSOverride Icon # Windows Explorer desktop.ini # Visual Studio Code .vscode/* !.vscode/cSpell.json !.vscode/extensions.json !.vscode/settings.default.json !.vscode/tasks.json # IntelliJ IDEA .idea *.iml # Sublime text *.sublime-project *.sublime-workspace # Mr Developer .mr.developer.cfg .project .pydevproject # Virtual env .venv node_modules package-lock.json py-synologydsm-api-2.5.3/.pre-commit-config.yaml000066400000000000000000000030261467623651400216050ustar00rootroot00000000000000repos: - repo: local hooks: - id: black name: black entry: black language: system types: [python] require_serial: true - id: check-added-large-files name: Check for added large files entry: check-added-large-files language: system - id: check-toml name: Check Toml entry: check-toml language: system types: [toml] - id: check-yaml name: Check Yaml entry: check-yaml language: system types: [yaml] - id: end-of-file-fixer name: Fix End of Files entry: end-of-file-fixer language: system types: [text] stages: [commit, push, manual] - id: flake8 name: flake8 entry: flake8 language: system types: [python] require_serial: true - id: trailing-whitespace name: Trim Trailing Whitespace entry: trailing-whitespace-fixer language: system types: [text] stages: [commit, push, manual] - id: pylint name: pylint entry: pylint language: system types: [python] files: ^src/.+\.py$ args: ["-sn"] - id: mypy name: mypy entry: mypy language: system types: [python] files: ^src/.+\.py$ - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.2.1 hooks: - id: prettier - repo: https://github.com/PyCQA/isort rev: 5.12.0 hooks: - id: isort py-synologydsm-api-2.5.3/.vscode/000077500000000000000000000000001467623651400166645ustar00rootroot00000000000000py-synologydsm-api-2.5.3/.vscode/settings.default.json000066400000000000000000000002761467623651400230470ustar00rootroot00000000000000{ "python.testing.pytestArgs": ["tests"], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "mypy-type-checker.args": ["--config-file=pyproject.toml"] } py-synologydsm-api-2.5.3/.vscode/tasks.json000066400000000000000000000014531467623651400207070ustar00rootroot00000000000000{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "pytest", "type": "shell", "command": "pytest tests/", "group": { "kind": "test", "isDefault": true } }, { "label": "coverage", "type": "shell", "command": "coverage run --parallel -m pytest ; coverage combine ; coverage report", "group": { "kind": "test", "isDefault": false } }, { "label": "reinstall dependencies", "type": "shell", "command": "pip3 --disable-pip-version-check --no-cache-dir install -r requirements_dev.txt -e .", "group": { "kind": "build", "isDefault": true } } ] } py-synologydsm-api-2.5.3/CONTRIBUTING.md000066400000000000000000000050121467623651400175520ustar00rootroot00000000000000# Contributor Guide Thank you for your interest in improving this project. This project is open-source under the [MIT license](https://opensource.org/licenses/MIT) and welcomes contributions in the form of bug reports, feature requests, and pull requests. Here is a list of important resources for contributors: - [Source Code](https://github.com/mib1185/py-synologydsm-api) - [Documentation](https://github.com/mib1185/py-synologydsm-api#readme) - [Issue Tracker](https://github.com/mib1185/py-synologydsm-api/issues) ## How to report a bug Report bugs on the [Issue Tracker](https://github.com/mib1185/py-synologydsm-api/issues). When filing an issue, make sure to answer these questions: - Which operating system and Python version are you using? - Which version of this project are you using? - What did you do? - What did you expect to see? - What did you see instead? The best way to get your bug fixed is to provide a test case, and/or steps to reproduce the issue. ## How to request a feature Request features on the [Issue Tracker](https://github.com/mib1185/py-synologydsm-api/issues). ## How to set up your development environment This project use a [Visual Studio Code Dev Container](https://code.visualstudio.com/docs/devcontainers/containers). This approach will create a preconfigured development environment with all the tools you need. ## How to test the project Unit tests are located in the `tests` directory, and are written using the [pytest](https://pytest.readthedocs.io/) testing framework. Run the full test suite: ```bash $ pytest tests ``` There is also a Visual Studio Code task available to run the full test suite or you can use the testing feature from Visual Studio Code. ## How to submit changes Open a [pull request](https://github.com/mib1185/py-synologydsm-api/pulls) to submit changes to this project. Your pull request needs to meet the following guidelines for acceptance: - The test suite must pass without errors and warnings. - Include unit tests. This project maintains 100% code coverage. - If your changes add functionality, update the documentation accordingly. Feel free to submit early, though—we can always iterate on this. To run linting and code formatting checks before commiting your change, pre-commit as a Git hook is installed within the [Visual Studio Code Dev Container](https://code.visualstudio.com/docs/devcontainers/containers). It is recommended to open an issue before starting work on anything. This will allow a chance to talk it over with the owners and validate your approach. py-synologydsm-api-2.5.3/LICENSE.txt000066400000000000000000000020711467623651400171460ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2020 mib1185 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. py-synologydsm-api-2.5.3/README.md000066400000000000000000000336601467623651400166120ustar00rootroot00000000000000# Asynchronous Python API for Synology DSM [![](https://github.com/mib1185/py-synologydsm-api/workflows/Tests/badge.svg)](https://github.com/mib1185/py-synologydsm-api/actions?query=workflow%3ATests+branch%3Amaster) [![Library version](https://img.shields.io/pypi/v/py-synologydsm-api.svg)](https://pypi.org/project/py-synologydsm-api) [![Supported versions](https://img.shields.io/pypi/pyversions/py-synologydsm-api.svg)](https://pypi.org/project/py-synologydsm-api) [![Downloads](https://pepy.tech/badge/py-synologydsm-api)](https://pypi.org/project/py-synologydsm-api) [![Formated with Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) # Installation ```bash [sudo] pip install py-synologydsm-api ``` # Usage You can import the module as `synology_dsm`. ## Constructor ```python SynologyDSM( session, dsm_ip, dsm_port, username, password, use_https=False, timeout=10, device_token=None, debugmode=False, ) ``` For `session` a valid `aiohttp.ClientSession` needs to be provided. If ssl verification should be truned off, configure the session accordingly (eq. `aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False)`) `device_token` should be added when using a two-step authentication account, otherwise DSM will ask to login with a One Time Password (OTP) and requests will fail (see the login section for more details). Default `timeout` is 10 seconds. `SynologyDSM` also takes a `aiohttp.ClientTimeout` as `timeout`. ## Login Use the `login()` function to authenticate first, otherwise a `SynologyDSMNotLoggedInException` is raised. It will return a boolean if it successed or faild to authenticate to DSM. If your account need a two-step authentication (2SA), `login()` will raise `SynologyDSMLogin2SARequiredException`. Call the function again with a One Time Password (OTP) as parameter, like `login("123456")` (better to be a string to handle first zero). Store the `device_token` property so that you do not need to reconnect with password the next time you open a new `SynologyDSM` session. ## Code example Every API has an `update()` function that is needed to get the first data, then the data is cached and updated at the next `update()` call. The `SynologyDSM` class can also `update()` all APIs at once. ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() print("=== Information ===") await api.information.update() print("Model: " + str(api.information.model)) print("RAM: " + str(api.information.ram) + " MB") print("Serial number: " + str(api.information.serial)) print("Temperature: " + str(api.information.temperature) + " °C") print("Temp. warning: " + str(api.information.temperature_warn)) print("Uptime: " + str(api.information.uptime)) print("Full DSM version:" + str(api.information.version_string)) print("--") print("=== Utilisation ===") await api.utilisation.update() print("CPU Load: " + str(api.utilisation.cpu_total_load) + " %") print("Memory Use: " + str(api.utilisation.memory_real_usage) + " %") print("Net Up: " + str(api.utilisation.network_up())) print("Net Down: " + str(api.utilisation.network_down())) print("--") print("=== Storage ===") await api.storage.update() for volume_id in api.storage.volumes_ids: print("ID: " + str(volume_id)) print("Status: " + str(api.storage.volume_status(volume_id))) print("% Used: " + str(api.storage.volume_percentage_used(volume_id)) + " %") print("--") for disk_id in api.storage.disks_ids: print("ID: " + str(disk_id)) print("Name: " + str(api.storage.disk_name(disk_id))) print("S-Status: " + str(api.storage.disk_smart_status(disk_id))) print("Status: " + str(api.storage.disk_status(disk_id))) print("Temp: " + str(api.storage.disk_temp(disk_id))) print("--") print("=== Shared Folders ===") await api.share.update() for share_uuid in api.share.shares_uuids: print("Share name: " + str(api.share.share_name(share_uuid))) print("Share path: " + str(api.share.share_path(share_uuid))) print("Space used: " + str(api.share.share_size(share_uuid, human_readable=True))) print("Recycle Bin Enabled: " + str(api.share.share_recycle_bin(share_uuid))) print("--") if __name__ == "__main__": asyncio.run(main()) ``` ## Download Station usage ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() if "SYNO.DownloadStation.Info" in api.apis: await api.download_station.get_info() await api.download_station.get_config() # The download list will be updated after each of the following functions: # You should have the right on the (default) directory that the download will be saved, or you will get a 403 or 406 error await api.download_station.create("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4") await api.download_station.pause("dbid_1") # Like the other function, you can eather pass a str or a list await api.download_station.resume(["dbid_1", "dbid_2"]) await api.download_station.delete("dbid_3") # Manual update await api.download_station.update() if __name__ == "__main__": asyncio.run(main()) ``` ## External USB storage usage ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() await api.external_usb.update() for device in api.external_usb.get_devices.values(): print("Name: " + str(device.device_name)) print("Size: " + str(device.device_size_total(human_readable=True)) print("Size in mb: " + str(device.device_size_total()) print("Partitions size total: " + str(device.partitions_all_size_total(human_readable=True))) print("Partitions size used: " + str(device.partitions_all_size_used(human_readable=True))) print("Partitions % Used: " + str(device.partitions_all_percentage_used ) + " %") print(" === Partitions ===") for part in device.device_partitions.values(): print(" Share name: " + str(part.share_name)) print(" Filesystem: " + str(part.filesystem)) print(" Size: " + str(part.partition_size_total(human_readable=True))) print(" Used: " + str(part.partition_size_used(human_readable=True))) print(" % Used: " + str(part.partition_percentage_used) + " %") if __name__ == "__main__": asyncio.run(main()) ``` ## Photos usage ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() albums = await api.photos.get_albums() # download each item of each album for album in albums: print(f"'{album.name}' has {album.item_count} items") items = await api.photos.get_items_from_album(album) for item in items: print(f"{item.file_name}") with open(item.file_name, "wb") as fh: fh.write(await api.photos.download_item(item)) # search for items and download them items = await api.photos.get_items_from_search("pinky and the brain") for item in items: with open(item.file_name, "wb") as fh: fh.write(await api.photos.download_item(item)) if __name__ == "__main__": asyncio.run(main()) ``` ## Surveillance Station usage ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() surveillance = api.surveillance_station await surveillance.update() # First update is required # Returns a list of cached cameras available cameras = surveillance.get_all_cameras() # Assuming there's at least one camera, get the first camera_id camera_id = cameras[0].camera_id # Returns cached camera object by camera_id camera = surveillance.get_camera(camera_id) # Returns cached motion detection enabled motion_setting = camera.is_motion_detection_enabled # Return bytes of camera image await surveillance.get_camera_image(camera_id) # Updates all cameras/motion settings and cahce them await surveillance.update() # Gets Home Mode status home_mode_status = await surveillance.get_home_mode_status() # Sets home mode - true is on, false is off await surveillance.set_home_mode(True) if __name__ == "__main__": asyncio.run(main()) ``` ## System usage ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() system = api.system # Reboot NAS await system.reboot() # Shutdown NAS await system.shutdown() # Manual update system information await system.update() # Get CPU information system.cpu_clock_speed system.cpu_cores system.cpu_family system.cpu_series # Get NTP settings system.enabled_ntp system.ntp_server # Get system information system.firmware_ver system.model system.ram_size system.serial system.sys_temp system.time system.time_zone system.time_zone_desc system.up_time # Get list of all connected USB devices system.usb_dev if __name__ == "__main__": asyncio.run(main()) ``` ## Upgrade usage ```python import asyncio import aiohttp from synology_dsm import SynologyDSM async def main(): print("Creating Valid API") async with aiohttp.ClientSession( connector=aiohttp.TCPConnector(verify_ssl=False) ) as session: await do(session) async def do(session: aiohttp.ClientSession): api = SynologyDSM(session, "", "", "", "") await api.login() upgrade = api.upgrade # Manual update upgrade information await upgrade.update() # check if DSM update is available if upgrade.update_available: do something ... # get available version string (return None if no update available) upgrade.available_version # get need of reboot (return None if no update available) upgrade.reboot_needed # get need of service restarts (return None if no update available) upgrade.service_restarts if __name__ == "__main__": asyncio.run(main()) ``` # Credits / Special Thanks - [@florianeinfalt](https://github.com/florianeinfalt) - [@tchellomello](https://github.com/tchellomello) - [@Quentame](https://github.com/Quentame) (Multiple API addition & tests) - [@aaska](https://github.com/aaska) (DSM 5 tests) - [@chemelli74](https://github.com/chemelli74) (2SA tests) - [@snjoetw](https://github.com/snjoetw) (Surveillance Station library) - [@shenxn](https://github.com/shenxn) (Surveillance Station tests) - [@Gestas](https://github.com/Gestas) (Shared Folders) - [@lodesmets](https://github.com/lodesmets) (Synology Photos) Found Synology API "documentation" on this repo : https://github.com/kwent/syno/tree/master/definitions # Official references - [Calendar API documentation (2015-2019)](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/Calendar/2.4/enu/Synology_Calendar_API_Guide_enu.pdf) - [Download Station API documentation (2012-2014)](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/DownloadStation/All/enu/Synology_Download_Station_Web_API.pdf) - [File Station API documentation (2013-2019)](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/FileStation/All/enu/Synology_File_Station_API_Guide.pdf) - [Surveillance Station API documentation (2012-2020)](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/SurveillanceStation/All/enu/Surveillance_Station_Web_API.pdf) - [Virtual Machine Manager API documentation (2015-2019)](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/Virtualization/All/enu/Synology_Virtual_Machine_Manager_API_Guide.pdf) py-synologydsm-api-2.5.3/codecov.yml000066400000000000000000000002041467623651400174640ustar00rootroot00000000000000comment: false coverage: status: project: default: target: "75" patch: default: target: "100" py-synologydsm-api-2.5.3/mypy.ini000066400000000000000000000011121467623651400170150ustar00rootroot00000000000000[mypy] show_error_codes = true follow_imports = silent ignore_missing_imports = true strict_equality = true no_implicit_optional = true warn_incomplete_stub = true warn_redundant_casts = true warn_unused_configs = true warn_unused_ignores = true enable_error_code = ignore-without-code disable_error_code = annotation-unchecked strict_concatenate = false check_untyped_defs = true disallow_incomplete_defs = true disallow_subclassing_any = true disallow_untyped_calls = true disallow_untyped_decorators = true disallow_untyped_defs = true warn_return_any = true warn_unreachable = true py-synologydsm-api-2.5.3/pyproject.toml000066400000000000000000000036121467623651400202410ustar00rootroot00000000000000[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "py-synologydsm-api" version = "2.5.3" description = "Python API for communication with Synology DSM" authors = [ {name="Michael Brussk (mib1185)"}, {name="Quentin POLLET (Quentame)"}, {name="FG van Zeelst (ProtoThis)"} ] license = {text = "MIT"} readme = "README.md" classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Libraries", ] keywords=["synology-dsm", "synology"] requires-python = ">=3.9" dependencies = ["aiohttp"] [project.urls] Changelog = "https://github.com/mib1185/py-synologydsm-api/releases" Repository = "https://github.com/mib1185/py-synologydsm-api" Documentation = "https://github.com/mib1185/py-synologydsm-api#readme" [project.scripts] synologydsm-api = "synology_dsm.__main__:main" [tool.setuptools.package-data] synology_dsm = ["py.typed", "*.py", "**/*.py"] [tool.coverage.paths] source = ["src", "*/site-packages"] [tool.coverage.run] branch = true source = ["synology_dsm"] [tool.coverage.report] show_missing = true fail_under = 75 [tool.isort] profile = "black" src_paths = ["src", "tests"] [tool.mypy] exclude = ["tests/"] [tool.pylint.MAIN] ignore = ["tests"] [tool.pylint.BASIC] class-const-naming-style = "any" good-names = [ "id", ] [tool.pylint."MESSAGES CONTROL"] disable = [ "too-few-public-methods", "too-many-arguments", "too-many-branches", "too-many-instance-attributes", "too-many-public-methods", "too-many-return-statements", "too-many-positional-arguments", ] py-synologydsm-api-2.5.3/requirements_dev.txt000066400000000000000000000005041467623651400214440ustar00rootroot00000000000000aiohttp black==24.8.0 coverage[toml] flake8-bandit==4.1.1 flake8-bugbear==24.8.19 flake8-docstrings==1.7.0 flake8-rst-docstrings==0.3.0 flake8==7.1.1 mypy==1.11.2 pep8-naming==0.14.1 pre-commit-hooks==4.6.0 pre-commit==3.8.0 Pygments==2.18.0 pylint==3.3.1 pytest-asyncio==0.24.0 pytest==8.3.3 reorder-python-imports==3.13.0 py-synologydsm-api-2.5.3/scripts/000077500000000000000000000000001467623651400170125ustar00rootroot00000000000000py-synologydsm-api-2.5.3/scripts/clean.sh000077500000000000000000000002011467623651400204240ustar00rootroot00000000000000./scripts/common.sh # Clean rm -r .tox rm -r build rm -r dist rm -r python_synology.egg-info rm -r src/python_synology.egg-info py-synologydsm-api-2.5.3/scripts/common.sh000077500000000000000000000000741467623651400206420ustar00rootroot00000000000000# Be in right place if [ ! -f setup.py ]; then cd .. fi py-synologydsm-api-2.5.3/scripts/publish.sh000077500000000000000000000007731467623651400210260ustar00rootroot00000000000000# Publish the library # https://pypi.org/project/synologydsm-api # Publish documentation here: https://packaging.python.org/tutorials/packaging-projects/ ./scripts/common.sh ./scripts/clean.sh # Install/update dependencies python3 -m pip install --user --upgrade setuptools wheel python3 -m pip install --user --upgrade twine # Build python3 setup.py sdist bdist_wheel # Push to PyPi python3 -m twine upload dist/* # python3 -m twine upload --repository testpypi dist/* # Enter credentials manually :P py-synologydsm-api-2.5.3/scripts/setup000077500000000000000000000007301467623651400201000ustar00rootroot00000000000000#!/usr/bin/env bash # Setups the repository. # Stop on errors set -e cd "$(dirname "$0")/.." # Add default vscode settings if not existing SETTINGS_FILE=./.vscode/settings.json SETTINGS_TEMPLATE_FILE=./.vscode/settings.default.json if [ ! -f "$SETTINGS_FILE" ]; then echo "Copy $SETTINGS_TEMPLATE_FILE to $SETTINGS_FILE." cp "$SETTINGS_TEMPLATE_FILE" "$SETTINGS_FILE" fi # install git pre-commit hook pre-commit install # install from source pip install -e . py-synologydsm-api-2.5.3/setup.cfg000066400000000000000000000001061467623651400171410ustar00rootroot00000000000000[metadata] url = https://github.com/mib1185/py-synologydsm-api#readme py-synologydsm-api-2.5.3/src/000077500000000000000000000000001467623651400161125ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/000077500000000000000000000000001467623651400206405ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/__init__.py000066400000000000000000000001521467623651400227470ustar00rootroot00000000000000"""The synologydsm-api library.""" from .synology_dsm import SynologyDSM __all__ = ["SynologyDSM"] py-synologydsm-api-2.5.3/src/synology_dsm/api/000077500000000000000000000000001467623651400214115ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/__init__.py000066400000000000000000000006671467623651400235330ustar00rootroot00000000000000"""Synology API models.""" from __future__ import annotations from typing import TYPE_CHECKING, Generic, TypeVar if TYPE_CHECKING: from synology_dsm import SynologyDSM _DataT = TypeVar("_DataT") class SynoBaseApi(Generic[_DataT]): """Base api class.""" def __init__(self, dsm: "SynologyDSM") -> None: """Constructor method.""" self._dsm = dsm self._data: _DataT = {} # type: ignore[assignment] py-synologydsm-api-2.5.3/src/synology_dsm/api/core/000077500000000000000000000000001467623651400223415ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/core/__init__.py000066400000000000000000000000401467623651400244440ustar00rootroot00000000000000"""Synology Core API models.""" py-synologydsm-api-2.5.3/src/synology_dsm/api/core/external_usb.py000066400000000000000000000217311467623651400254120ustar00rootroot00000000000000"""DSM external USB device data.""" from __future__ import annotations from typing import TypedDict, cast from synology_dsm.api import SynoBaseApi from synology_dsm.helpers import SynoFormatHelper ExternalUsbDevicePartitionDataType = TypedDict( "ExternalUsbDevicePartitionDataType", { "dev_fstype": str, "filesystem": str, "name_id": str, "partition_title": str, "share_name": str, "status": str, "total_size_mb": "int | str", "used_size_mb": "int | None", }, total=False, ) ExternalUsbDeviceDataType = TypedDict( "ExternalUsbDeviceDataType", { "dev_id": str, "dev_title": str, "dev_type": str, "formatable": bool, "partitions": "dict[str, SynoUSBStoragePartition]", "producer": str, "product": str, "progress": str, "status": str, "total_size_mb": int, }, total=False, ) class SynoCoreExternalUSB(SynoBaseApi["dict[str, SynoCoreExternalUSBDevice]"]): """Class for external USB storage devices.""" API_KEY = "SYNO.Core.ExternalDevice.Storage.USB" REQUEST_DATA = {"additional": '["all"]'} async def update(self) -> None: """Updates external USB storage device data.""" raw_data = await self._dsm.post(self.API_KEY, "list", data=self.REQUEST_DATA) if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: for device in data["devices"]: self._data[device["dev_id"]] = SynoCoreExternalUSBDevice(device) # Root @property def get_devices(self) -> dict[str, SynoCoreExternalUSBDevice]: """Gets all external USB storage devices.""" return self._data def get_device(self, device_id: str) -> SynoCoreExternalUSBDevice | None: """Returns a specific external USB storage device.""" return self._data.get(device_id) class SynoCoreExternalUSBDevice: """A representation of an external USB device.""" def __init__(self, data: dict): """Initialize a external USB device.""" partitions: dict[str, SynoUSBStoragePartition] = {} for partition in data["partitions"]: partitions[partition["name_id"]] = SynoUSBStoragePartition(partition) self._data = cast(ExternalUsbDeviceDataType, {**data, "partitions": partitions}) @property def device_id(self) -> str: """Return id of the device.""" return self._data["dev_id"] @property def device_name(self) -> str: """The title of the external USB storage device.""" return self._data["dev_title"] @property def device_type(self) -> str: """The type of the external USB storage device.""" return self._data["dev_type"] def device_size_total(self, human_readable: bool = False) -> str | int: """Total size of the external USB storage device.""" return_data = SynoFormatHelper.megabytes_to_bytes( int(self._data["total_size_mb"]) ) if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data @property def device_status(self) -> str: """The status of the external USB storage device.""" return self._data["status"] @property def device_formatable(self) -> bool: """Whether the external USB storage device can be formatted.""" return self._data["formatable"] @property def device_progress(self) -> str: """The progress the external USB storage device.""" return self._data["progress"] @property def device_product_name(self) -> str: """The product name of the external USB storage device.""" return self._data["product"] @property def device_manufacturer(self) -> str: """The producer name of the external USB storage device.""" return self._data["producer"] # Partition @property def device_partitions(self) -> dict[str, SynoUSBStoragePartition]: """Returns all partitions of the external USB storage device.""" return self._data["partitions"] def get_device_partition(self, partition_id: str) -> SynoUSBStoragePartition | None: """Returns a partition of the external USB storage device.""" return self._data["partitions"].get(partition_id) def partitions_all_size_total( self, human_readable: bool = False ) -> str | int | None: """Total size of all parititions of the external USB storage device.""" partitions = self._data["partitions"] if not partitions: return None size_total = 0 for partition in partitions.values(): partition_size = partition.partition_size_total() # Partitions may be reported without a size if isinstance(partition_size, int): size_total += partition_size if human_readable: return SynoFormatHelper.bytes_to_readable(size_total) return size_total def partitions_all_size_used( self, human_readable: bool = False ) -> str | int | None: """Total size used of all partitions of the external USB storage device.""" partitions = self._data["partitions"] if not partitions: return None size_used = 0 for partition in partitions.values(): partition_used = partition.partition_size_used() # Partitions may be reported without a size if isinstance(partition_used, int): size_used += partition_used if human_readable: return SynoFormatHelper.bytes_to_readable(size_used) return size_used @property def partitions_all_percentage_used(self) -> float | None: """Used size in percentage for all partitions of the USB storage device.""" size_total = self.partitions_all_size_total() size_used = self.partitions_all_size_used() if ( isinstance(size_used, int) and size_used >= 0 and isinstance(size_total, int) and size_total > 0 ): return round((float(size_used) / float(size_total)) * 100.0, 1) return None class SynoUSBStoragePartition: """A representation of a parition of an external USB storage device.""" def __init__(self, data: ExternalUsbDevicePartitionDataType): """Initialize a partition object of an external USB storage device.""" self._data = data @property def fstype(self) -> str: """Return the dev_fstype for the partition.""" return self._data["dev_fstype"] @property def filesystem(self) -> str: """Return the filesystem for the partition.""" return self._data["filesystem"] @property def name_id(self) -> str: """Return the name_id for the partition.""" return self._data["name_id"] @property def partition_title(self) -> str: """Return the title for the partition.""" return self._data["partition_title"] @property def share_name(self) -> str: """Return the share name for the partition.""" return self._data["share_name"] @property def status(self) -> str: """Return the status for the partition.""" return self._data["status"] def partition_size_total(self, human_readable: bool = False) -> int | str | None: """Total size of the partition.""" # API returns property as empty string if a partition has no size size_total = self._data["total_size_mb"] if not isinstance(size_total, int): return None size_total = SynoFormatHelper.megabytes_to_bytes(size_total) if human_readable: return SynoFormatHelper.bytes_to_readable(size_total) return size_total def partition_size_used(self, human_readable: bool = False) -> int | str | None: """Used size of the partition.""" # API does not return property if a partition has no size size_used = self._data.get("used_size_mb") if not isinstance(size_used, int): return None size_used = SynoFormatHelper.megabytes_to_bytes(size_used) if human_readable: return SynoFormatHelper.bytes_to_readable(size_used) return size_used @property def partition_percentage_used(self) -> float | None: """Used size in percentage of the partition.""" size_total = self.partition_size_total() size_used = self.partition_size_used() if ( isinstance(size_used, int) and size_used >= 0 and isinstance(size_total, int) and size_total > 0 ): return round((float(size_used) / float(size_total)) * 100.0, 1) return None @property def is_mounted(self) -> bool: """Is the partition formatted.""" return self._data["share_name"] != "" @property def is_supported(self) -> bool: """Is the partition formatted.""" return self._data["filesystem"] != "" py-synologydsm-api-2.5.3/src/synology_dsm/api/core/security.py000066400000000000000000000044211467623651400245630ustar00rootroot00000000000000"""DSM Security data.""" from __future__ import annotations from typing import TypedDict from synology_dsm.api import SynoBaseApi SecurityCategory = TypedDict( "SecurityCategory", { "category": str, "fail": "dict[str, int]", "failSeverity": str, "progress": int, "runningItem": str, "total": int, "waitNum": int, }, ) class SecurityDataType(TypedDict): """Data type.""" items: dict[str, SecurityCategory] lastScanTime: str # noqa: N815 startTime: str # noqa: N815 success: bool sysProgress: int # noqa: N815 sysStatus: str # noqa: N815 class SynoCoreSecurity(SynoBaseApi[SecurityDataType]): """Class containing Security data.""" API_KEY = "SYNO.Core.SecurityScan.Status" async def update(self) -> None: """Updates security data.""" raw_data = await self._dsm.get(self.API_KEY, "system_get") if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data @property def checks(self) -> dict[str, SecurityCategory]: """Gets the checklist by check category.""" return self._data["items"] @property def last_scan_time(self) -> str: """Gets the last scan time.""" return self._data["lastScanTime"] @property def start_time(self) -> str: """Gets the start time (if in progress).""" return self._data["startTime"] @property def success(self) -> bool: """Gets the last scan success.""" return self._data["success"] @property def progress(self) -> int: """Gets the scan progress. Returns: 100 if finished """ return self._data["sysProgress"] @property def status(self) -> str: """Gets the last scan status. Possible values: safe, danger, info, outOfDate, risk, warning. """ return self._data["sysStatus"] @property def status_by_check(self) -> dict[str, str]: """Gets the last scan status per check.""" status = {} for category in self.checks: status[category] = self.checks[category]["failSeverity"] return status py-synologydsm-api-2.5.3/src/synology_dsm/api/core/share.py000066400000000000000000000061001467623651400240120ustar00rootroot00000000000000"""Shared Folders data.""" from __future__ import annotations from typing import TypedDict from synology_dsm.api import SynoBaseApi from synology_dsm.helpers import SynoFormatHelper Share = TypedDict( "Share", { "uuid": str, "name": str, "vol_path": str, "enable_recycle_bin": bool, "share_quota_used": float, }, total=False, ) class ShareDataType(TypedDict): """Data type.""" shares: list[Share] class SynoCoreShare(SynoBaseApi[ShareDataType]): """Class containing Share data.""" API_KEY = "SYNO.Core.Share" # Syno supports two methods to retrieve resource details, GET and POST. # GET returns a limited set of keys. With POST the same keys as GET # are returned plus any keys listed in the "additional" parameter. # NOTE: The value of the additional key must be a string. REQUEST_DATA = { "additional": '["hidden","encryption","is_aclmode","unite_permission",' '"is_support_acl","is_sync_share","is_force_readonly","force_readonly_reason",' '"recyclebin","is_share_moving","is_cluster_share","is_exfat_share",' '"is_cold_storage_share","support_snapshot","share_quota",' '"enable_share_compress","enable_share_cow","include_cold_storage_share",' '"is_cold_storage_share"]', "shareType": "all", } async def update(self) -> None: """Updates share data.""" raw_data = await self._dsm.post(self.API_KEY, "list", data=self.REQUEST_DATA) if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data @property def shares(self) -> list[Share]: """Gets all shares.""" return self._data["shares"] @property def shares_uuids(self) -> list[str]: """Return (internal) share ids.""" shares = [] for share in self.shares: shares.append(share["uuid"]) return shares def get_share(self, share_uuid: str) -> Share: """Returns a specific share by uuid..""" for share in self.shares: if share["uuid"] == share_uuid: return share return {} def share_name(self, share_uuid: str) -> str: """Return the name of this share.""" return self.get_share(share_uuid)["name"] def share_path(self, share_uuid: str) -> str: """Return the volume path of this share.""" return self.get_share(share_uuid)["vol_path"] def share_recycle_bin(self, share_uuid: str) -> bool: """Is the recycle bin enabled for this share?""" return self.get_share(share_uuid)["enable_recycle_bin"] def share_size(self, share_uuid: str, human_readable: bool = False) -> int | str: """Total size of share.""" share_size_mb = self.get_share(share_uuid)["share_quota_used"] # Share size is returned in MB so we convert it. share_size_bytes = SynoFormatHelper.megabytes_to_bytes(share_size_mb) if human_readable: return SynoFormatHelper.bytes_to_readable(share_size_bytes) return share_size_bytes py-synologydsm-api-2.5.3/src/synology_dsm/api/core/system.py000066400000000000000000000070171467623651400242440ustar00rootroot00000000000000"""DSM System data and actions.""" from __future__ import annotations from typing import Any, TypedDict from synology_dsm.api import SynoBaseApi class SystemDataType(TypedDict): """Data type.""" cpu_clock_speed: int cpu_cores: str cpu_family: str cpu_series: str enabled_ntp: bool ntp_server: str firmware_ver: str model: str ram_size: int serial: str sys_temp: int time: str time_zone: str time_zone_desc: str up_time: str usb_dev: list[dict[str, Any]] class SynoCoreSystem(SynoBaseApi[SystemDataType]): """Class containing System data and actions.""" API_KEY = "SYNO.Core.System" async def update(self) -> None: """Updates System data.""" raw_data = await self._dsm.get(self.API_KEY, "info") if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data # # get information # @property def cpu_clock_speed(self) -> int: """Gets System CPU clock speed.""" return self._data["cpu_clock_speed"] @property def cpu_cores(self) -> str: """Gets System CPU cores.""" return self._data["cpu_cores"] @property def cpu_family(self) -> str: """Gets System CPU family.""" return self._data["cpu_family"] @property def cpu_series(self) -> str: """Gets System CPU series.""" return self._data["cpu_series"] @property def enabled_ntp(self) -> bool: """Gets System NTP state.""" return self._data["enabled_ntp"] @property def ntp_server(self) -> str: """Gets System NTP server.""" return self._data["ntp_server"] @property def firmware_ver(self) -> str: """Gets System firmware version.""" return self._data["firmware_ver"] @property def model(self) -> str: """Gets System model.""" return self._data["model"] @property def ram_size(self) -> int: """Gets System ram size.""" return self._data["ram_size"] @property def serial(self) -> str: """Gets System serial number.""" return self._data["serial"] @property def sys_temp(self) -> int: """Gets System temperature.""" return self._data["sys_temp"] @property def time(self) -> str: """Gets System time.""" return self._data["time"] @property def time_zone(self) -> str: """Gets System time zone.""" return self._data["time_zone"] @property def time_zone_desc(self) -> str: """Gets System time zone description.""" return self._data["time_zone_desc"] @property def up_time(self) -> str: """Gets System uptime.""" return self._data["up_time"] @property def usb_dev(self) -> list: """Gets System connected usb devices.""" return self._data["usb_dev"] # # do system actions # async def shutdown(self) -> None: """Shutdown NAS.""" await self._dsm.get( self.API_KEY, "shutdown", max_version=1, # shutdown method is only available on api version 1 ) async def reboot(self) -> None: """Reboot NAS.""" await self._dsm.get( self.API_KEY, "reboot", max_version=1, # reboot method is only available on api version 1 ) py-synologydsm-api-2.5.3/src/synology_dsm/api/core/upgrade.py000066400000000000000000000030501467623651400243400ustar00rootroot00000000000000"""DSM Upgrade data and actions.""" from __future__ import annotations from typing import TypedDict from synology_dsm.api import SynoBaseApi class UpgradeDataType(TypedDict, total=False): """Data type.""" available: bool version: str version_details: dict reboot: str restart: str class SynoCoreUpgrade(SynoBaseApi[UpgradeDataType]): """Class containing upgrade data and actions.""" API_KEY = "SYNO.Core.Upgrade" API_SERVER_KEY = API_KEY + ".Server" async def update(self) -> None: """Updates Upgrade data.""" raw_data = await self._dsm.get(self.API_SERVER_KEY, "check") if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data.get("update", data) @property def update_available(self) -> bool: """Gets available update info.""" return self._data["available"] @property def available_version(self) -> str | None: """Gets available verion info.""" return self._data.get("version") @property def available_version_details(self) -> dict | None: """Gets details about available verion.""" return self._data.get("version_details") @property def reboot_needed(self) -> str | None: """Gets info if reboot is needed.""" return self._data.get("reboot") @property def service_restarts(self) -> str | None: """Gets info if services are restarted.""" return self._data.get("restart") py-synologydsm-api-2.5.3/src/synology_dsm/api/core/utilization.py000066400000000000000000000146271467623651400253000ustar00rootroot00000000000000"""DSM Utilization data.""" from __future__ import annotations from typing import TypedDict from synology_dsm.api import SynoBaseApi from synology_dsm.helpers import SynoFormatHelper CpuUtilization = TypedDict( "CpuUtilization", { "15min_load": int, "1min_load": int, "5min_load": int, "device": str, "other_load": int, "system_load": int, "user_load": int, }, ) MemoryUtilization = TypedDict( "MemoryUtilization", { "avail_real": int, "avail_swap": int, "buffer": int, "cached": int, "device": str, "memory_size": int, "real_usage": int, "si_disk": int, "so_disk": int, "swap_usage": int, "total_real": int, "total_swap": int, }, ) NetworkUtilization = TypedDict( "NetworkUtilization", { "device": str, "rx": int, "tx": int, }, ) class UtilizationDataType(TypedDict, total=False): """Data type.""" cpu: CpuUtilization memory: MemoryUtilization network: list[NetworkUtilization] class SynoCoreUtilization(SynoBaseApi[UtilizationDataType]): """Class containing Utilization data.""" API_KEY = "SYNO.Core.System.Utilization" async def update(self) -> None: """Updates utilization data.""" raw_data = await self._dsm.get(self.API_KEY, "get") if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data @property def cpu(self) -> CpuUtilization: """Gets CPU utilization.""" return self._data["cpu"] @property def cpu_other_load(self) -> int: """Other percentage of the total CPU load.""" return self.cpu["other_load"] @property def cpu_user_load(self) -> int: """User percentage of the total CPU load.""" return self.cpu["user_load"] @property def cpu_system_load(self) -> int: """System percentage of the total CPU load.""" return self.cpu["system_load"] @property def cpu_total_load(self) -> int: """Total CPU load for Synology DSM.""" system_load = self.cpu_system_load user_load = self.cpu_user_load other_load = self.cpu_other_load return system_load + user_load + other_load @property def cpu_1min_load(self) -> int: """Average CPU load past minute.""" return self.cpu["1min_load"] @property def cpu_5min_load(self) -> int: """Average CPU load past 5 minutes.""" return self.cpu["5min_load"] @property def cpu_15min_load(self) -> int: """Average CPU load past 15 minutes.""" return self.cpu["15min_load"] @property def memory(self) -> MemoryUtilization: """Gets memory utilization.""" return self._data["memory"] @property def memory_real_usage(self) -> int: """Real Memory usage from Synology DSM.""" return self.memory["real_usage"] def memory_size(self, human_readable: bool = False) -> int | str: """Total memory size of Synology DSM.""" return_data = self.memory["memory_size"] * 1024 if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def memory_available_swap(self, human_readable: bool = False) -> int | str: """Total available memory swap.""" # Memory is actually returned in KB's so multiply before converting return_data = self.memory["avail_swap"] * 1024 if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def memory_cached(self, human_readable: bool = False) -> int | str: """Total cached memory.""" # Memory is actually returned in KB's so multiply before converting return_data = self.memory["cached"] * 1024 if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def memory_available_real(self, human_readable: bool = False) -> int | str: """Real available memory.""" # Memory is actually returned in KB's so multiply before converting return_data = self.memory["avail_real"] * 1024 if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def memory_total_real(self, human_readable: bool = False) -> int | str: """Total available real memory.""" # Memory is actually returned in KB's so multiply before converting return_data = self.memory["total_real"] * 1024 if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def memory_total_swap(self, human_readable: bool = False) -> int | str: """Total swap memory.""" # Memory is actually returned in KB's so multiply before converting return_data = self.memory["total_swap"] * 1024 if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data @property def network(self) -> list[NetworkUtilization]: """Gets network utilization.""" return self._data["network"] def _get_network(self, network_id: str) -> NetworkUtilization | None: """Function to get specific network (eth0, total, etc).""" for network in self.network: if network["device"] == network_id: return network return None def network_up(self, human_readable: bool = False) -> int | str | None: """Total upload speed being used.""" if (network := self._get_network("total")) is not None: return_data = network["tx"] if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data return None def network_down(self, human_readable: bool = False) -> int | str | None: """Total download speed being used.""" if (network := self._get_network("total")) is not None: return_data = network["rx"] if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data return None py-synologydsm-api-2.5.3/src/synology_dsm/api/download_station/000077500000000000000000000000001467623651400247615ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/download_station/__init__.py000066400000000000000000000101651467623651400270750ustar00rootroot00000000000000"""Synology DownloadStation API wrapper.""" from __future__ import annotations from synology_dsm.api import SynoBaseApi from .task import SynoDownloadTask class SynoDownloadStation(SynoBaseApi["dict[str, SynoDownloadTask]"]): """An implementation of a Synology DownloadStation.""" API_KEY = "SYNO.DownloadStation.*" INFO_API_KEY = "SYNO.DownloadStation.Info" STAT_API_KEY = "SYNO.DownloadStation.Statistic" TASK_API_KEY = "SYNO.DownloadStation.Task" REQUEST_DATA = { "additional": "detail,file" } # Can contain: detail, transfer, file, tracker, peer async def update(self) -> None: """Update tasks from API.""" self._data = {} raw_data = await self._dsm.get(self.TASK_API_KEY, "List", self.REQUEST_DATA) if not isinstance(raw_data, dict) or (data := raw_data.get("data")) is None: return for task_data in data["tasks"]: if task_data["id"] in self._data: self._data[task_data["id"]].update(task_data) else: self._data[task_data["id"]] = SynoDownloadTask(task_data) # Global async def get_info(self) -> dict | None: """Return general informations about the Download Station instance.""" raw_data = await self._dsm.get(self.INFO_API_KEY, "GetInfo") if isinstance(raw_data, dict): return raw_data return None async def get_config(self) -> dict | None: """Return configuration about the Download Station instance.""" raw_data = await self._dsm.get(self.INFO_API_KEY, "GetConfig") if isinstance(raw_data, dict): return raw_data return None async def get_stat(self) -> dict | None: """Return statistic about the Download Station instance.""" raw_data = await self._dsm.get(self.STAT_API_KEY, "GetInfo") if isinstance(raw_data, dict): return raw_data return None # Downloads def get_all_tasks(self) -> list[SynoDownloadTask]: """Return a list of tasks.""" return list(self._data.values()) def get_task(self, task_id: str) -> SynoDownloadTask | None: """Return task matching task_id.""" return self._data.get(task_id) async def create( self, uri: str | list[str], unzip_password: str | None = None, destination: str | None = None, ) -> dict | None: """Create a new task (uri accepts HTTP/FTP/magnet/ED2K links).""" res = await self._dsm.post( self.TASK_API_KEY, "Create", { "uri": ",".join(uri) if isinstance(uri, list) else uri, "unzip_password": unzip_password, "destination": destination, }, ) await self.update() if isinstance(res, dict): return res return None async def pause(self, task_id: str | list[str]) -> dict | None: """Pause a download task.""" res = await self._dsm.get( self.TASK_API_KEY, "Pause", {"id": ",".join(task_id) if isinstance(task_id, list) else task_id}, ) await self.update() if isinstance(res, dict): return res return None async def resume(self, task_id: str | list[str]) -> dict | None: """Resume a paused download task.""" res = await self._dsm.get( self.TASK_API_KEY, "Resume", {"id": ",".join(task_id) if isinstance(task_id, list) else task_id}, ) await self.update() if isinstance(res, dict): return res return None async def delete( self, task_id: str | list[str], force_complete: bool = False ) -> dict | None: """Delete a download task.""" res = await self._dsm.get( self.TASK_API_KEY, "Delete", { "id": ",".join(task_id) if isinstance(task_id, list) else task_id, "force_complete": force_complete, }, ) await self.update() if isinstance(res, dict): return res return None py-synologydsm-api-2.5.3/src/synology_dsm/api/download_station/task.py000066400000000000000000000036021467623651400262760ustar00rootroot00000000000000"""DownloadStation task.""" from __future__ import annotations from typing import TypedDict SynoDownloadTaskType = TypedDict( "SynoDownloadTaskType", { "additional": dict, "id": str, "size": int, "status": str, "title": str, "type": str, "username": str, "status_extra": dict, }, total=False, ) class SynoDownloadTask: """An representation of a Synology DownloadStation task.""" def __init__(self, data: SynoDownloadTaskType): """Initialize a Download Station task.""" self._data: SynoDownloadTaskType = data def update(self, data: SynoDownloadTaskType) -> None: """Update the task.""" self._data = data @property def id(self) -> str: """Return id of the task.""" return self._data["id"] @property def title(self) -> str: """Return title of the task.""" return self._data["title"] @property def type(self) -> str: """Return type of the task (bt, nzb, http(s), ftp, emule).""" return self._data["type"] @property def username(self) -> str: """Return username of the task.""" return self._data["username"] @property def size(self) -> int: """Return size of the task.""" return self._data["size"] @property def status(self) -> str: """Return status of the task. Possible values: waiting, downloading, paused, finishing, finished, hash_checking, seeding, filehosting_waiting, extracting, error """ return self._data["status"] @property def status_extra(self) -> dict | None: """Return status_extra of the task.""" return self._data.get("status_extra") @property def additional(self) -> dict: """Return additional data of the task.""" return self._data["additional"] py-synologydsm-api-2.5.3/src/synology_dsm/api/dsm/000077500000000000000000000000001467623651400221745ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/dsm/__init__.py000066400000000000000000000000371467623651400243050ustar00rootroot00000000000000"""Synology DSM API models.""" py-synologydsm-api-2.5.3/src/synology_dsm/api/dsm/information.py000066400000000000000000000035411467623651400250760ustar00rootroot00000000000000"""DSM Information data.""" from __future__ import annotations from typing import TypedDict from synology_dsm.api import SynoBaseApi class DsmInformationDataType(TypedDict, total=False): """Data type.""" model: str ram: int serial: str temperature: int temperature_warn: bool uptime: int version: str version_string: str class SynoDSMInformation(SynoBaseApi[DsmInformationDataType]): """Class containing Information data.""" API_KEY = "SYNO.DSM.Info" async def update(self) -> None: """Updates information data.""" raw_data = await self._dsm.get(self.API_KEY, "getinfo") if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data @property def model(self) -> str: """Model of the NAS.""" return self._data["model"] @property def ram(self) -> int: """RAM of the NAS (in MB).""" return self._data["ram"] @property def serial(self) -> str: """Serial of the NAS.""" return self._data["serial"] @property def temperature(self) -> int: """Temperature of the NAS.""" return self._data["temperature"] @property def temperature_warn(self) -> bool: """Temperature warning of the NAS.""" # some very old nas may not provide this attribute return self._data.get("temperature_warn", False) @property def uptime(self) -> int: """Uptime of the NAS.""" return self._data["uptime"] @property def version(self) -> str: """Version of the NAS (build version).""" return self._data["version"] @property def version_string(self) -> str: """Version of the NAS.""" return self._data["version_string"] py-synologydsm-api-2.5.3/src/synology_dsm/api/dsm/network.py000066400000000000000000000044011467623651400242360ustar00rootroot00000000000000"""DSM Network data.""" from __future__ import annotations from typing import TypedDict from synology_dsm.api import SynoBaseApi InterfaceIp = TypedDict("InterfaceIp", {"address": str, "netmask": str}) InterfaceIpv6 = TypedDict( "InterfaceIpv6", {"address": str, "prefix_length": int, "scope": str} ) NetworkInterface = TypedDict( "NetworkInterface", { "id": str, "ip": "list[InterfaceIp]", "ipv6": "list[InterfaceIpv6]", "mac": str, "type": str, }, total=False, ) class DsmNetworkDataType(TypedDict, total=False): """Data type.""" dns: list[str] gateway: str hostname: str interfaces: list[NetworkInterface] workgroup: str class SynoDSMNetwork(SynoBaseApi[DsmNetworkDataType]): """Class containing Network data.""" API_KEY = "SYNO.DSM.Network" async def update(self) -> None: """Updates network data.""" raw_data = await self._dsm.get(self.API_KEY, "list") if isinstance(raw_data, dict) and (data := raw_data.get("data")) is not None: self._data = data @property def dns(self) -> list[str]: """DNS of the NAS.""" return self._data["dns"] @property def gateway(self) -> str: """Gateway of the NAS.""" return self._data["gateway"] @property def hostname(self) -> str: """Host name of the NAS.""" return self._data["hostname"] @property def interfaces(self) -> list[NetworkInterface]: """Interfaces of the NAS.""" return self._data["interfaces"] def interface(self, eth_id: str) -> NetworkInterface | None: """Interface of the NAS.""" for interface in self.interfaces: if interface["id"] == eth_id: return interface return None @property def macs(self) -> list[str]: """List of MACs of the NAS.""" macs: list[str] = [] for interface in self.interfaces: if (mac := interface.get("mac")) is not None: macs.append(mac) return macs @property def workgroup(self) -> str: """Workgroup of the NAS.""" return self._data["workgroup"] py-synologydsm-api-2.5.3/src/synology_dsm/api/photos/000077500000000000000000000000001467623651400227255ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/photos/__init__.py000066400000000000000000000142331467623651400250410ustar00rootroot00000000000000"""Synology Photos API wrapper.""" from __future__ import annotations from synology_dsm.api import SynoBaseApi from .model import SynoPhotosAlbum, SynoPhotosItem class SynoPhotos(SynoBaseApi): """An implementation of a Synology Photos.""" API_KEY = "SYNO.Foto.*" BROWSE_ALBUMS_API_KEY = "SYNO.Foto.Browse.Album" BROWSE_ITEM_API_KEY = "SYNO.Foto.Browse.Item" DOWNLOAD_API_KEY = "SYNO.Foto.Download" DOWNLOAD_FOTOTEAM_API_KEY = "SYNO.FotoTeam.Download" SEARCH_API_KEY = "SYNO.Foto.Search.Search" THUMBNAIL_API_KEY = "SYNO.Foto.Thumbnail" THUMBNAIL_FOTOTEAM_API_KEY = "SYNO.FotoTeam.Thumbnail" BROWSE_ITEM_FOTOTEAM_API_KEY = "SYNO.FotoTeam.Browse.Item" async def get_albums( self, offset: int = 0, limit: int = 100 ) -> list[SynoPhotosAlbum] | None: """Get a list of all albums.""" albums: list[SynoPhotosAlbum] = [] raw_data = await self._dsm.get( self.BROWSE_ALBUMS_API_KEY, "list", {"offset": offset, "limit": limit, "category": "normal_share_with_me"}, ) if not isinstance(raw_data, dict) or (data := raw_data.get("data")) is None: return None for album in data["list"]: albums.append( SynoPhotosAlbum( album["id"], album["name"], album["item_count"], album["passphrase"], ) ) return albums def _raw_data_to_items( # noqa: S107 self, raw_data: bytes | dict | str, passphrase: str = "" ) -> list[SynoPhotosItem] | None: """Parse the raw data response to a list of photo items.""" items: list[SynoPhotosItem] = [] if not isinstance(raw_data, dict) or (data := raw_data.get("data")) is None: return None for item in data["list"]: if item["additional"]["thumbnail"]["xl"] == "ready": size = "xl" elif item["additional"]["thumbnail"]["m"] == "ready": size = "m" else: size = "sm" items.append( SynoPhotosItem( item["id"], item["type"], item["filename"], item["filesize"], item["additional"]["thumbnail"]["cache_key"], size, item["owner_user_id"] == 0, passphrase, ) ) return items async def get_items_from_album( self, album: SynoPhotosAlbum, offset: int = 0, limit: int = 100 ) -> list[SynoPhotosItem] | None: """Get a list of all items from given album.""" params = { "offset": offset, "limit": limit, "additional": '["thumbnail"]', } if album.passphrase: params["passphrase"] = album.passphrase else: params["album_id"] = album.album_id raw_data = await self._dsm.get( self.BROWSE_ITEM_API_KEY, "list", params, ) return self._raw_data_to_items(raw_data, album.passphrase) async def get_items_from_shared_space( self, offset: int = 0, limit: int = 100 ) -> list[SynoPhotosItem] | None: """Get a list of all items from the shared space.""" raw_data = await self._dsm.get( self.BROWSE_ITEM_FOTOTEAM_API_KEY, "list", { "offset": offset, "limit": limit, "additional": '["thumbnail"]', }, ) return self._raw_data_to_items(raw_data) async def get_items_from_search( self, search_string: str, offset: int = 0, limit: int = 100 ) -> list[SynoPhotosItem] | None: """Get a list of all items matching the keyword.""" raw_data = await self._dsm.get( self.SEARCH_API_KEY, "list_item", { "keyword": search_string, "offset": offset, "limit": limit, "additional": '["thumbnail"]', }, ) return self._raw_data_to_items(raw_data) async def download_item(self, item: SynoPhotosItem) -> bytes | None: """Download the given item.""" download_api = self.DOWNLOAD_API_KEY if item.is_shared: download_api = self.DOWNLOAD_FOTOTEAM_API_KEY params = { "unit_id": f"[{item.item_id}]", "cache_key": item.thumbnail_cache_key, } if item.passphrase: params["passphrase"] = item.passphrase raw_data = await self._dsm.get( download_api, "download", params, ) if isinstance(raw_data, bytes): return raw_data return None async def download_item_thumbnail(self, item: SynoPhotosItem) -> bytes | None: """Download the given items thumbnail.""" download_api = self.THUMBNAIL_API_KEY if item.is_shared: download_api = self.THUMBNAIL_FOTOTEAM_API_KEY params = { "id": item.item_id, "cache_key": item.thumbnail_cache_key, "size": item.thumbnail_size, "type": "unit", } if item.passphrase: params["passphrase"] = item.passphrase raw_data = await self._dsm.get( download_api, "get", params, ) if isinstance(raw_data, bytes): return raw_data return None async def get_item_thumbnail_url(self, item: SynoPhotosItem) -> str: """Get the url of given items thumbnail.""" download_api = self.THUMBNAIL_API_KEY if item.is_shared: download_api = self.THUMBNAIL_FOTOTEAM_API_KEY params = { "id": item.item_id, "cache_key": item.thumbnail_cache_key, "size": item.thumbnail_size, "type": "unit", } if item.passphrase: params["passphrase"] = item.passphrase return await self._dsm.generate_url( download_api, "get", params, ) py-synologydsm-api-2.5.3/src/synology_dsm/api/photos/model.py000066400000000000000000000010301467623651400243710ustar00rootroot00000000000000"""Data models for Synology Photos Module.""" from __future__ import annotations from dataclasses import dataclass @dataclass class SynoPhotosAlbum: """Representation of an Synology Photos Album.""" album_id: int name: str item_count: int passphrase: str @dataclass class SynoPhotosItem: """Representation of an Synology Photos Item.""" item_id: int item_type: str file_name: str file_size: str thumbnail_cache_key: str thumbnail_size: str is_shared: bool passphrase: str py-synologydsm-api-2.5.3/src/synology_dsm/api/storage/000077500000000000000000000000001467623651400230555ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/storage/__init__.py000066400000000000000000000000431467623651400251630ustar00rootroot00000000000000"""Synology Storage API models.""" py-synologydsm-api-2.5.3/src/synology_dsm/api/storage/storage.py000066400000000000000000000210461467623651400250760ustar00rootroot00000000000000"""DSM Storage data.""" from __future__ import annotations from typing import TypedDict, cast from synology_dsm.api import SynoBaseApi from synology_dsm.helpers import SynoFormatHelper class SynoStorageDisk(TypedDict, total=False): """Synology Storage Disk.""" id: str name: str device: str firm: str diskType: str # noqa: N815 smart_status: str status: str exceed_bad_sector_thr: bool below_remain_life_thr: bool temp: int model: str vendor: str size_total: int SynoStoragePoolChild = TypedDict( "SynoStoragePoolChild", {"id": str, "size": dict}, total=False ) class SynoStoragePool(TypedDict, total=False): """Synology Storage Pool.""" disks: list[str] pool_child: list[SynoStoragePoolChild] SynoStorageVolumeSize = TypedDict( "SynoStorageVolumeSize", { "free_inode": str, "total": str, "total_device": str, "total_inode": str, "used": str, }, ) class SynoStorageVolume(TypedDict, total=False): """Synology Storage Volume.""" id: str device_type: str size: SynoStorageVolumeSize status: str fs_type: str class StorageDataType(TypedDict, total=False): """Synology Storage Data type.""" disks: list[SynoStorageDisk] env: dict storagePools: list[SynoStoragePool] # noqa: N815 volumes: list[SynoStorageVolume] class SynoStorage(SynoBaseApi[StorageDataType]): """Class containing Storage data.""" API_KEY = "SYNO.Storage.CGI.Storage" async def update(self) -> None: """Updates storage data.""" raw_data = await self._dsm.get(self.API_KEY, "load_info") if isinstance(raw_data, dict): self._data = cast(StorageDataType, raw_data) if (data := raw_data.get("data")) is not None: self._data = data # Root @property def disks(self) -> list[SynoStorageDisk]: """Gets all (internal) disks.""" return self._data.get("disks", []) @property def env(self) -> dict | None: """Gets storage env.""" return self._data.get("env") @property def storage_pools(self) -> list[SynoStoragePool]: """Gets all storage pools.""" return self._data.get("storagePools", []) @property def volumes(self) -> list[SynoStorageVolume]: """Gets all volumes.""" return self._data.get("volumes", []) # Volume @property def volumes_ids(self) -> list[str]: """Returns volumes ids.""" volumes: list[str] = [] for volume in self.volumes: volumes.append(volume["id"]) return volumes def get_volume(self, volume_id: str) -> SynoStorageVolume | None: """Returns a specific volume.""" for volume in self.volumes: if volume["id"] == volume_id: return volume return None def volume_status(self, volume_id: str) -> str | None: """Status of the volume (normal, degraded, etc).""" if volume := self.get_volume(volume_id): return volume.get("status") return None def volume_device_type(self, volume_id: str) -> str | None: """Returns the volume type (RAID1, RAID2, etc).""" if volume := self.get_volume(volume_id): return volume.get("device_type") return None def volume_size_total( self, volume_id: str, human_readable: bool = False ) -> int | str | None: """Total size of volume.""" if (volume := self.get_volume(volume_id)) is None or ( size := volume.get("size") ) is None: return None return_data = int(size["total"]) if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def volume_size_used( self, volume_id: str, human_readable: bool = False ) -> int | str | None: """Total used size in volume.""" if (volume := self.get_volume(volume_id)) is None or ( size := volume.get("size") ) is None: return None return_data = int(size["used"]) if human_readable: return SynoFormatHelper.bytes_to_readable(return_data) return return_data def volume_percentage_used(self, volume_id: str) -> float | None: """Total used size in percentage for volume.""" if (volume := self.get_volume(volume_id)) is None or ( size := volume.get("size") ) is None: return None total = int(size["total"]) used = int(size["used"]) return round((float(used) / float(total)) * 100.0, 1) def volume_disk_temp_avg(self, volume_id: str) -> float | None: """Average temperature of all disks making up the volume.""" total_temp = 0 total_disks = 0 disks = self._get_disks_for_volume(volume_id) for disk in disks: if disk_temp := self.disk_temp(disk["id"]): total_disks += 1 total_temp += disk_temp if total_temp > 0 and total_disks > 0: return round(total_temp / total_disks, 0) return None def volume_disk_temp_max(self, volume_id: str) -> int | None: """Maximum temperature of all disks making up the volume.""" disks = self._get_disks_for_volume(volume_id) if not disks: return None disk_temps: list[int] = [0] for disk in disks: if disk_temp := self.disk_temp(disk["id"]): disk_temps.append(disk_temp) return max(disk_temps) # Disk @property def disks_ids(self) -> list[str]: """Returns (internal) disks ids.""" disks: list[str] = [] for disk in self.disks: disks.append(disk["id"]) return disks def get_disk(self, disk_id: str) -> SynoStorageDisk | None: """Returns a specific disk.""" for disk in self.disks: if disk["id"] == disk_id: return disk return None def _get_disks_for_volume(self, volume_id: str) -> list[SynoStorageDisk]: """Returns a list of disk for a specific volume.""" disks: list[SynoStorageDisk] = [] for pool in self.storage_pools: if pool.get("deploy_path") == volume_id: # RAID disk redundancy for disk_id in pool["disks"]: if disk := self.get_disk(disk_id): disks.append(disk) if pool.get("pool_child"): # SHR disk redundancy for pool_child in pool["pool_child"]: if pool_child["id"] != volume_id: continue for disk_id in pool["disks"]: if disk := self.get_disk(disk_id): disks.append(disk) return disks def disk_name(self, disk_id: str) -> str | None: """The name of this disk.""" if disk := self.get_disk(disk_id): return disk.get("name") return None def disk_device(self, disk_id: str) -> str | None: """The mount point of this disk.""" if disk := self.get_disk(disk_id): return disk.get("device") return None def disk_smart_status(self, disk_id: str) -> str | None: """Status of disk according to S.M.A.R.T).""" if disk := self.get_disk(disk_id): return disk.get("smart_status") return None def disk_status(self, disk_id: str) -> str | None: """Status of disk.""" if disk := self.get_disk(disk_id): return disk.get("status") return None def disk_exceed_bad_sector_thr(self, disk_id: str) -> bool | None: """Checks if disk has exceeded maximum bad sector threshold.""" if disk := self.get_disk(disk_id): return disk.get("exceed_bad_sector_thr") return None def disk_below_remain_life_thr(self, disk_id: str) -> bool | None: """Checks if disk has fallen below minimum life threshold.""" if disk := self.get_disk(disk_id): return disk.get("below_remain_life_thr") return None def disk_temp(self, disk_id: str) -> int | None: """Returns the temperature of the disk.""" if disk := self.get_disk(disk_id): return disk.get("temp") return None py-synologydsm-api-2.5.3/src/synology_dsm/api/surveillance_station/000077500000000000000000000000001467623651400256465ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/api/surveillance_station/__init__.py000066400000000000000000000227361467623651400277710ustar00rootroot00000000000000"""Synology SurveillanceStation API wrapper.""" from __future__ import annotations from typing import TypedDict, cast from synology_dsm.api import SynoBaseApi from .camera import SynoCamera, SynoCameraLiveView from .const import ( MOTION_DETECTION_BY_SURVEILLANCE, MOTION_DETECTION_DISABLED, SNAPSHOT_PROFILE_BALANCED, ) SurveillanceStationInfoData = TypedDict( "SurveillanceStationInfoData", { "CMSMinVersion": str, "DSModelName": str, "SvsClientMinVersion": str, "VS360HDLoginMinVersion": str, "VS960HDMinVersion": str, "cameraNumber": int, "defaultWallpaperCount": int, "enableVideoRelay": bool, "hostname": str, "inaAdvancedPriv": int, "isBeta": bool, "isLicenseEnough": int, "is_beta": bool, "liscenseNumber": int, "maxCameraSupport": int, "maxlanport": str, "path": str, "pluginHelperVersion": str, "productName": str, "remindQuickconnectTunnel": bool, "reportURL": str, "serial": str, "serviceVolSize": float, "strInaAdvancedPriv": str, "timezone": str, "timezoneTZDB": str, "uid": int, "unique": str, "userPriv": int, "version": dict, "webPluginVersion": str, }, total=False, ) SurveillanceStationInfo = TypedDict( "SurveillanceStationInfo", {"data": SurveillanceStationInfoData, "success": bool} ) SurveillanceStationTakeSnapshotDataType = TypedDict( "SurveillanceStationTakeSnapshotDataType", {"id": int} ) SurveillanceStationTakeSnapshotType = TypedDict( "SurveillanceStationTakeSnapshotType", {"data": SurveillanceStationTakeSnapshotDataType, "success": bool}, ) class SynoSurveillanceStation(SynoBaseApi["dict[int, SynoCamera]"]): """An implementation of a Synology SurveillanceStation.""" API_KEY = "SYNO.SurveillanceStation.*" INFO_API_KEY = "SYNO.SurveillanceStation.Info" CAMERA_API_KEY = "SYNO.SurveillanceStation.Camera" CAMERA_EVENT_API_KEY = "SYNO.SurveillanceStation.Camera.Event" HOME_MODE_API_KEY = "SYNO.SurveillanceStation.HomeMode" SNAPSHOT_API_KEY = "SYNO.SurveillanceStation.SnapShot" async def update(self) -> None: """Update cameras and motion settings with latest from API.""" self._data: dict[int, SynoCamera] = {} raw_data = await self._dsm.get(self.CAMERA_API_KEY, "List", max_version=7) if not isinstance(raw_data, dict) or (data := raw_data.get("data")) is None: return for camera_data in data["cameras"]: if camera_data["id"] in self._data: self._data[camera_data["id"]].update(camera_data) else: self._data[camera_data["id"]] = SynoCamera(camera_data) for camera_id, camera in self._data.items(): motion_raw_data = await self._dsm.get( self.CAMERA_EVENT_API_KEY, "MotionEnum", {"camId": camera_id} ) if ( isinstance(motion_raw_data, dict) and (motion_data := motion_raw_data.get("data")) is not None ): camera.update_motion_detection(motion_data) if not self._data: return live_view_raw_datas = await self._dsm.get( self.CAMERA_API_KEY, "GetLiveViewPath", {"idList": ",".join(str(k) for k in self._data)}, ) if ( isinstance(live_view_raw_datas, dict) and (live_view_datas := live_view_raw_datas.get("data")) is not None ): for live_view_data in live_view_datas: self._data[live_view_data["id"]].live_view.update(live_view_data) # Global async def get_info(self) -> SurveillanceStationInfo | None: """Return general informations about the Surveillance Station instance.""" raw_data = await self._dsm.get(self.INFO_API_KEY, "GetInfo") if isinstance(raw_data, dict) and raw_data.get("success"): return cast(SurveillanceStationInfo, raw_data) return None # Camera def get_all_cameras(self) -> list[SynoCamera]: """Return a list of cameras.""" return list(self._data.values()) def get_camera(self, camera_id: int) -> SynoCamera | None: """Return camera matching camera_id.""" return self._data.get(camera_id) def get_camera_live_view_path( self, camera_id: int, video_format: str | None = None ) -> SynoCameraLiveView | str | None: """Return camera live view path matching camera_id. Args: camera_id: ID of the camera we want to get the live view path. video_format: mjpeg_http | multicast | mxpeg_http | rtsp_http | rtsp. """ if (camera := self._data.get(camera_id)) is None: return None if video_format: return getattr(camera.live_view, video_format, None) return camera.live_view async def get_camera_image( self, camera_id: int, profile: int = SNAPSHOT_PROFILE_BALANCED ) -> bytes: """Return bytes of camera image for camera matching camera_id. Args: camera_id: ID of the camera we want to take a snapshot from profile: SNAPSHOT_PROFILE_HIGH_QUALITY | SNAPSHOT_PROFILE_BALANCED | SNAPSHOT_PROFILE_LOW_BANDWIDTH """ return cast( bytes, await self._dsm.get( self.CAMERA_API_KEY, "GetSnapshot", {"id": camera_id, "cameraId": camera_id, "profileType": profile}, ), ) async def enable_camera(self, camera_ids: str) -> bool | None: """Enable camera(s) - multiple ID or single ex 1 or 1,2,3.""" raw_data = await self._dsm.get( self.CAMERA_API_KEY, "Enable", {"idList": camera_ids} ) if ( isinstance(raw_data, dict) and (result := raw_data.get("success")) is not None ): return bool(result) return None async def disable_camera(self, camera_ids: str) -> bool | None: """Disable camera(s) - multiple ID or single ex 1 or 1,2,3.""" raw_data = await self._dsm.get( self.CAMERA_API_KEY, "Disable", {"idList": camera_ids} ) if ( isinstance(raw_data, dict) and (result := raw_data.get("success")) is not None ): return bool(result) return None # Snapshot async def capture_camera_image( self, camera_id: int, save: bool = True ) -> SurveillanceStationTakeSnapshotType | None: """Capture a snapshot for camera matching camera_id.""" raw_data = await self._dsm.get( self.SNAPSHOT_API_KEY, "TakeSnapshot", { "camId": camera_id, "blSave": int(save), # API requires an integer instead of a boolean }, ) if isinstance(raw_data, dict): return cast(SurveillanceStationTakeSnapshotType, raw_data) return None async def download_snapshot( self, snapshot_id: int, snapshot_size: int ) -> bytes | None: """Download snapshot image binary for a givent snapshot_id. Args: snapshot_id: ID of the snapshot we want to download. snapshot_size: SNAPSHOT_SIZE_ICON | SNAPSHOT_SIZE_FULL. """ raw_data = await self._dsm.get( self.SNAPSHOT_API_KEY, "LoadSnapshot", {"id": snapshot_id, "imgSize": snapshot_size}, ) if isinstance(raw_data, bytes): return raw_data return None # Motion def is_motion_detection_enabled(self, camera_id: int) -> bool: """Return motion setting matching camera_id.""" return bool(self._data[camera_id].is_motion_detection_enabled) async def enable_motion_detection(self, camera_id: int) -> dict | None: """Enable motion detection for camera matching camera_id.""" raw_data = await self._dsm.get( self.CAMERA_EVENT_API_KEY, "MDParamSave", {"camId": camera_id, "source": MOTION_DETECTION_BY_SURVEILLANCE}, ) if isinstance(raw_data, dict): return raw_data return None async def disable_motion_detection(self, camera_id: int) -> dict | None: """Disable motion detection for camera matching camera_id.""" raw_data = await self._dsm.get( self.CAMERA_EVENT_API_KEY, "MDParamSave", {"camId": camera_id, "source": MOTION_DETECTION_DISABLED}, ) if isinstance(raw_data, dict): return raw_data return None # Home mode async def get_home_mode_status(self) -> bool | None: """Get the state of Home Mode.""" raw_data = await self._dsm.get(self.HOME_MODE_API_KEY, "GetInfo") if ( isinstance(raw_data, dict) and raw_data.get("data") and (status := raw_data["data"].get("on")) is not None ): return bool(status) return None async def set_home_mode(self, state: bool) -> bool | None: """Set the state of Home Mode (state: bool).""" raw_data = await self._dsm.get( self.HOME_MODE_API_KEY, "Switch", {"on": str(state).lower()} ) if ( isinstance(raw_data, dict) and (result := raw_data.get("success")) is not None ): return bool(result) return None py-synologydsm-api-2.5.3/src/synology_dsm/api/surveillance_station/camera.py000066400000000000000000000073341467623651400274570ustar00rootroot00000000000000"""SurveillanceStation camera.""" from __future__ import annotations from typing import TypedDict from .const import MOTION_DETECTION_DISABLED, RECORDING_STATUS SynoCameraData = TypedDict( "SynoCameraData", { "enabled": bool, "fps": int, "id": int, "MDParam": dict, "model": str, "name": str, "recStatus": int, "resolution": str, }, total=False, ) SynoCameraLifeViewData = TypedDict( "SynoCameraLifeViewData", { "mjpegHttpPath": str, "multicstPath": str, "mxpegHttpPath": str, "rtspOverHttpPath": str, "rtspPath": str, }, total=False, ) class SynoCamera: """An representation of a Synology SurveillanceStation camera.""" def __init__( self, data: SynoCameraData, live_view_data: SynoCameraLifeViewData | None = None ) -> None: """Initialize a Surveillance Station camera.""" self._data: SynoCameraData = data self.live_view = SynoCameraLiveView(live_view_data) self._motion_detection_enabled: bool | None = None def update(self, data: SynoCameraData) -> None: """Update the camera.""" self._data = data def update_motion_detection(self, data: SynoCameraData) -> None: """Update the camera motion detection.""" self._motion_detection_enabled = ( MOTION_DETECTION_DISABLED != data["MDParam"]["source"] ) @property def id(self) -> int: """Return id of the camera.""" return self._data["id"] @property def name(self) -> str: """Return name of the camera.""" return self._data["name"] @property def model(self) -> str: """Return model of the camera.""" return self._data["model"] @property def resolution(self) -> str: """Return resolution of the camera.""" return self._data["resolution"] @property def fps(self) -> int: """Return FPS of the camera.""" return self._data["fps"] @property def is_enabled(self) -> bool: """Return true if camera is enabled.""" return self._data["enabled"] @property def is_motion_detection_enabled(self) -> bool | None: """Return true if motion detection is enabled.""" return self._motion_detection_enabled @property def is_recording(self) -> bool: """Return true if camera is recording.""" return self._data["recStatus"] in RECORDING_STATUS class SynoCameraLiveView: """An representation of a Synology SurveillanceStation camera live view.""" def __init__(self, data: SynoCameraLifeViewData | None): """Initialize a Surveillance Station camera live view.""" if data is not None: self._data = data else: self._data = {} def update(self, data: SynoCameraLifeViewData) -> None: """Update the camera live view.""" self._data = data @property def mjpeg_http(self) -> str | None: """Return the mjpeg stream (over http) path of the camera.""" return self._data.get("mjpegHttpPath") @property def multicast(self) -> str | None: """Return the multi-cast path of the camera.""" return self._data.get("multicstPath") @property def mxpeg_http(self) -> str | None: """Return the mxpeg stream path of the camera.""" return self._data.get("mxpegHttpPath") @property def rtsp_http(self) -> str | None: """Return the RTSP stream (over http) path of the camera.""" return self._data.get("rtspOverHttpPath") @property def rtsp(self) -> str | None: """Return the RTSP stream path of the camera.""" return self._data.get("rtspPath") py-synologydsm-api-2.5.3/src/synology_dsm/api/surveillance_station/const.py000066400000000000000000000010131467623651400273410ustar00rootroot00000000000000"""Synology SurveillanceStation API constants.""" RECORDING_STATUS = [ 1, # Continue recording schedule 2, # Motion detect recording schedule 3, # Digital input recording schedule 4, # Digital input recording schedule 5, # Manual recording schedule ] MOTION_DETECTION_DISABLED = -1 MOTION_DETECTION_BY_CAMERA = 0 MOTION_DETECTION_BY_SURVEILLANCE = 1 SNAPSHOT_SIZE_ICON = 1 SNAPSHOT_SIZE_FULL = 2 SNAPSHOT_PROFILE_HIGH_QUALITY = 0 SNAPSHOT_PROFILE_BALANCED = 1 SNAPSHOT_PROFILE_LOW_BANDWIDTH = 2 py-synologydsm-api-2.5.3/src/synology_dsm/const.py000066400000000000000000000175241467623651400223510ustar00rootroot00000000000000"""Library constants.""" from typing import Final # APIs API_INFO: Final = "SYNO.API.Info" API_AUTH: Final = "SYNO.API.Auth" # Parameters to be masked on debug output SENSITIV_PARAMS: Final = ["account", "passwd", "_sid", "SynoToken", "device_id"] # SYNO.* ERROR_COMMON: Final = { 100: "Unknown error", 101: "No parameter API, method, or version", 102: "API does not exist", 103: "API method does not exist", 104: "API version not supported", 105: "Insufficient user privilege", 106: "Session timeout", 107: "Session interrupted by duplicate login", 114: "Missing required parameters", 117: "Unknown internal error", 120: "Invalid parameter", 160: "Insufficient application privilege", } # SYNO.API.Auth ERROR_AUTH: Final = { 400: "Invalid credentials", 401: "Guest or disabled account", 402: "Permission denied", 403: "One time password not specified", 404: "One time password authenticate failed", 405: "App portal incorrect", 406: "One time password code enforced", 407: "Max Tries (if auto blocking is set to true)", 408: "Password Expired Can not Change", 409: "Password Expired", 410: "Password must change (when first time use or after reset password by admin)", 411: "Account Locked (when account max try exceed)", } # SYNO.DownloadStation[2].BTSearch ERROR_DOWNLOAD_SEARCH: Final = { 400: "Unknown error", 401: "Invalid parameter", 402: "Parse the user setting failed", 403: "Get category failed", 404: "Get the search result from DB failed", 405: "Get the user setting failed", } # SYNO.DownloadStation[2].Task ERROR_DOWNLOAD_TASK: Final = { 400: "File upload failed", 401: "Max number of tasks reached", 402: "Destination denied", 403: "Destination does not exist", 404: "Invalid task id", 405: "Invalid task action", 406: "No default destination", 407: "Set destination failed", 408: "File does not exist", } # SYNO.FileStation.* ERROR_FILE: Final = { 400: "Invalid parameter of file operation", 401: "Unknown error of file operation", 402: "System is too busy", 403: "Invalid user does this file operation", 404: "Invalid group does this file operation", 405: "Invalid user and group does this file operation", 406: "Can’t get user/group information from the account server Operation not permitted", 407: "Operation not permitted", 408: "No such file or directory", 409: "Non-supported file system", 410: "Failed to connect internet-based file system (ex: CIFS)", 411: "Read-only file system", 412: "Filename too long in the non-encrypted file system", 413: "Filename too long in the encrypted file system", 414: "File already exists", 415: "Disk quota exceeded", 416: "No space left on device", 417: "Input/output error", 418: "Illegal name or path", 419: "Illegal file name", 420: "Illegal file name on FAT file system", 421: "Device or resource busy", 599: "No such task of the file operation", 900: "Failed to delete file(s)/folder(s). More information in object", 1000: "Failed to copy files/folders. More information in object", 1001: "Failed to move files/folders. More information in object", 1002: "An error occurred at the destination. More information in object", 1003: "Cannot overwrite or skip the existing file because no overwrite parameter is given", 1004: "File cannot overwrite a folder with the same name, or folder cannot overwrite a file with the same name", # pylint: disable=line-too-long 1006: "Cannot copy/move file/folder with special characters to a FAT32 file system", 1007: "Cannot copy/move a file bigger than 4G to a FAT32 file system", 1100: "Failed to create a folder. More information in object", 1101: "The number of folders to the parent folder would exceed the system limitation", 1300: "Failed to compress files/folders", 1301: "Cannot create the archive because the given archive name is too long", 1400: "Failed to extract files", 1401: "Cannot open the file as archive", 1402: "Failed to read archive data error", 1403: "Wrong archive password", 1404: "Failed to get the file and dir list in an archive", 1405: "Failed to find the item ID in an archive file", 1200: "Failed to rename it. More information in object", 1800: "There is no Content-Length information in the HTTP header or the received size doesn’t match the value of Content-Length information in the HTTP header", # pylint: disable=line-too-long 1801: "Wait too long, no date can be received from client (Default maximum wait time is 3600 seconds)", # pylint: disable=line-too-long 1802: "No filename information in the last part of file content", 1803: "Upload connection is cancelled", 1804: "Failed to upload too big file to FAT file system", 1805: "Can’t overwrite or skip the existed file, if no overwrite parameter is given", 2000: "Sharing link does not exist", 2001: "Cannot generate sharing link because too many sharing links exist", 2002: "Failed to access sharing links", } # SYNO.SurveillanceStation.* ERROR_SURVEILLANCE: Final = { 400: "Execution failed", 401: "Invalid parameter", 402: "Camera disabled", 403: "Insufficient license", 404: "Codec activation failed", 405: "CMS server connection failed", 407: "CMS closed", 412: "Need to add license", 413: "Reach the maximum of platform", 414: "Some events not exist", 415: "Message connect failed", 417: "Test connection error", 418: "Object/VisualStation ID does not exist", 419: "VisualStation name repetition", 439: "Too many items selected", 446: "Task path already exist", 522: "Original task is migrating", 534: "Exceed name length limitation", } # SYNO.Virtualization.* ERROR_VIRTUALIZATION: Final = { 400: "Unknown error", 401: "Bad parameter", 402: "Operation failed", 403: "Name conflict", 404: "The number of iSCSI LUNs has reached the system limit", 500: "Note: vdisk is based on iSCSI LUN, which is also limited by the system", 501: "The cluster is frozen. More than half of the hosts are offline", 600: "The cluster is in the incompatible mode. Please upgrade to a compatible DSM version and try again", # pylint: disable=line-too-long 601: "The cluster is not ready", 700: "The host is offline", 900: "The storage is in invalid", 901: "Failed to set a host to a virtual machine", 902: "The virtual machine does not have a host", 903: "Failed to power on a virtual machine due to insufficient CPU threads", 904: "Failed to power on a virtual machine due to insufficient memory", 905: "The status of virtual machine is online", 906: "MAC conflict", 907: "Failed to create virtual machine because the selected image is not found", 908: "The status of virtual machine is offline", 909: "Failed to power on a virtual machine due to insufficient CPU threads for reservation on the host", # pylint: disable=line-too-long 910: "Failed to power on the virtual machine because there is no corresponding networking on the host", # pylint: disable=line-too-long 911: "Only the VirtIO hard disk controller can be used to boot the virtual machine remotely. Virtual machines with UEFI enabled cannot be powered on remotely", # pylint: disable=line-too-long 1000: "Cannot find task_id", 1001: "Need Virtual Machine Manager Pro", 1400: "The result of image creating is partial success", 1600: "The virtual machine has been successfully edited. However, errors occurred while reserving the memory or CPU on the HA hosts", # pylint: disable=line-too-long } py-synologydsm-api-2.5.3/src/synology_dsm/exceptions.py000066400000000000000000000115071467623651400233770ustar00rootroot00000000000000"""Library exceptions.""" from __future__ import annotations from .const import ( API_AUTH, ERROR_AUTH, ERROR_COMMON, ERROR_DOWNLOAD_SEARCH, ERROR_DOWNLOAD_TASK, ERROR_FILE, ERROR_SURVEILLANCE, ERROR_VIRTUALIZATION, ) class SynologyDSMException(Exception): """Generic Synology DSM exception.""" def __init__(self, api: str | None, code: int, details: str | None = None) -> None: """Constructor method.""" reason = ERROR_COMMON.get(code) if api and not reason: if api == API_AUTH: reason = ERROR_AUTH.get(code) elif "SYNO.DownloadStation" in api: if "BTSearch" in api: reason = ERROR_DOWNLOAD_SEARCH.get(code) elif "Task" in api: reason = ERROR_DOWNLOAD_TASK.get(code) elif "SYNO.FileStation" in api: reason = ERROR_FILE.get(code) elif "SYNO.SurveillanceStation" in api: reason = ERROR_SURVEILLANCE.get(code) elif "SYNO.Virtualization" in api: reason = ERROR_VIRTUALIZATION.get(code) if not reason: reason = "Unknown" error_message = {"api": api, "code": code, "reason": reason, "details": details} super().__init__(error_message) class SynologyDSMNotLoggedInException(SynologyDSMException): """Not logged in exception.""" def __init__(self) -> None: """Constructor method.""" super().__init__(None, -1, "Not logged in. You have to do login() first.") # Request class SynologyDSMRequestException(SynologyDSMException): """Request exception.""" def __init__(self, exception: Exception) -> None: """Constructor method.""" ex_class = exception.__class__.__name__ if not exception.args: super().__init__(None, -1, ex_class) return ex_reason = exception.args[0] if hasattr(exception.args[0], "reason"): ex_reason = exception.args[0].reason super().__init__(None, -1, f"{ex_class} = {ex_reason}") # API class SynologyDSMAPINotExistsException(SynologyDSMException): """API not exists exception.""" def __init__(self, api: str) -> None: """Constructor method.""" super().__init__(api, -2, f"API {api} does not exists") class SynologyDSMAPIErrorException(SynologyDSMException): """API returns an error exception.""" def __init__(self, api: str, code: int, details: str) -> None: """Constructor method.""" super().__init__(api, code, details) # Login class SynologyDSMLoginFailedException(SynologyDSMException): """Failed to login exception.""" def __init__(self, code: int, details: str | None = None) -> None: """Constructor method.""" super().__init__(API_AUTH, code, details) class SynologyDSMLoginInvalidException(SynologyDSMLoginFailedException): """Invalid password & not admin account exception.""" def __init__(self, username: str) -> None: """Constructor method.""" message = f"Invalid password or not admin account: {username}" super().__init__(400, message) class SynologyDSMLoginDisabledAccountException(SynologyDSMLoginFailedException): """Guest & disabled account exception.""" def __init__(self, username: str) -> None: """Constructor method.""" message = f"Guest or disabled account: {username}" super().__init__(401, message) class SynologyDSMLoginPermissionDeniedException(SynologyDSMLoginFailedException): """No access to login exception.""" def __init__(self, username: str) -> None: """Constructor method.""" message = f"Permission denied for account: {username}" super().__init__(402, message) class SynologyDSMLogin2SARequiredException(SynologyDSMLoginFailedException): """2SA required to login exception.""" def __init__(self, username: str) -> None: """Constructor method.""" message = f"Two-step authentication required for account: {username}" super().__init__(403, message) class SynologyDSMLogin2SAFailedException(SynologyDSMLoginFailedException): """2SA code failed exception.""" def __init__(self) -> None: """Constructor method.""" message = "Two-step authentication failed, retry with a new pass code" super().__init__(404, message) class SynologyDSMLogin2SAForcedException(SynologyDSMLoginFailedException): """2SA force to setup exception.""" def __init__(self, username: str) -> None: """Constructor method.""" message = ( f"Two-step authentication forced to be setuped for account: {username}" ) super().__init__(406, message) py-synologydsm-api-2.5.3/src/synology_dsm/helpers.py000066400000000000000000000026301467623651400226550ustar00rootroot00000000000000"""Helpers.""" from __future__ import annotations class SynoFormatHelper: """Class containing various formatting functions.""" @staticmethod def bytes_to_readable(num: int) -> str: """Converts bytes to a human readable format.""" if num < 512: return "0 Kb" if num < 1024: return "1 Kb" work_num = float(num) for unit in ["", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb"]: if abs(work_num) < 1024.0: return f"{round(work_num,1)}{unit}" work_num /= 1024.0 return f"{round(work_num,1)}Yb" @staticmethod def bytes_to_megabytes(num: int) -> float: """Converts bytes to megabytes.""" var_mb = num / 1024.0 / 1024.0 return round(var_mb, 1) @staticmethod def bytes_to_gigabytes(num: int) -> float: """Converts bytes to gigabytes.""" var_gb = num / 1024.0 / 1024.0 / 1024.0 return round(var_gb, 1) @staticmethod def bytes_to_terrabytes(num: int) -> float: """Converts bytes to terrabytes.""" var_tb = num / 1024.0 / 1024.0 / 1024.0 / 1024.0 return round(var_tb, 1) @staticmethod def megabytes_to_bytes(num: int | float) -> int: """Converts megabytes to bytes.""" var_bytes = num * 1024.0 * 1024.0 return int(round(var_bytes, 0)) py-synologydsm-api-2.5.3/src/synology_dsm/py.typed000066400000000000000000000000001467623651400223250ustar00rootroot00000000000000py-synologydsm-api-2.5.3/src/synology_dsm/synology_dsm.py000066400000000000000000000513171467623651400237470ustar00rootroot00000000000000"""Class to interact with Synology DSM.""" from __future__ import annotations import asyncio import logging import socket from ipaddress import IPv6Address from json import JSONDecodeError from typing import Any, Coroutine, TypedDict from urllib.parse import quote, urlencode from aiohttp import ClientError, ClientSession, ClientTimeout from yarl import URL from .api import SynoBaseApi from .api.core.external_usb import SynoCoreExternalUSB from .api.core.security import SynoCoreSecurity from .api.core.share import SynoCoreShare from .api.core.system import SynoCoreSystem from .api.core.upgrade import SynoCoreUpgrade from .api.core.utilization import SynoCoreUtilization from .api.download_station import SynoDownloadStation from .api.dsm.information import SynoDSMInformation from .api.dsm.network import SynoDSMNetwork from .api.photos import SynoPhotos from .api.storage.storage import SynoStorage from .api.surveillance_station import SynoSurveillanceStation from .const import API_AUTH, API_INFO, SENSITIV_PARAMS from .exceptions import ( SynologyDSMAPIErrorException, SynologyDSMAPINotExistsException, SynologyDSMLogin2SAFailedException, SynologyDSMLogin2SAForcedException, SynologyDSMLogin2SARequiredException, SynologyDSMLoginDisabledAccountException, SynologyDSMLoginFailedException, SynologyDSMLoginInvalidException, SynologyDSMLoginPermissionDeniedException, SynologyDSMNotLoggedInException, SynologyDSMRequestException, ) _LOGGER = logging.getLogger(__name__) class ApiType(TypedDict): """Synology api info description.""" maxVersion: int # noqa: N815 minVersion: int # noqa: N815 path: str class SynologyDSM: """Class containing the main Synology DSM functions.""" DSM_5_WEIRD_URL_API = [ SynoStorage.API_KEY, ] def __init__( self, session: ClientSession, dsm_ip: str, dsm_port: int, username: str, password: str, use_https: bool = False, timeout: int | ClientTimeout = 10, device_token: str | None = None, debugmode: bool = False, ): """Constructor method.""" self.username = username self._password = password if isinstance(timeout, ClientTimeout): self._aiohttp_timeout = timeout else: self._aiohttp_timeout = ClientTimeout(total=timeout) self._debugmode = debugmode # Session self._session = session # Login self._session_id: str | None = None self._syno_token: str | None = None self._device_token = device_token # Services self._apis: dict[str, ApiType] = { "SYNO.API.Info": {"maxVersion": 1, "minVersion": 1, "path": "query.cgi"} } self._download: SynoDownloadStation | None = None self._external_usb: SynoCoreExternalUSB | None = None self._information: SynoDSMInformation | None = None self._network: SynoDSMNetwork | None = None self._photos: SynoPhotos | None = None self._security: SynoCoreSecurity | None = None self._share: SynoCoreShare | None = None self._storage: SynoStorage | None = None self._surveillance: SynoSurveillanceStation | None = None self._system: SynoCoreSystem | None = None self._utilisation: SynoCoreUtilization | None = None self._upgrade: SynoCoreUpgrade | None = None try: IPv6Address(dsm_ip) dsm_ip = f"[{dsm_ip}]" except ValueError: pass # Build variables if use_https: self._base_url = URL(f"https://{dsm_ip}:{dsm_port}") else: self._base_url = URL(f"http://{dsm_ip}:{dsm_port}") def _debuglog(self, message: str) -> None: """Outputs message if debug mode is enabled.""" _LOGGER.debug(message) if self._debugmode: print("DEBUG: " + message) def _is_weird_api_url(self, api: str) -> bool: """Returns True if the API URL is not common. Common template is nas_base_url/webapi/path?params Only handles DSM 5 for now. """ return ( api in self.DSM_5_WEIRD_URL_API and self._information is not None and int(self._information.version) < 7321 # < DSM 6 ) def _build_url(self, api: str) -> URL: if self._is_weird_api_url(api) and api == SynoStorage.API_KEY: return self._base_url.join( URL("/webman/modules/StorageManager/storagehandler.cgi?") ) return self._base_url.join(URL(f"/webapi/{self.apis[api]['path']}?")) async def discover_apis(self) -> None: """Retreives available API infos from the NAS.""" if self._apis.get(API_AUTH): return data = await self.get(API_INFO, "query") if not isinstance(data, dict): return self._apis = data["data"] @property def apis(self) -> dict[str, ApiType]: """Gets available API infos from the NAS.""" return self._apis async def login(self, otp_code: str | None = None) -> bool: """Create a logged session.""" # First reset the session self._debuglog("Creating new session") params = { "account": self.username, "passwd": self._password, # "enable_syno_token": "yes", "enable_device_token": "yes", "device_name": socket.gethostname(), } if otp_code: params["otp_code"] = otp_code if self._device_token: params["device_id"] = self._device_token # Request login result = await self.get(API_AUTH, "login", params) if not isinstance(result, dict): return False # Handle errors if result.get("error"): switcher = { 400: SynologyDSMLoginInvalidException(self.username), 401: SynologyDSMLoginDisabledAccountException(self.username), 402: SynologyDSMLoginPermissionDeniedException(self.username), 403: SynologyDSMLogin2SARequiredException(self.username), 404: SynologyDSMLogin2SAFailedException(), 406: SynologyDSMLogin2SAForcedException(self.username), } raise switcher.get( result["error"]["code"], SynologyDSMLoginFailedException(result["error"]["code"], self.username), ) # Parse result if valid self._session_id = result["data"]["sid"] if result["data"].get("synotoken"): # Not available on API version < 3 self._syno_token = result["data"]["synotoken"] if result["data"].get("did"): # Not available on API version < 6 && device token is given once # per device_name self._device_token = result["data"]["did"] if result["data"].get("device_id"): # Not available on API version < 7 self._device_token = result["data"]["device_id"] self._debuglog("Authentication successful, token: " + str(self._session_id)) if not self._information: self._information = SynoDSMInformation(self) await self._information.update() return bool(result["success"]) async def logout(self) -> bool: """Log out of the session.""" result = await self.get(API_AUTH, "logout") if not isinstance(result, dict): return False return bool(result["success"]) @property def device_token(self) -> str | None: """Gets the device token. Used to remember the 2SA access was granted on this device. """ return self._device_token async def get( self, api: str, method: str, params: dict | None = None, **kwargs: Any ) -> bytes | dict | str: """Handles API GET request.""" return await self._request("GET", api, method, params, **kwargs) async def post( self, api: str, method: str, params: dict | None = None, **kwargs: Any ) -> bytes | dict | str: """Handles API POST request.""" return await self._request("POST", api, method, params, **kwargs) async def generate_url( self, api: str, method: str, params: dict | None = None, ) -> str: """Generate an url for external usage.""" url, params, _ = await self._prepare_request(api, method, params) return str(URL(url).update_query(params)) async def _prepare_request( self, api: str, method: str, params: dict | None = None, **kwargs: Any, ) -> tuple[URL, dict, dict]: """Prepare the url and parameters for a request.""" # Discover existing APIs if api != API_INFO: await self.discover_apis() # Check if logged if not self._session_id and api not in [API_AUTH, API_INFO]: raise SynologyDSMNotLoggedInException # Build request params if not params: params = {} params["api"] = api params["version"] = 1 if not self._is_weird_api_url(api): # Check if API is available if not self.apis.get(api): raise SynologyDSMAPINotExistsException(api) params["version"] = self.apis[api]["maxVersion"] max_version = kwargs.pop("max_version", None) if max_version and params["version"] > max_version: params["version"] = max_version params["method"] = method if api == SynoStorage.API_KEY: params["action"] = method if self._session_id: params["_sid"] = self._session_id if self._syno_token: params["SynoToken"] = self._syno_token url = self._build_url(api) return (url, params, kwargs) async def _request( self, request_method: str, api: str, method: str, params: dict | None = None, retry_once: bool = True, **kwargs: Any, ) -> bytes | dict | str: """Handles API request.""" url, params, kwargs = await self._prepare_request(api, method, params, **kwargs) # Request data self._debuglog("API: " + api) self._debuglog("Request Method: " + request_method) response = await self._execute_request(request_method, url, params, **kwargs) self._debuglog("Successful returned data") self._debuglog("RESPONSE: " + str(response)) # Handle data errors if isinstance(response, dict) and response.get("error") and api != API_AUTH: self._debuglog("Session error: " + str(response["error"]["code"])) if response["error"]["code"] == 119 and retry_once: # Session ID not valid # see https://github.com/aerialls/synology-srm/pull/3 self._session_id = None self._syno_token = None return await self._request(request_method, api, method, params, False) raise SynologyDSMAPIErrorException( api, response["error"]["code"], response["error"].get("errors") ) return response async def _execute_request( self, method: str, url: URL, params: dict | None, **kwargs: Any ) -> bytes | dict | str: """Function to execute and handle a request.""" if params: # special handling for spaces in parameters # because yarl.URL does encode a space as + instead of %20 # safe extracted from yarl.URL._QUERY_PART_QUOTER query = urlencode(params, safe="?/:@-._~!$'()*,", quote_via=quote) url_encoded = url.join(URL(f"?{query}", encoded=True)) else: url_encoded = url try: if method == "GET": response = await self._session.get( url_encoded, timeout=self._aiohttp_timeout, **kwargs ) elif method == "POST": data = {} if params is not None: data.update(params) data.update(kwargs.pop("data", {})) data["mimeType"] = "application/json" kwargs["data"] = data self._debuglog("POST data: " + str(data)) response = await self._session.post( url_encoded, timeout=self._aiohttp_timeout, **kwargs ) # mask sesitive parameters if _LOGGER.isEnabledFor(logging.DEBUG): response_url = response.url # pylint: disable=E0606 for param in SENSITIV_PARAMS: if params is not None and params.get(param): response_url = response_url.update_query({param: "*********"}) self._debuglog("Request url: " + str(response_url)) self._debuglog("Response status_code: " + str(response.status)) self._debuglog("Response headers: " + str(dict(response.headers))) if response.status == 200: # We got a DSM response content_type = response.headers.get("Content-Type", "").split(";")[0] if content_type in [ "application/json", "text/json", "text/plain", # Can happen with some API ]: return dict(await response.json(content_type=content_type)) if ( content_type == "application/octet-stream" or content_type.startswith("image") ): return await response.read() return await response.text() # We got a 400, 401 or 404 ... raise ClientError(response) except (ClientError, asyncio.TimeoutError, JSONDecodeError) as exp: raise SynologyDSMRequestException(exp) from exp async def update( self, with_information: bool = False, with_network: bool = False ) -> None: """Updates the various instanced modules.""" update_methods: list[Coroutine[Any, Any, None]] = [] if self._download: update_methods.append(self._download.update()) if self._external_usb: update_methods.append(self._external_usb.update()) if self._information and with_information: update_methods.append(self._information.update()) if self._network and with_network: update_methods.append(self._network.update()) if self._security: update_methods.append(self._security.update()) if self._utilisation: update_methods.append(self._utilisation.update()) if self._storage: update_methods.append(self._storage.update()) if self._share: update_methods.append(self._share.update()) if self._surveillance: update_methods.append(self._surveillance.update()) if self._system: update_methods.append(self._system.update()) if self._upgrade: update_methods.append(self._upgrade.update()) await asyncio.gather(*update_methods) def reset(self, api: SynoBaseApi | str) -> bool: """Reset an API to avoid fetching in on update.""" if isinstance(api, str): if api in ("information", SynoDSMInformation.API_KEY): return False if hasattr(self, "_" + api): setattr(self, "_" + api, None) return True if api == SynoCoreExternalUSB.API_KEY: self._external_usb = None return True if api == SynoCoreSecurity.API_KEY: self._security = None return True if api == SynoCoreShare.API_KEY: self._share = None return True if api == SynoCoreSystem.API_KEY: self._system = None return True if api == SynoCoreUpgrade.API_KEY: self._upgrade = None return True if api == SynoCoreUtilization.API_KEY: self._utilisation = None return True if api == SynoDownloadStation.API_KEY: self._download = None return True if api == SynoPhotos.API_KEY: self._photos = None return True if api == SynoStorage.API_KEY: self._storage = None return True if api == SynoSurveillanceStation.API_KEY: self._surveillance = None return True if isinstance(api, SynoCoreExternalUSB): self._external_usb = None return True if isinstance(api, SynoCoreSecurity): self._security = None return True if isinstance(api, SynoCoreShare): self._share = None return True if isinstance(api, SynoCoreSystem): self._system = None return True if isinstance(api, SynoCoreUpgrade): self._upgrade = None return True if isinstance(api, SynoCoreUtilization): self._utilisation = None return True if isinstance(api, SynoDownloadStation): self._download = None return True if isinstance(api, SynoPhotos): self._photos = None return True if isinstance(api, SynoStorage): self._storage = None return True if isinstance(api, SynoSurveillanceStation): self._surveillance = None return True return False @property def download_station(self) -> SynoDownloadStation: """Gets NAS DownloadStation.""" if not self._download: self._download = SynoDownloadStation(self) return self._download @property def external_usb(self) -> SynoCoreExternalUSB: """Gets NAS external USB storage information.""" if not self._external_usb: self._external_usb = SynoCoreExternalUSB(self) return self._external_usb @property def information(self) -> SynoDSMInformation: """Gets NAS informations.""" if not self._information: self._information = SynoDSMInformation(self) return self._information @property def network(self) -> SynoDSMNetwork: """Gets NAS network informations.""" if not self._network: self._network = SynoDSMNetwork(self) return self._network @property def photos(self) -> SynoPhotos: """Gets NAS photos.""" if not self._photos: self._photos = SynoPhotos(self) return self._photos @property def security(self) -> SynoCoreSecurity: """Gets NAS security informations.""" if not self._security: self._security = SynoCoreSecurity(self) return self._security @property def share(self) -> SynoCoreShare: """Gets NAS shares information.""" if not self._share: self._share = SynoCoreShare(self) return self._share @property def storage(self) -> SynoStorage: """Gets NAS storage informations.""" if not self._storage: self._storage = SynoStorage(self) return self._storage @property def surveillance_station(self) -> SynoSurveillanceStation: """Gets NAS SurveillanceStation.""" if not self._surveillance: self._surveillance = SynoSurveillanceStation(self) return self._surveillance @property def system(self) -> SynoCoreSystem: """Gets NAS system information.""" if not self._system: self._system = SynoCoreSystem(self) return self._system @property def upgrade(self) -> SynoCoreUpgrade: """Gets NAS upgrade informations.""" if not self._upgrade: self._upgrade = SynoCoreUpgrade(self) return self._upgrade @property def utilisation(self) -> SynoCoreUtilization: """Gets NAS utilisation informations.""" if not self._utilisation: self._utilisation = SynoCoreUtilization(self) return self._utilisation py-synologydsm-api-2.5.3/tests/000077500000000000000000000000001467623651400164655ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/__init__.py000066400000000000000000000276471467623651400206160ustar00rootroot00000000000000"""Library tests.""" from json import JSONDecodeError from urllib.parse import urlencode import aiohttp from synology_dsm import SynologyDSM from synology_dsm.api.core.external_usb import SynoCoreExternalUSB from synology_dsm.api.core.security import SynoCoreSecurity from synology_dsm.api.core.share import SynoCoreShare from synology_dsm.api.core.system import SynoCoreSystem from synology_dsm.api.core.upgrade import SynoCoreUpgrade from synology_dsm.api.core.utilization import SynoCoreUtilization from synology_dsm.api.download_station import SynoDownloadStation from synology_dsm.api.dsm.information import SynoDSMInformation from synology_dsm.api.dsm.network import SynoDSMNetwork from synology_dsm.api.photos import SynoPhotos from synology_dsm.api.storage.storage import SynoStorage from synology_dsm.api.surveillance_station import SynoSurveillanceStation from synology_dsm.const import API_AUTH, API_INFO from synology_dsm.exceptions import SynologyDSMRequestException from .api_data.dsm_5 import ( DSM_5_API_INFO, DSM_5_AUTH_LOGIN, DSM_5_AUTH_LOGIN_2SA, DSM_5_AUTH_LOGIN_2SA_OTP, DSM_5_CORE_UTILIZATION, DSM_5_DSM_INFORMATION, DSM_5_DSM_NETWORK, DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL, ) from .api_data.dsm_6 import ( DSM_6_API_INFO, DSM_6_API_INFO_SURVEILLANCE_STATION, DSM_6_AUTH_LOGIN, DSM_6_AUTH_LOGIN_2SA, DSM_6_AUTH_LOGIN_2SA_OTP, DSM_6_CORE_SECURITY, DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE, DSM_6_CORE_SHARE, DSM_6_CORE_SYSTEM_DS918_PLUS, DSM_6_CORE_UPGRADE_TRUE, DSM_6_CORE_UTILIZATION, DSM_6_CORE_UTILIZATION_ERROR_1055, DSM_6_DOWNLOAD_STATION_INFO_CONFIG, DSM_6_DOWNLOAD_STATION_INFO_INFO, DSM_6_DOWNLOAD_STATION_STAT_INFO, DSM_6_DOWNLOAD_STATION_TASK_LIST, DSM_6_DSM_INFORMATION, DSM_6_DSM_NETWORK_2LAN_1PPPOE, DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS, DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL, DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION, DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL, DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE, DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM, DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH, DSM_6_SURVEILLANCE_STATION_CAMERA_LIST, DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO, DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH, ) from .api_data.dsm_7 import ( DSM_7_API_INFO, DSM_7_AUTH_LOGIN, DSM_7_AUTH_LOGIN_2SA, DSM_7_AUTH_LOGIN_2SA_OTP, DSM_7_CORE_EXTERNAL_USB_DS1821_PLUS_EXTERNAL_USB, DSM_7_CORE_UPGRADE_TRUE, DSM_7_DSM_INFORMATION, DSM_7_FOTO_ALBUMS, DSM_7_FOTO_ITEMS, DSM_7_FOTO_ITEMS_SEARCHED, DSM_7_FOTO_ITEMS_SHARED_ALBUM, DSM_7_FOTO_SHARED_ITEMS, ) from .const import ( DEVICE_TOKEN, ERROR_AUTH_INVALID_CREDENTIALS, ERROR_AUTH_MAX_TRIES, ERROR_AUTH_OTP_AUTHENTICATE_FAILED, ERROR_INSUFFICIENT_USER_PRIVILEGE, ) API_SWITCHER = { 5: { "API_INFO": DSM_5_API_INFO, "AUTH_LOGIN": DSM_5_AUTH_LOGIN, "AUTH_LOGIN_2SA": DSM_5_AUTH_LOGIN_2SA, "AUTH_LOGIN_2SA_OTP": DSM_5_AUTH_LOGIN_2SA_OTP, "DSM_INFORMATION": DSM_5_DSM_INFORMATION, "DSM_NETWORK": DSM_5_DSM_NETWORK, "CORE_UTILIZATION": DSM_5_CORE_UTILIZATION, "STORAGE_STORAGE": { "RAID": DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL, }, }, 6: { "API_INFO": DSM_6_API_INFO, "AUTH_LOGIN": DSM_6_AUTH_LOGIN, "AUTH_LOGIN_2SA": DSM_6_AUTH_LOGIN_2SA, "AUTH_LOGIN_2SA_OTP": DSM_6_AUTH_LOGIN_2SA_OTP, "DSM_INFORMATION": DSM_6_DSM_INFORMATION, "DSM_NETWORK": DSM_6_DSM_NETWORK_2LAN_1PPPOE, "CORE_SECURITY": DSM_6_CORE_SECURITY, "CORE_SHARE": DSM_6_CORE_SHARE, "CORE_SYSTEM": DSM_6_CORE_SYSTEM_DS918_PLUS, "CORE_UTILIZATION": DSM_6_CORE_UTILIZATION, "CORE_UPGRADE": DSM_6_CORE_UPGRADE_TRUE, "STORAGE_STORAGE": { "RAID": DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL, "SHR1": DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS, "SHR2": DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL, "SHR2_EXPANSION": DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION, # noqa: B950 }, }, 7: { "API_INFO": DSM_7_API_INFO, "AUTH_LOGIN": DSM_7_AUTH_LOGIN, "AUTH_LOGIN_2SA": DSM_7_AUTH_LOGIN_2SA, "AUTH_LOGIN_2SA_OTP": DSM_7_AUTH_LOGIN_2SA_OTP, "CORE_UPGRADE": DSM_7_CORE_UPGRADE_TRUE, "DSM_INFORMATION": DSM_7_DSM_INFORMATION, "FOTO_ALBUMS": DSM_7_FOTO_ALBUMS, "FOTO_ITEMS": DSM_7_FOTO_ITEMS, }, } VALID_HOST = "nas.mywebsite.me" VALID_PORT = "5001" VALID_HTTPS = True VALID_VERIFY_SSL = True VALID_USER = "valid_user" VALID_USER_2SA = "valid_user_2sa" VALID_PASSWORD = "valid_password" # noqa: S105 VALID_OTP = "123456" USER_MAX_TRY = "user_max" class SynologyDSMMock(SynologyDSM): """Mocked SynologyDSM.""" API_URI = "api=" def __init__( self, session, dsm_ip, dsm_port, username, password, use_https=False, timeout=10, device_token=None, debugmode=False, ): """Constructor method.""" SynologyDSM.__init__( self, session, dsm_ip, dsm_port, username, password, use_https, timeout, device_token, debugmode, ) self.dsm_version = 6 # 5 or 6 self.disks_redundancy = "RAID" # RAID or SHR[number][_EXPANSION] self.error = False self.with_surveillance = False async def _execute_request(self, method, url, params, **kwargs): url = str(url) url += urlencode(params or {}) if "no_internet" in url: raise SynologyDSMRequestException( aiohttp.ClientError( ": Failed to establish a new connection: " "[Errno 8] nodename nor servname provided, or not known" ) ) if VALID_HOST not in url: raise SynologyDSMRequestException( aiohttp.ClientError( ":" " Failed to establish a new connection: [Errno 8] nodename " "nor servname provided, or not known" ) ) if VALID_PORT not in url and "https" not in url: raise SynologyDSMRequestException( JSONDecodeError("Expecting value", "document", 0) ) if VALID_PORT not in url: raise SynologyDSMRequestException( aiohttp.ClientError( "[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1076)" ) ) if "https" not in url: raise SynologyDSMRequestException(aiohttp.ClientError("Bad request")) if API_INFO in url: if self.with_surveillance: return DSM_6_API_INFO_SURVEILLANCE_STATION return API_SWITCHER[self.dsm_version]["API_INFO"] if API_AUTH in url: if VALID_USER_2SA in url and VALID_PASSWORD in url: if "otp_code" not in url and "device_id" not in url: return API_SWITCHER[self.dsm_version]["AUTH_LOGIN_2SA"] if "device_id" in url and DEVICE_TOKEN in url: return API_SWITCHER[self.dsm_version]["AUTH_LOGIN"] if "otp_code" in url: if VALID_OTP in url: return API_SWITCHER[self.dsm_version]["AUTH_LOGIN_2SA_OTP"] return ERROR_AUTH_OTP_AUTHENTICATE_FAILED if VALID_USER in url and VALID_PASSWORD in url: return API_SWITCHER[self.dsm_version]["AUTH_LOGIN"] if USER_MAX_TRY in url: return ERROR_AUTH_MAX_TRIES return ERROR_AUTH_INVALID_CREDENTIALS if self.API_URI in url: if not self._session_id: return ERROR_INSUFFICIENT_USER_PRIVILEGE if SynoCoreExternalUSB.API_KEY in url: return DSM_7_CORE_EXTERNAL_USB_DS1821_PLUS_EXTERNAL_USB if SynoCoreSecurity.API_KEY in url: if self.error: return DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE return API_SWITCHER[self.dsm_version]["CORE_SECURITY"] if SynoCoreShare.API_KEY in url: return API_SWITCHER[self.dsm_version]["CORE_SHARE"] if SynoCoreSystem.API_KEY in url: if SynoCoreUtilization.API_KEY in url: if self.error: return DSM_6_CORE_UTILIZATION_ERROR_1055 return API_SWITCHER[self.dsm_version]["CORE_UTILIZATION"] return API_SWITCHER[self.dsm_version]["CORE_SYSTEM"] if SynoCoreUpgrade.API_KEY in url: return API_SWITCHER[self.dsm_version]["CORE_UPGRADE"] if SynoDSMInformation.API_KEY in url: return API_SWITCHER[self.dsm_version]["DSM_INFORMATION"] if SynoDSMNetwork.API_KEY in url: return API_SWITCHER[self.dsm_version]["DSM_NETWORK"] if SynoDownloadStation.INFO_API_KEY in url: if "GetInfo" in url: return DSM_6_DOWNLOAD_STATION_INFO_INFO if "GetConfig" in url: return DSM_6_DOWNLOAD_STATION_INFO_CONFIG if SynoDownloadStation.STAT_API_KEY in url: if "GetInfo" in url: return DSM_6_DOWNLOAD_STATION_STAT_INFO if SynoDownloadStation.TASK_API_KEY in url: if "List" in url: return DSM_6_DOWNLOAD_STATION_TASK_LIST if SynoPhotos.BROWSE_ALBUMS_API_KEY in url: return DSM_7_FOTO_ALBUMS if SynoPhotos.BROWSE_ITEM_API_KEY in url: if "passphrase" in url: return DSM_7_FOTO_ITEMS_SHARED_ALBUM else: return DSM_7_FOTO_ITEMS if SynoPhotos.SEARCH_API_KEY in url: return DSM_7_FOTO_ITEMS_SEARCHED if SynoPhotos.BROWSE_ITEM_FOTOTEAM_API_KEY in url: return DSM_7_FOTO_SHARED_ITEMS if SynoStorage.API_KEY in url: return API_SWITCHER[self.dsm_version]["STORAGE_STORAGE"][ self.disks_redundancy ] if SynoSurveillanceStation.CAMERA_API_KEY in url: if "GetLiveViewPath" in url: return DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH if "List" in url: assert params["version"] == 7 return DSM_6_SURVEILLANCE_STATION_CAMERA_LIST if "MDParamSave" in url: return DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE if "MotionEnum" in url: return DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM if SynoSurveillanceStation.HOME_MODE_API_KEY in url: if "GetInfo" in url: return DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO if "Switch" in url: return DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH if ( "SYNO.FileStation.Upload" in url and "upload" in url and "file_already_exists" in kwargs["files"]["file"] ): return {"error": {"code": 1805}, "success": False} if ( "SYNO.DownloadStation2.Task" in url and "create" in url and "test_not_exists" in url ): return {"error": {"code": 408}, "success": False} return {"success": False} return None py-synologydsm-api-2.5.3/tests/api_data/000077500000000000000000000000001467623651400202275ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/__init__.py000066400000000000000000000000371467623651400223400ustar00rootroot00000000000000"""APIs raw data constants.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_5/000077500000000000000000000000001467623651400212365ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_5/__init__.py000066400000000000000000000013121467623651400233440ustar00rootroot00000000000000"""DSM 5 datas.""" from .const_5_api_auth import ( DSM_5_AUTH_LOGIN, DSM_5_AUTH_LOGIN_2SA, DSM_5_AUTH_LOGIN_2SA_OTP, ) from .const_5_api_info import DSM_5_API_INFO from .core.const_5_core_utilization import DSM_5_CORE_UTILIZATION from .dsm.const_5_dsm_info import DSM_5_DSM_INFORMATION from .dsm.const_5_dsm_network import DSM_5_DSM_NETWORK from .storage.const_5_storage_storage import ( DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL, ) __all__ = [ "DSM_5_AUTH_LOGIN", "DSM_5_AUTH_LOGIN_2SA", "DSM_5_AUTH_LOGIN_2SA_OTP", "DSM_5_API_INFO", "DSM_5_CORE_UTILIZATION", "DSM_5_DSM_INFORMATION", "DSM_5_DSM_NETWORK", "DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL", ] py-synologydsm-api-2.5.3/tests/api_data/dsm_5/const_5_api_auth.py000066400000000000000000000006631467623651400250410ustar00rootroot00000000000000"""DSM 5 SYNO.API.Auth data.""" from tests.const import DEVICE_TOKEN, ERROR_AUTH_OTP_NOT_SPECIFIED, SESSION_ID # No synotoken for an unknown reason DSM_5_AUTH_LOGIN = { "data": {"is_portal_port": False, "sid": SESSION_ID}, "success": True, } DSM_5_AUTH_LOGIN_2SA = ERROR_AUTH_OTP_NOT_SPECIFIED DSM_5_AUTH_LOGIN_2SA_OTP = { "data": {"did": DEVICE_TOKEN, "is_portal_port": False, "sid": SESSION_ID}, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_5/const_5_api_info.py000066400000000000000000002574311467623651400250420ustar00rootroot00000000000000"""DSM 5 SYNO.API.Info data.""" DSM_5_API_INFO = { "data": { "SYNO.ACEEditor": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.ACEEditor.Preference": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.API.Auth": {"maxVersion": 4, "minVersion": 1, "path": "auth.cgi"}, "SYNO.API.Encryption": { "maxVersion": 1, "minVersion": 1, "path": "encryption.cgi", }, "SYNO.API.Info": {"maxVersion": 1, "minVersion": 1, "path": "query.cgi"}, "SYNO.AudioPlayer.Stream": { "maxVersion": 1, "minVersion": 1, "path": "AudioPlayer/stream.cgi", }, "SYNO.Backup.App": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Backup": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Restore": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Backup": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Restore": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Log": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Repository": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Repository.Certificate": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Repository.PrivilegedUser": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Restore": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Server": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.NetworkBackup": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.TimeBackup": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.VersionBackup": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Share.Restore": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Source.Folder": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Connect.Network": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.S3.Bucket": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.S3.Region": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Share.Local": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Volume.Local": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target.File": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target.Folder": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target.Owner": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target.PrivilegedUser": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Task": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Task.Data": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Version": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.CloudSync": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ACL": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AHA": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AHA.Enclosure": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AHA.Log": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AHA.Monitor": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AHA.Network": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AHA.Node": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppNotify": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.Config": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.Image": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.Style": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.App": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.Rule": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Status": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Cache": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Info": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Policy": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.ServerInfo": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Token": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CRT": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CSR": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt.Account": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CurrentConnection": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.ExtIP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Provider": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Record": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Synology": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect.Application": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.BaseDN": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Profile": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.utils": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Device": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Settings": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.DefaultPermission": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.BonjourSharing": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Driver": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network.Host": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.OAuth": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.USB": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.EUnit": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.SD": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.Setting": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.USB": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.eSATA": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.UPS": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.EzInternet": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.AFP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP": { "maxVersion": 3, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.ChrootUser": { "maxVersion": 2, "minVersion": 2, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.SFTP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.Security": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.AdvancedSetting": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.IDMap": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.Kerberos": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.SharePrivilege": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.SMB": { "maxVersion": 3, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.WebDAV": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.WebDAV.CalDAV": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.WebDAV.CalDAV.Calendar": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.Member": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.BeepControl": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.DCOutput": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.DCOutput.Task": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.FanSpeed": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Hibernation": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.LCM": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Led.Brightness": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.MemoryLayout": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerRecovery": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerSchedule": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.ZRAM": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.IndexFolder": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.MediaConverter": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Account": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Unify": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bond": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bridge": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.ClientList": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.PXE": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.Reservation": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.WPAD": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Ethernet": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router.Prefix": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6Tunnel": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Interface": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.LocalBridge": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.MACClone": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE.Relay": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.ConnectionList": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.CountryCode": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.DMZ": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Gateway.List": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.LocalLan": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.MacFilter": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.ParentalControl": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.PkgList": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.PortForward": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Static.Route": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Topology": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.RouterRules": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.Rules": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.UPnPServer": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.USBModem": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.L2TP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN.CA": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.PPTP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.WOL": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.Client": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.Hotspot": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.WPS": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.CustomizedData": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.FilterSettings": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.Variables": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.WarningPercentage": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Auth": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.AuthToken": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mail": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Provider": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.EnforcePolicy": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Control": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Server": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Term": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Uninstallation": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Compatibility": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterConf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterInfo": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterList": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Permission": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Upnp": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Quota": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin.User": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.Language": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.Server": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Analyzer": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Config": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.History": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SNMP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock.Rules": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Embed": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DoS": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.VPNPassthrough": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.VPNPassthrough.Status": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Operation": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Status": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.Conf": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.PortInfo": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto.Key": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.CryptoFile": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Fileindex": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration.Task": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Permission": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Snapshot": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Disk": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Pool": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Volume": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSILUN": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSITargets": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Form": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Log": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Service": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.CA": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.CustRule": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.FileTransfer": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.History": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Log": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.PersonalActivity": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Setting.Notify": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Setting.Server": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Setting.Storage": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Status": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ResetButton": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Utilization": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TFTP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TaskScheduler": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Terminal": { "maxVersion": 3, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Image": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Login": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.AutoUpgrade": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Download": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall.Network": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Patch": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server.Download": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Setting": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Home": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordPolicy": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UserSettings": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM.External": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.HTTP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.HTTP.Dependency": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.HTTP.VHost": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.PHP": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.PHP.Extension": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Application": { "maxVersion": 1, "minVersion": 1, "path": "dsm/app.cgi", }, "SYNO.DSM.AutoBlock": { "maxVersion": 1, "minVersion": 1, "path": "dsm/autoblock.cgi", }, "SYNO.DSM.Connection": { "maxVersion": 1, "minVersion": 1, "path": "dsm/connection.cgi", }, "SYNO.DSM.FindMe": {"maxVersion": 1, "minVersion": 1, "path": "dsm/findme.cgi"}, "SYNO.DSM.Group": {"maxVersion": 1, "minVersion": 1, "path": "dsm/group.cgi"}, "SYNO.DSM.Info": {"maxVersion": 1, "minVersion": 1, "path": "dsm/info.cgi"}, "SYNO.DSM.LogViewer": { "maxVersion": 1, "minVersion": 1, "path": "dsm/logviewer.cgi", }, "SYNO.DSM.Network": { "maxVersion": 1, "minVersion": 1, "path": "dsm/network.cgi", }, "SYNO.DSM.Package": { "maxVersion": 1, "minVersion": 1, "path": "dsm/package.cgi", }, "SYNO.DSM.PushNotification": { "maxVersion": 1, "minVersion": 1, "path": "dsm/notification.cgi", }, "SYNO.DSM.Service": { "maxVersion": 1, "minVersion": 1, "path": "dsm/service.cgi", }, "SYNO.DSM.System": {"maxVersion": 1, "minVersion": 1, "path": "dsm/system.cgi"}, "SYNO.DSM.SystemLoading": { "maxVersion": 1, "minVersion": 1, "path": "dsm/system_loading.cgi", }, "SYNO.DSM.User": {"maxVersion": 1, "minVersion": 1, "path": "dsm/user.cgi"}, "SYNO.DSM.Volume": {"maxVersion": 1, "minVersion": 1, "path": "dsm/volume.cgi"}, "SYNO.DSM.iSCSI": {"maxVersion": 1, "minVersion": 1, "path": "dsm/iscsi.cgi"}, "SYNO.DisasterRecovery.Log": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Retention": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation.BTSearch": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/btsearch.cgi", }, "SYNO.DownloadStation.Info": { "maxVersion": 2, "minVersion": 1, "path": "DownloadStation/info.cgi", }, "SYNO.DownloadStation.RSS.Feed": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/RSSfeed.cgi", }, "SYNO.DownloadStation.RSS.Site": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/RSSsite.cgi", }, "SYNO.DownloadStation.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/schedule.cgi", }, "SYNO.DownloadStation.Statistic": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/statistic.cgi", }, "SYNO.DownloadStation.Task": { "maxVersion": 3, "minVersion": 1, "path": "DownloadStation/task.cgi", }, "SYNO.DownloadStation.Xunlei.Task": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/xunlei/dl_queue.cgi", }, "SYNO.DownloadStation2.Task": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT.File": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT.Peer": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT.Tracker": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.List": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request.Polling": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.BackgroundTask": { "maxVersion": 2, "minVersion": 1, "path": "FileStation/background_task.cgi", }, "SYNO.FileStation.CheckExist": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_checkDir.cgi", }, "SYNO.FileStation.CheckPermission": { "maxVersion": 2, "minVersion": 1, "path": "FileStation/file_permission.cgi", }, "SYNO.FileStation.Compress": { "maxVersion": 2, "minVersion": 1, "path": "FileStation/file_compress.cgi", }, "SYNO.FileStation.CopyMove": { "maxVersion": 2, "minVersion": 1, "path": "FileStation/file_MVCP.cgi", }, "SYNO.FileStation.CreateFolder": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_crtfdr.cgi", }, "SYNO.FileStation.Delete": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_delete.cgi", }, "SYNO.FileStation.DirSize": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_dirSize.cgi", }, "SYNO.FileStation.Download": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_download.cgi", }, "SYNO.FileStation.Extract": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_extract.cgi", }, "SYNO.FileStation.Favorite": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_favorite.cgi", }, "SYNO.FileStation.Info": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/info.cgi", }, "SYNO.FileStation.List": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_share.cgi", }, "SYNO.FileStation.MD5": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_md5.cgi", }, "SYNO.FileStation.OpenGoogleDrive": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_opengdrive.cgi", }, "SYNO.FileStation.Rename": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_rename.cgi", }, "SYNO.FileStation.Search": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_find.cgi", }, "SYNO.FileStation.Sharing": { "maxVersion": 2, "minVersion": 1, "path": "FileStation/file_sharing.cgi", }, "SYNO.FileStation.Snapshot": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_snapshot.cgi", }, "SYNO.FileStation.Thumb": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_thumb.cgi", }, "SYNO.FileStation.Upload": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/api_upload.cgi", }, "SYNO.FileStation.VFS.Connection": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.GDrive": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Profile": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.User": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VirtualFolder": { "maxVersion": 1, "minVersion": 1, "path": "FileStation/file_virtual.cgi", }, "SYNO.FolderSharing.Download": { "maxVersion": 1, "minVersion": 1, "path": "FolderSharing/file_download.cgi", }, "SYNO.FolderSharing.List": { "maxVersion": 1, "minVersion": 1, "path": "FolderSharing/file_share.cgi", }, "SYNO.FolderSharing.Thumb": { "maxVersion": 1, "minVersion": 1, "path": "FolderSharing/file_thumb.cgi", }, "SYNO.NoteStation.Export.Note": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Export.Notebook": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.FTS": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Import.Evernote": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Import.Notebook": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Info": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Note": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Note.AppLink": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Note.Encrypt": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Note.Ghost": { "maxVersion": 2, "minVersion": 2, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Note.Polling": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Note.Version": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Notebook": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Notebook.Polling": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Notebook.Preset": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Permission": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Permission.Public": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Permission.User": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Setting": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Setting.DSM": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Shard": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Shard.Link": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Share.Priv": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Shortcut": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Stack": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Tag": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.NoteStation.Todo": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.Package": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Contacts": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Mail": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Setting": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client.Job": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server.Pair": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.SocialAccount": { "maxVersion": 2, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.SocialAccount.Friend": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, "SYNO.SocialAccount.Token": { "maxVersion": 1, "minVersion": 1, "path": "_______________________________________________________entry.cgi", "requestFormat": "JSON", }, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_5/core/000077500000000000000000000000001467623651400221665ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_5/core/__init__.py000066400000000000000000000000371467623651400242770ustar00rootroot00000000000000"""DSM 5 SYNO.Core.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_5/core/const_5_core_utilization.py000066400000000000000000000071731467623651400275650ustar00rootroot00000000000000"""DSM 5 SYNO.Core.System.Utilization data.""" DSM_5_CORE_UTILIZATION = { "data": { "cpu": { "15min_load": 53, "1min_load": 57, "5min_load": 56, "device": "System", "other_load": 63, "system_load": 10, "user_load": 27, }, "disk": { "disk": [ { "device": "sda", "display_name": "Disk 1", "read_access": 21, "read_byte": 645529, "type": "internal", "utilization": 46, "write_access": 4, "write_byte": 86220, }, { "device": "sdb", "display_name": "Disk 2", "read_access": 23, "read_byte": 711338, "type": "internal", "utilization": 33, "write_access": 4, "write_byte": 95641, }, { "device": "sdc", "display_name": "Disk 3", "read_access": 21, "read_byte": 786841, "type": "internal", "utilization": 31, "write_access": 5, "write_byte": 99874, }, { "device": "sdd", "display_name": "Disk 4", "read_access": 21, "read_byte": 729907, "type": "internal", "utilization": 32, "write_access": 4, "write_byte": 76663, }, { "device": "sdq", "display_name": "USB Disk 1", "read_access": 0, "read_byte": 0, "type": "usb", "utilization": 0, "write_access": 0, "write_byte": 0, }, ], "total": { "device": "total", "read_access": 86, "read_byte": 2873615, "utilization": 28, "write_access": 17, "write_byte": 358398, }, }, "memory": { "avail_real": 8188, "avail_swap": 1933436, "buffer": 3700, "cached": 25636, "device": "Memory", "memory_size": 131072, "real_usage": 68, "si_disk": 5, "so_disk": 3, "swap_usage": 7, "total_real": 118464, "total_swap": 2097080, }, "network": [ {"device": "total", "rx": 1680, "tx": 553}, {"device": "eth0", "rx": 1680, "tx": 553}, ], "space": { "lun": [], "total": { "device": "total", "read_access": 261, "read_byte": 1069875, "utilization": 100, "write_access": 51, "write_byte": 208896, }, "volume": [ { "device": "md2", "display_name": "volume1", "read_access": 261, "read_byte": 1069875, "utilization": 100, "write_access": 51, "write_byte": 208896, } ], }, "time": 1586592505, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_5/dsm/000077500000000000000000000000001467623651400220215ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_5/dsm/__init__.py000066400000000000000000000000361467623651400241310ustar00rootroot00000000000000"""DSM 5 SYNO.DSM.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_5/dsm/const_5_dsm_info.py000066400000000000000000000015151467623651400256250ustar00rootroot00000000000000"""DSM 5 SYNO.DSM.Info data.""" DSM_5_DSM_INFORMATION_DS410J = { "data": { "codepage": "enu", "model": "DS410j", "ram": 128, "serial": "A3G7N00628", "temperature": 52, "temperature_warn": False, "time": "Mon Apr 13 18:26:27 2020", "uptime": 7077254, "version": "5967", "version_string": "DSM 5.2-5967 Update 9", }, "success": True, } DSM_5_DSM_INFORMATION_DS3615XS = { "data": { "codepage": "rus", "model": "DS3615xs", "ram": 6144, "serial": "B3J4N01003", "temperature": 40, "time": "Sat Apr 25 20:21:57 2020", "uptime": 3897, "version": "5967", "version_string": "DSM 5.2-5967 Update 9", }, "success": True, } DSM_5_DSM_INFORMATION = DSM_5_DSM_INFORMATION_DS3615XS py-synologydsm-api-2.5.3/tests/api_data/dsm_5/dsm/const_5_dsm_network.py000066400000000000000000000007431467623651400263650ustar00rootroot00000000000000"""DSM 5 SYNO.DSM.Network data.""" DSM_5_DSM_NETWORK = { "data": { "dns": ["192.168.1.1"], "gateway": "192.168.1.1", "hostname": "HOME-NAS", "interfaces": [ { "id": "eth0", "ip": [{"address": "192.168.1.10", "netmask": "255.255.255.0"}], "mac": "XX-XX-XX-XX-XX-XX", "type": "lan", } ], "workgroup": "WORKGROUP", }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_5/storage/000077500000000000000000000000001467623651400227025ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_5/storage/__init__.py000066400000000000000000000000421467623651400250070ustar00rootroot00000000000000"""DSM 5 SYNO.Storage.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_5/storage/const_5_storage_storage.py000066400000000000000000000217301467623651400301010ustar00rootroot00000000000000"""DSM 5 SYNO.Storage.CGI.Storage data.""" from tests.const import UNIQUE_KEY DSM_5_STORAGE_STORAGE_DS410J_RAID5_4DISKS_1VOL = { "disks": [ {"id": "test_disk"}, { "container": { "order": 0, "str": "DS410j", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdd", "disable_secera": False, "diskType": "SATA", "erase_time": 374, "firm": "SC60", "has_system": True, "id": "sdd", "is4Kn": False, "isSsd": False, "is_erasing": False, "longName": "Disk 4", "model": "ST3000VN007-2E4166 ", "name": "Disk 4", "num_id": 4, "order": 4, "portType": "normal", "serial": "Z73095S2", "size_total": "3000592982016", "smart_status": "safe", "status": "normal", "support": False, "temp": 42, "used_by": "volume_1", "vendor": "Seagate", }, { "container": { "order": 0, "str": "DS410j", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdc", "disable_secera": False, "diskType": "SATA", "erase_time": 410, "firm": "80.00A80", "has_system": True, "id": "sdc", "is4Kn": False, "isSsd": False, "is_erasing": False, "longName": "Disk 3", "model": "WD30EZRZ-00Z5HB0 ", "name": "Disk 3", "num_id": 3, "order": 3, "portType": "normal", "serial": "WD-WCC4N0TEJ4F0", "size_total": "3000592982016", "smart_status": "safe", "status": "normal", "support": False, "temp": 42, "used_by": "volume_1", "vendor": "WDC ", }, { "container": { "order": 0, "str": "DS410j", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdb", "disable_secera": False, "diskType": "SATA", "erase_time": 408, "firm": "82.00A82", "has_system": True, "id": "sdb", "is4Kn": False, "isSsd": False, "is_erasing": False, "longName": "Disk 2", "model": "WD30EFRX-68EUZN0 ", "name": "Disk 2", "num_id": 2, "order": 2, "portType": "normal", "serial": "WD-WCC4N6LSVCVX", "size_total": "3000592982016", "smart_status": "safe", "status": "normal", "support": False, "temp": 43, "used_by": "volume_1", "vendor": "WDC ", }, { "container": { "order": 0, "str": "DS410j", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sda", "disable_secera": False, "diskType": "SATA", "erase_time": 0, "firm": "82.00A82", "has_system": True, "id": "sda", "is4Kn": False, "isSsd": False, "is_erasing": False, "longName": "Disk 1", "model": "WD30EFRX-68N32N0 ", "name": "Disk 1", "num_id": 1, "order": 1, "portType": "normal", "serial": "WD-WCC7K5YA5H40", "size_total": "3000592982016", "smart_status": "90%", "status": "normal", "support": False, "temp": 44, "used_by": "volume_1", "vendor": "WDC ", }, ], "env": { "batchtask": {"max_task": 64, "remain_task": 64}, "bay_number": "4", "ebox": [], "fs_acting": False, "is_space_actioning": False, "isns": {"address": "", "enabled": False}, "isns_server": "", "max_fs_bytes": "17592181850112", "max_fs_bytes_high_end": "219902325555200", "model_name": "DS410j", "ram_enough_for_fs_high_end": False, "ram_size": 0, "ram_size_required": 32, "settingSwap": False, "showpooltab": False, "status": {"system_crashed": False, "system_need_repair": False}, "support": {"ebox": False, "raid_cross": False, "sysdef": True}, "unique_key": UNIQUE_KEY, }, "hotSpares": [], "iscsiLuns": [ { "can_do": { "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "migrate": {"to_raid5+spare": "1-1", "to_raid6": 1}, }, "id": "iscsilun_LUN-1", "is_actioning": False, "iscsi_lun": { "blkNum": "19614744", "device_type": "file", "lid": 1, "location": "volume_1", "mapped_targets": [1], "name": "LUN-1", "restored_time": "0", "rootpath": "/volume1", "size": "10737418240", "thin_provision": False, "uuid": "fcf3a450-681c-06cb-fbb9-0400bdbe0780", "vaai_extent_size": "0", "vaai_support": False, }, "num_id": 1, "progress": {"percent": "-1", "step": "none"}, "status": "normal", } ], "iscsiTargets": [ { "auth": {"mutual_username": "", "type": "none", "username": ""}, "data_chksum": 0, "enabled": True, "hdr_chksum": 0, "iqn": "iqn.2000-01.com.synology:DiskStation.name", "mapped_logical_unit_number": [0], "mapped_luns": [1], "masking": [ {"iqn": "iqn.2000-01.com.synology:default.acl", "permission": "rw"} ], "multi_sessions": False, "name": "Target-1", "num_id": 1, "recv_seg_bytes": 262144, "remote": [], "send_seg_bytes": 4096, "status": "online", "tid": 1, } ], "ports": [], "storagePools": [], "success": True, "volumes": [ {"id": "test_volume"}, { "can_do": { "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "migrate": {"to_raid5+spare": "1-1", "to_raid6": 1}, }, "container": "internal", "device_type": "raid_5", "disk_failure_number": 0, "disks": ["sda", "sdb", "sdc", "sdd"], "eppool_used": "10042748928", "fs_type": "ext3", "id": "volume_1", "is_acting": False, "is_actioning": False, "is_inode_full": False, "is_writable": True, "max_fs_size": "17592181850112", "maximal_disk_size": "0", "minimal_disk_size": "2995767869440", "num_id": 1, "pool_path": "", "progress": {"percent": "-1", "step": "none"}, "size": { "free_inode": "547237217", "total": "8846249701376", "total_device": "8987275100160", "total_inode": "548544512", "used": "5719795761152", }, "space_path": "/dev/md2", "spares": [], "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [], "timebackup": True, "used_by_gluster": False, "vol_path": "/volume1", "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": False, "errCode": 53504, "stopService": False, }, "remove": { "can_do": False, "errCode": 53504, "stopService": False, }, "resize": { "can_do": False, "errCode": 53504, "stopService": False, }, }, "snapshot": { "resize": {"can_do": True, "errCode": 0, "stopService": False} }, }, }, ], } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/000077500000000000000000000000001467623651400212375ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/__init__.py000066400000000000000000000063031467623651400233520ustar00rootroot00000000000000"""DSM 6 datas.""" from .const_6_api_auth import ( DSM_6_AUTH_LOGIN, DSM_6_AUTH_LOGIN_2SA, DSM_6_AUTH_LOGIN_2SA_OTP, ) from .const_6_api_info import DSM_6_API_INFO from .core.const_6_core_security import ( DSM_6_CORE_SECURITY, DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE, ) from .core.const_6_core_share import DSM_6_CORE_SHARE from .core.const_6_core_system import ( DSM_6_CORE_SYSTEM_DS218_PLAY, DSM_6_CORE_SYSTEM_DS918_PLUS, ) from .core.const_6_core_upgrade import DSM_6_CORE_UPGRADE_FALSE, DSM_6_CORE_UPGRADE_TRUE from .core.const_6_core_utilization import ( DSM_6_CORE_UTILIZATION, DSM_6_CORE_UTILIZATION_ERROR_1055, ) from .download_station.const_6_download_station_info import ( DSM_6_DOWNLOAD_STATION_INFO_CONFIG, DSM_6_DOWNLOAD_STATION_INFO_INFO, ) from .download_station.const_6_download_station_stat import ( DSM_6_DOWNLOAD_STATION_STAT_INFO, ) from .download_station.const_6_download_station_task import ( DSM_6_DOWNLOAD_STATION_TASK_LIST, ) from .dsm.const_6_dsm_info import DSM_6_DSM_INFORMATION from .dsm.const_6_dsm_network import DSM_6_DSM_NETWORK_2LAN_1PPPOE from .storage.const_6_storage_storage import ( DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS, DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL, DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION, DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL, ) from .surveillance_station.const_6_api_info import ( DSM_6_API_INFO as DSM_6_API_INFO_SURVEILLANCE_STATION, ) from .surveillance_station.const_6_surveillance_station_camera import ( DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE, DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM, DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH, DSM_6_SURVEILLANCE_STATION_CAMERA_LIST, ) from .surveillance_station.const_6_surveillance_station_home_mode import ( DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO, DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH, ) __all__ = [ "DSM_6_AUTH_LOGIN", "DSM_6_AUTH_LOGIN_2SA", "DSM_6_AUTH_LOGIN_2SA_OTP", "DSM_6_API_INFO", "DSM_6_CORE_SECURITY", "DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE", "DSM_6_CORE_SHARE", "DSM_6_CORE_SYSTEM_DS218_PLAY", "DSM_6_CORE_SYSTEM_DS918_PLUS", "DSM_6_CORE_UPGRADE_FALSE", "DSM_6_CORE_UPGRADE_TRUE", "DSM_6_CORE_UTILIZATION", "DSM_6_CORE_UTILIZATION_ERROR_1055", "DSM_6_DOWNLOAD_STATION_INFO_CONFIG", "DSM_6_DOWNLOAD_STATION_INFO_INFO", "DSM_6_DOWNLOAD_STATION_STAT_INFO", "DSM_6_DOWNLOAD_STATION_TASK_LIST", "DSM_6_DSM_INFORMATION", "DSM_6_DSM_NETWORK_2LAN_1PPPOE", "DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION", "DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL", "DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS", "DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL", "DSM_6_API_INFO_SURVEILLANCE_STATION", "DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE", "DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM", "DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH", "DSM_6_SURVEILLANCE_STATION_CAMERA_LIST", "DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO", "DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH", ] py-synologydsm-api-2.5.3/tests/api_data/dsm_6/const_6_api_auth.py000066400000000000000000000010571467623651400250410ustar00rootroot00000000000000"""DSM 6 SYNO.API.Auth data.""" from tests.const import ( DEVICE_TOKEN, ERROR_AUTH_OTP_NOT_SPECIFIED, SESSION_ID, SYNO_TOKEN, ) DSM_6_AUTH_LOGIN = { "data": {"is_portal_port": False, "sid": SESSION_ID, "synotoken": SYNO_TOKEN}, "success": True, } DSM_6_AUTH_LOGIN_2SA = ERROR_AUTH_OTP_NOT_SPECIFIED DSM_6_AUTH_LOGIN_2SA_OTP = { "data": { "did": DEVICE_TOKEN, "is_portal_port": False, "sid": SESSION_ID, "synotoken": SYNO_TOKEN, }, "success": True, } DSM_6_AUTH_LOGOUT = {"success": True} py-synologydsm-api-2.5.3/tests/api_data/dsm_6/const_6_api_info.py000066400000000000000000003002111467623651400250250ustar00rootroot00000000000000"""DSM 6 SYNO.API.Info data.""" DSM_6_API_INFO = { "data": { "SYNO.API.Auth": {"maxVersion": 6, "minVersion": 1, "path": "auth.cgi"}, "SYNO.API.Encryption": { "maxVersion": 1, "minVersion": 1, "path": "encryption.cgi", }, "SYNO.API.Info": {"maxVersion": 1, "minVersion": 1, "path": "query.cgi"}, "SYNO.API.OTP": {"maxVersion": 1, "minVersion": 1, "path": "otp.cgi"}, "SYNO.AudioPlayer": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioPlayer.Stream": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Backup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Restore": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Backup": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Restore": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.NetworkBackup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.TimeBackup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ACL": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.AccessControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.ReverseProxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.App": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.Rule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Cache": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Policy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.ServerInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CRT": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CSR": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CurrentConnection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.ExtIP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Provider": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Record": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Synology": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.TWNIC": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DSMNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect.Application": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Defs": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Initdata": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.JSUIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.SessionData": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.UIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Azure.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.ADHealthCheck": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.BaseDN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Login.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.utils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.WebSphere.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.EventScheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.DefaultPermission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.BonjourSharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Driver": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network.Host": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.OAuth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.EUnit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.eSATA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.UPS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.EzInternet": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Factory.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Factory.Manutild": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.AFP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.ChrootUser": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.SFTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.Security": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.AdvancedSetting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.IDMap": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.Kerberos": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.SharePrivilege": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ReflinkCopy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.Rsync.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.SMB": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ServiceDiscovery": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ServiceDiscovery.WSTransfer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Findhost": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.ExtraAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.Member": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.ValidLocalAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.GroupSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.BeepControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.DCOutput": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.DCOutput.Task": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.FanSpeed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Hibernation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.LCM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Led.Brightness": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.MemoryLayout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.NeedReboot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerRecovery": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerSchedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.SpectreMeltdown": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.VideoTranscoding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.ZRAM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Help": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.LUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Lunbkp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Replication": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Target": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.VLUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.IndexFolder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.MediaConverter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.MobileEnabled": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.ThumbnailQuality": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Authentication": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Authentication.Cert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bond": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bridge": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.ClientList": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.PXE": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.Reservation": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.Vendor": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.WPAD": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Ethernet": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router.Prefix": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6Tunnel": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Interface": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.LocalBridge": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.MACClone": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.OVS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE.Relay": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.ConnectionList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.CountryCode": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.DMZ": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Gateway.List": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.LocalLan": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.MacFilter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.ParentalControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.PkgList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.PortForward": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Static.Route": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Topology": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.RouterRules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.UPnPServer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.USBModem": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.L2TP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN.CA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPNWithConf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPNWithConf.Certs": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.PPTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.WOL": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.Hotspot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.WPS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.NormalUser": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.NormalUser.LoginNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.CustomizedData": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.FilterSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.Variables": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.WarningPercentage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Auth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.AuthToken": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Provider": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OAuth.Scope": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OAuth.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Admin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.EnforcePolicy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Control": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.FakeIFrame": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Feed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Feed.Keyring": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.MyDS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.MyDS.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Screenshot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Screenshot.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Server": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting.Update": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Thumb": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Uninstallation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Event": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Filter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.android": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.iOS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.windows": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PhotoViewer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Polling.Data": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Compatibility": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterConf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.UserDataCollector": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Upnp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickStart.Info": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickStart.Install": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Quota": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.Language": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.DateTimeFormat": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Analyzer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Analyzer.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Analyzer.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.History": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Redirect": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Report.Util": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SNMP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Embed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DoS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Adapter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Geoip": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Profile.Apply": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.VPNPassthrough": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.VPNPassthrough.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Operation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.PortInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto.Key": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.CryptoFile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.AutoKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.Key": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.MachineKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.Store": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration.Task": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Snapshot": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Initdata": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Session": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Trusted": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Untrusted": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Disk": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Pool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSILUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSITargets": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSIUtils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Form": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Synohdpack": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.FileTransfer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.PersonalActivity": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Setting.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Process": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ProcessGroup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ResetButton": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Utilization": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TFTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TaskScheduler": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Terminal": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.AppPortalLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Desktop": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.FileSharingLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TrustDevice": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Tuned": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UISearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.AutoUpgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Patch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.PreCheck": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Setting": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Home": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordConfirm": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordExpiry": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordMeter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordPolicy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UserSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Virtualization.Host.Capability": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM.External": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.Security.HTTPCompression": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.Security.TLSProfile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node.Credential": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node.Session": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.FindMe": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Info": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Network": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.PortEnable": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.PushNotification": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Retention": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Container": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Container.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Container.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Container.Resource": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM.Network.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM.Restore": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.DDSM.Update": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.License": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Docker.Registry": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation.BTSearch": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/btsearch.cgi", }, "SYNO.DownloadStation.Info": { "maxVersion": 2, "minVersion": 1, "path": "DownloadStation/info.cgi", }, "SYNO.DownloadStation.RSS.Feed": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/RSSfeed.cgi", }, "SYNO.DownloadStation.RSS.Site": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/RSSsite.cgi", }, "SYNO.DownloadStation.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/schedule.cgi", }, "SYNO.DownloadStation.Statistic": { "maxVersion": 1, "minVersion": 1, "path": "DownloadStation/statistic.cgi", }, "SYNO.DownloadStation.Task": { "maxVersion": 3, "minVersion": 1, "path": "DownloadStation/task.cgi", }, "SYNO.DownloadStation2.BTSearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Captcha": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Package.Info": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Package.Module": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Package.Service": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.RSS.Feed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.RSS.Filter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.RSS.Item": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.BT": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.BTSearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Emule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Emule.Location": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.FileHosting": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.FtpHttp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Global": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Location": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Nzb": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Rss": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Settings.Scheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT.File": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT.Peer": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.BT.Tracker": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.List.Polling": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.NZB.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.NZB.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.Source": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.Statistic": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Task.eMule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.Thumbnail": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.eMule.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DownloadStation2.eMule.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request.Polling": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.BackgroundTask": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CheckExist": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CheckPermission": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Compress": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CopyMove": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CreateFolder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Delete": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.DirSize": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.External.GoogleDrive": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Extract": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Favorite": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.FormUpload": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Info": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.MD5": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Mount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Mount.List": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.ACLOwner": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.CompressSize": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.Mtime": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Rename": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Search": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Search.History": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Sharing": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Sharing.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Snapshot": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Thumb": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.UIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Upload": { "maxVersion": 3, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.UserGrp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Connection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.GDrive": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VirtualFolder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.AppIndexing.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Bookmark": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.SearchHistory": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.Spotlight": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File.Cover": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Folder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Highlight": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Indicate": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Preference": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.UserGrp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.Thumb": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.License.HA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.LogCenter.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.LogCenter.Client.CA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.LogCenter.History": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.LogCenter.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.LogCenter.RecvRule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.LogCenter.Setting.Storage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Common": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Package": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Contacts": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.EventRule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client.Job": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server.Pair": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Checklist": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Checklist.Alert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Location": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.LoginActivity": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Report": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Report.HTML": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Snap.Usage.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Check": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.DualEnclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Enclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Flashcache": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.HddMan": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Pool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Smart": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Smart.Scheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Spare": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Spare.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Storage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Utils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.VideoPlayer.Subtitle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.VideoPlayer.SynologyDrive.Subtitle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/000077500000000000000000000000001467623651400221675ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/__init__.py000066400000000000000000000000371467623651400243000ustar00rootroot00000000000000"""DSM 6 SYNO.Core.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/const_6_core_security.py000066400000000000000000000136671467623651400270700ustar00rootroot00000000000000"""DSM 6 SYNO.Core.SecurityScan.Status data.""" DSM_6_CORE_SECURITY = { "data": { "items": { "malware": { "category": "malware", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 3, "waitNum": 0, }, "network": { "category": "network", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 4, "waitNum": 0, }, "securitySetting": { "category": "securitySetting", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 0, "waitNum": 0, }, "systemCheck": { "category": "systemCheck", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 6, "waitNum": 0, }, "update": { "category": "update", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 4, "waitNum": 0, }, "userInfo": { "category": "userInfo", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 6, "waitNum": 0, }, }, "lastScanTime": "1588298442", "startTime": "", "success": True, "sysProgress": 100, "sysStatus": "safe", }, "success": True, } DSM_6_CORE_SECURITY_UPDATE_OUTOFDATE = { "data": { "items": { "malware": { "category": "malware", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 3, "waitNum": 0, }, "network": { "category": "network", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 4, "waitNum": 0, }, "securitySetting": { "category": "securitySetting", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 0, "waitNum": 0, }, "systemCheck": { "category": "systemCheck", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 6, "waitNum": 0, }, "update": { "category": "update", "fail": { "danger": 0, "info": 0, "outOfDate": 1, "risk": 0, "warning": 0, }, "failSeverity": "outOfDate", "progress": 100, "runningItem": "", "total": 4, "waitNum": 0, }, "userInfo": { "category": "userInfo", "fail": { "danger": 0, "info": 0, "outOfDate": 0, "risk": 0, "warning": 0, }, "failSeverity": "safe", "progress": 100, "runningItem": "", "total": 6, "waitNum": 0, }, }, "lastScanTime": "1590717640", "startTime": "", "success": True, "sysProgress": 100, "sysStatus": "outOfDate", }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/const_6_core_share.py000066400000000000000000000137611467623651400263160ustar00rootroot00000000000000"""DSM 6 SYNO.Core.Share data.""" DSM_6_CORE_SHARE = { "data": { "shares": [ { "desc": "Docker Containers", "enable_recycle_bin": False, "enable_share_compress": False, "enable_share_cow": True, "enc_auto_mount": False, "encryption": 0, "force_readonly_reason": "", "hidden": True, "is_aclmode": True, "is_block_snap_action": False, "is_cluster_share": False, "is_cold_storage_share": False, "is_exfat_share": False, "is_force_readonly": False, "is_share_moving": False, "is_support_acl": True, "is_sync_share": False, "is_usb_share": False, "name": "docker", "quota_value": 0, "recycle_bin_admin_only": False, "share_quota_used": 0, "support_action": 511, "support_snapshot": True, "task_id": "", "unite_permission": False, "uuid": "78egut02-b5b1-4933-adt8-a9208526d234", "vol_path": "/volume1", }, { "desc": "", "enable_recycle_bin": True, "enable_share_compress": False, "enable_share_cow": True, "enc_auto_mount": False, "encryption": 0, "force_readonly_reason": "", "hidden": False, "is_aclmode": True, "is_block_snap_action": False, "is_cluster_share": False, "is_cold_storage_share": False, "is_exfat_share": False, "is_force_readonly": False, "is_share_moving": False, "is_support_acl": True, "is_sync_share": False, "is_usb_share": False, "name": "test_share", "quota_value": 0, "recycle_bin_admin_only": False, "share_quota_used": 36146658672640.0, "support_action": 511, "support_snapshot": True, "task_id": "", "unite_permission": False, "uuid": "2ee6c06a-8766-48b5-013d-63b18652a393", "vol_path": "/volume1", }, { "desc": "user home", "enable_recycle_bin": False, "enable_share_compress": False, "enable_share_cow": True, "enc_auto_mount": False, "encryption": 0, "force_readonly_reason": "", "hidden": False, "is_aclmode": True, "is_block_snap_action": False, "is_cluster_share": False, "is_cold_storage_share": False, "is_exfat_share": False, "is_force_readonly": False, "is_share_moving": False, "is_support_acl": True, "is_sync_share": False, "is_usb_share": False, "name": "homes", "quota_value": 0, "recycle_bin_admin_only": False, "share_quota_used": 0.015625, "support_action": 511, "support_snapshot": True, "task_id": "", "unite_permission": False, "uuid": "2b829t90-9512-4236-qqe0-d4133e9992d0", "vol_path": "/volume1", }, { "desc": "Log volume", "enable_recycle_bin": True, "enable_share_compress": True, "enable_share_cow": True, "enc_auto_mount": True, "encryption": 0, "force_readonly_reason": "", "hidden": True, "is_aclmode": True, "is_block_snap_action": False, "is_cluster_share": False, "is_cold_storage_share": False, "is_exfat_share": False, "is_force_readonly": False, "is_share_moving": False, "is_support_acl": True, "is_sync_share": False, "is_usb_share": False, "name": "logs", "quota_value": 0, "recycle_bin_admin_only": True, "share_quota_used": 947.28515625, "support_action": 511, "support_snapshot": True, "task_id": "", "unite_permission": False, "uuid": "b9876507-6880-4wes-8d61-6c984c0813ty", "vol_path": "/volume2", }, { "desc": "VMs", "enable_recycle_bin": False, "enable_share_compress": False, "enable_share_cow": True, "enc_auto_mount": False, "encryption": 0, "force_readonly_reason": "", "hidden": False, "is_aclmode": True, "is_block_snap_action": False, "is_cluster_share": False, "is_cold_storage_share": False, "is_exfat_share": False, "is_force_readonly": False, "is_share_moving": False, "is_support_acl": True, "is_sync_share": False, "is_usb_share": False, "name": "Virtual_Machines", "quota_value": 0, "recycle_bin_admin_only": False, "share_quota_used": 33911668, "support_action": 511, "support_snapshot": True, "task_id": "", "unite_permission": False, "uuid": "5416f693-04tt-4re2-b8e4-f6b18731689b", "vol_path": "/volume3", }, ], "total": 5, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/const_6_core_system.py000066400000000000000000000063541467623651400265400ustar00rootroot00000000000000"""DSM 6 SYNO.Core.System data.""" DSM_6_CORE_SYSTEM_DS918_PLUS = { "data": { "cpu_clock_speed": 1500, "cpu_cores": "4", "cpu_family": "Celeron", "cpu_series": "J3455", "cpu_vendor": "INTEL", "enabled_ntp": True, "firmware_date": "2020/07/08", "firmware_ver": "DSM 6.2.3-25426 Update 2", "model": "DS918+", "ntp_server": "time.google.com", "ram_size": 4096, "sata_dev": [], "serial": "1920PDN001501", "support_esata": "yes", "sys_temp": 40, "sys_tempwarn": False, "systempwarn": False, "temperature_warning": False, "time": "2020-10-19 23:33:52", "time_zone": "Brussels", "time_zone_desc": "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris", "up_time": "75:12:9", "usb_dev": [ { "cls": "hub", "pid": "0612", "producer": "Genesys Logic, Inc.", "product": "Hub", "rev": "92.23", "vid": "05e3", }, { "cls": "other", "pid": "1790", "producer": "ASIX Electronics Corp.", "product": "AX88179 Gigabit Ethernet", "rev": "1.00", "vid": "0b95", }, { "cls": "hub", "pid": "0610", "producer": "Genesys Logic, Inc.", "product": "4-port hub", "rev": "92.23", "vid": "05e3", }, { "cls": "other", "pid": "0200", "producer": "Sigma Designs, Inc.", "product": "Aeotec Z-Stick Gen5 (ZW090) - UZB", "rev": "0.00", "vid": "0658", }, { "cls": "ups", "pid": "0002", "producer": "American Power Conversion", "product": "Uninterruptible Power Supply", "rev": "1.06", "vid": "051d", }, ], }, "success": True, } DSM_6_CORE_SYSTEM_DS218_PLAY = { "data": { "cpu_clock_speed": 1400, "cpu_cores": "4", "cpu_family": "RTD1296", "cpu_series": "SoC", "cpu_vendor": "Realtek", "enabled_ntp": True, "firmware_date": "2020/07/14", "firmware_ver": "DSM 6.2.3-25426 Update 2", "model": "DS218play", "ntp_server": "pool.ntp.org", "ram_size": 1024, "serial": "123456abcdefg", "support_esata": "no", "sys_temp": 40, "sys_tempwarn": False, "systempwarn": False, "temperature_warning": False, "time": "2020-10-16 20:26:58", "time_zone": "Amsterdam", "time_zone_desc": "(GMT+01:00) Amsterdam, Berlin, Rome, Stockholm, Vienna", "up_time": "289:31:54", "usb_dev": [ { "cls": "disk", "pid": "2621", "producer": "Western Digital Technologies, Inc.", "product": "Elements 2621", "rev": "10.26", "vid": "1058", } ], }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/const_6_core_upgrade.py000066400000000000000000000011631467623651400266340ustar00rootroot00000000000000"""DSM 6 SYNO.Core.Upgrade data.""" DSM_6_CORE_UPGRADE_FALSE = {"data": {"update": {"available": False}}, "success": True} DSM_6_CORE_UPGRADE_TRUE = { "data": { "update": { "available": True, "reboot": "now", "restart": "some", "type": "nano", "version": "DSM 6.2.3-25426 Update 2", "version_details": { "buildnumber": 25426, "major": 6, "micro": 3, "minor": 2, "nano": 2, "os_name": "DSM", }, } }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/core/const_6_core_utilization.py000066400000000000000000000063671467623651400275730ustar00rootroot00000000000000"""DSM 6 SYNO.Core.System.Utilization data.""" DSM_6_CORE_UTILIZATION_ERROR_1055 = { "error": { "code": 1055, "errors": { "err_key": "", "err_line": 883, "err_msg": "Transmition failed.", "err_session": "", }, }, "success": False, } DSM_6_CORE_UTILIZATION = { "data": { "cpu": { "15min_load": 51, "1min_load": 37, "5min_load": 33, "device": "System", "other_load": 3, "system_load": 2, "user_load": 4, }, "disk": { "disk": [ { "device": "sdc", "display_name": "Drive 3", "read_access": 3, "read_byte": 55261, "type": "internal", "utilization": 12, "write_access": 15, "write_byte": 419425, }, { "device": "sda", "display_name": "Drive 1", "read_access": 3, "read_byte": 63905, "type": "internal", "utilization": 8, "write_access": 14, "write_byte": 414795, }, { "device": "sdb", "display_name": "Drive 2", "read_access": 3, "read_byte": 55891, "type": "internal", "utilization": 10, "write_access": 15, "write_byte": 415658, }, ], "total": { "device": "total", "read_access": 9, "read_byte": 175057, "utilization": 10, "write_access": 44, "write_byte": 1249878, }, }, "lun": [], "memory": { "avail_real": 156188, "avail_swap": 4146316, "buffer": 15172, "cached": 2764756, "device": "Memory", "memory_size": 4194304, "real_usage": 24, "si_disk": 0, "so_disk": 0, "swap_usage": 6, "total_real": 3867268, "total_swap": 4415404, }, "network": [ {"device": "total", "rx": 109549, "tx": 45097}, {"device": "eth0", "rx": 109549, "tx": 45097}, {"device": "eth1", "rx": 0, "tx": 0}, ], "space": { "total": { "device": "total", "read_access": 1, "read_byte": 27603, "utilization": 1, "write_access": 23, "write_byte": 132496, }, "volume": [ { "device": "md2", "display_name": "volume1", "read_access": 1, "read_byte": 27603, "utilization": 1, "write_access": 23, "write_byte": 132496, } ], }, "time": 1585503221, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/download_station/000077500000000000000000000000001467623651400246075ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/download_station/__init__.py000066400000000000000000000000521467623651400267150ustar00rootroot00000000000000"""DSM 6 SYNO.DownloadStation.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_6/download_station/const_6_download_station_info.py000066400000000000000000000012101467623651400331710ustar00rootroot00000000000000"""DSM 6 SYNO.DownloadStation.Info data.""" DSM_6_DOWNLOAD_STATION_INFO_INFO = { "data": {"is_manager": True, "version": 3543, "version_string": "3.8-3543"}, "success": True, } DSM_6_DOWNLOAD_STATION_INFO_CONFIG = { "data": { "bt_max_download": 0, "bt_max_upload": 800, "default_destination": "downloads", "emule_default_destination": None, "emule_enabled": False, "emule_max_download": 0, "emule_max_upload": 20, "ftp_max_download": 0, "http_max_download": 0, "nzb_max_download": 0, "unzip_service_enabled": False, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/download_station/const_6_download_station_stat.py000066400000000000000000000002531467623651400332170ustar00rootroot00000000000000"""DSM 6 SYNO.DownloadStation.Statistic data.""" DSM_6_DOWNLOAD_STATION_STAT_INFO = { "data": {"speed_download": 89950232, "speed_upload": 0}, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/download_station/const_6_download_station_task.py000066400000000000000000000300151467623651400332050ustar00rootroot00000000000000"""DSM 6 SYNO.DownloadStation.Task data.""" DSM_6_DOWNLOAD_STATION_TASK_LIST = { "data": { "offset": 0, "tasks": [ { "additional": { "detail": { "completed_time": 0, "connected_leechers": 0, "connected_peers": 0, "connected_seeders": 0, "create_time": 1550089068, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 1592549339, "total_peers": 0, "total_pieces": 1239, "unzip_password": "", "uri": "magnet:?xt=urn:btih:1234ABCD1234ABCD1234ABCD1234ABCD1234ABCD&dn=1234", "waiting_seconds": 0, }, "file": [ { "filename": "INFO.nfo", "index": 0, "priority": "low", "size": 1335, "size_downloaded": 0, "wanted": True, }, { "filename": "My super movie 2 2022.mkv", "index": 1, "priority": "normal", "size": 1591087515, "size_downloaded": 0, "wanted": True, }, { "filename": "My super movie 2 sample.mkv", "index": 2, "priority": "normal", "size": 2754524, "size_downloaded": 0, "wanted": False, }, { "filename": "My super movie 2021.mkv", "index": 3, "priority": "normal", "size": 1155085341, "size_downloaded": 0, "wanted": True, }, { "filename": "My super movie 2021 sample.mkv", "index": 4, "priority": "normal", "size": 4359701, "size_downloaded": 0, "wanted": False, }, { "filename": "My super movie 3 2023.mkv", "index": 5, "priority": "normal", "size": 1288819263, "size_downloaded": 0, "wanted": True, }, { "filename": "My super movie 3 sample.mkv", "index": 6, "priority": "normal", "size": 3077684, "size_downloaded": 0, "wanted": False, }, { "filename": "My super movie 4 2031.mkv", "index": 7, "priority": "normal", "size": 1149397942, "size_downloaded": 0, "wanted": True, }, { "filename": "My super movie 4 sample.mkv", "index": 8, "priority": "normal", "size": 2023179, "size_downloaded": 0, "wanted": False, }, ], }, "id": "dbid_86", "size": 5196586484, "status": "downloading", "title": "My super movie Complete 2021-2031", "type": "bt", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 0, "connected_leechers": 0, "connected_peers": 0, "connected_seeders": 0, "create_time": 1551214114, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 1592549348, "total_peers": 0, "total_pieces": 948, "unzip_password": "", "uri": "magnet:?xt=urn:btih:1234ABCD1234ABCD1234ABCD1234ABCD1234ABCD&dn=1234", "waiting_seconds": 0, }, "file": [ { "filename": "Blade Swipper 1984.mkv", "index": 0, "priority": "normal", "size": 1986298376, "size_downloaded": 1602519560, "wanted": True, } ], }, "id": "dbid_164", "size": 1986298376, "status": "downloading", "title": "Blade Swipper 1984.mkv", "type": "bt", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 0, "connected_leechers": 0, "connected_peers": 50, "connected_seeders": 50, "create_time": 1585435581, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 1592549349, "total_peers": 0, "total_pieces": 0, "unzip_password": "", "uri": "magnet:?xt=urn:btih:1234ABCD1234ABCD1234ABCD1234ABCD1234ABCD&dn=1234", "waiting_seconds": 0, }, "file": [], }, "id": "dbid_486", "size": 0, "status": "downloading", "title": "The falling State", "type": "bt", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 0, "connected_leechers": 0, "connected_peers": 1, "connected_seeders": 1, "create_time": 1591562665, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 1591563597, "total_peers": 0, "total_pieces": 1494, "unzip_password": "", "uri": "magnet:?xt=urn:btih:1234ABCD1234ABCD1234ABCD1234ABCD1234ABCD&dn=1234", "waiting_seconds": 0, } }, "id": "dbid_518", "size": 391580448, "status": "paused", "title": "Welcome to the North.mkv", "type": "bt", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 1591565351, "connected_leechers": 0, "connected_peers": 0, "connected_seeders": 0, "create_time": 1591563606, "destination": "Folder/containing/downloads", "seedelapsed": 172800, "started_time": 1592601577, "total_peers": 0, "total_pieces": 5466, "unzip_password": "", "uri": "magnet:?xt=urn:btih:1234ABCD1234ABCD1234ABCD1234ABCD1234ABCD&dn=1234", "waiting_seconds": 0, } }, "id": "dbid_522", "size": 5731285821, "status": "finished", "title": "Birds of Pokémon.mkv", "type": "bt", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 1591566799, "connected_leechers": 0, "connected_peers": 0, "connected_seeders": 0, "create_time": 1591566523, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 1591566696, "total_peers": 0, "total_pieces": 0, "unzip_password": "", "uri": "https://1fichier.com/?1234ABCD1234ABCD1234&af=22123", "waiting_seconds": 0, } }, "id": "dbid_531", "size": 2811892495, "status": "finished", "title": "1234ABCD1234ABCD1234", "type": "https", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 0, "connected_leechers": 0, "connected_peers": 0, "connected_seeders": 0, "create_time": 1591566903, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 0, "total_peers": 0, "total_pieces": 0, "unzip_password": "", "uri": "https://1fichier.com/?123ABC123ABC123ABC12", "waiting_seconds": 0, } }, "id": "dbid_533", "size": 0, "status": "error", "status_extra": {"error_detail": "unknown"}, "title": "?123ABC123ABC123ABC12", "type": "https", "username": "Test_useR", }, { "additional": { "detail": { "completed_time": 0, "connected_leechers": 0, "connected_peers": 0, "connected_seeders": 0, "create_time": 1592605687, "destination": "Folder/containing/downloads", "seedelapsed": 0, "started_time": 1592605731, "total_peers": 0, "total_pieces": 0, "unzip_password": "", "uri": "https://1fichier.com/?123ABC123ABC123ABC12", "waiting_seconds": 0, } }, "id": "dbid_549", "size": 0, "status": "error", "status_extra": {"error_detail": "broken_link"}, "title": "123ABC123ABC123ABC12", "type": "https", "username": "Test_useR", }, ], "total": 8, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/dsm/000077500000000000000000000000001467623651400220225ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/dsm/__init__.py000066400000000000000000000000361467623651400241320ustar00rootroot00000000000000"""DSM 6 SYNO.DSM.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_6/dsm/const_6_dsm_info.py000066400000000000000000000016041467623651400256260ustar00rootroot00000000000000"""DSM 6 SYNO.DSM.Info data.""" DSM_6_DSM_INFORMATION_DS213_PLUS = { "data": { "codepage": "enu", "model": "DS213+", "ram": 512, "serial": "XXXXXXXXXXX", "temperature": 30, "temperature_warn": False, "time": "Thu Apr 30 14:57:35 2020", "uptime": 3258607, "version": "24922", "version_string": "DSM 6.2.2-24922 Update 4", }, "success": True, } DSM_6_DSM_INFORMATION_DS918_PLUS = { "data": { "codepage": "fre", "model": "DS918+", "ram": 4096, "serial": "1920PDN001501", "temperature": 40, "temperature_warn": False, "time": "Sun Mar 29 19:33:41 2020", "uptime": 155084, "version": "24922", "version_string": "DSM 6.2.2-24922 Update 4", }, "success": True, } DSM_6_DSM_INFORMATION = DSM_6_DSM_INFORMATION_DS918_PLUS py-synologydsm-api-2.5.3/tests/api_data/dsm_6/dsm/const_6_dsm_network.py000066400000000000000000000055411467623651400263700ustar00rootroot00000000000000"""DSM 6 SYNO.DSM.Network data.""" DSM_6_DSM_NETWORK_1LAN = { "data": { "dns": ["192.168.0.35"], "gateway": "192.168.0.254", "hostname": "NAS_[NAME]", "interfaces": [ { "id": "eth0", "ip": [{"address": "192.168.0.35", "netmask": "255.255.255.0"}], "ipv6": [ { "address": "2a01:e35:2434:d420:211:32ff:fea6:ca59", "prefix_length": 64, "scope": "global", }, { "address": "fe80::211:32ff:fea6:ca59", "prefix_length": 64, "scope": "link", }, ], "mac": "00-11-32-XX-XX-59", "type": "lan", }, { "id": "eth1", "ip": [{"address": "169.254.158.209", "netmask": "255.255.0.0"}], "mac": "00-11-32-XX-XX-5A", "type": "lan", }, ], "workgroup": "WORKGROUP", }, "success": True, } DSM_6_DSM_NETWORK_2LAN_1PPPOE = { "data": { "dns": ["192.168.0.35"], "gateway": "192.168.0.254", "hostname": "NAS_[NAME]", "interfaces": [ { "id": "eth0", "ip": [{"address": "192.168.5.10", "netmask": "255.255.255.0"}], "ipv6": [ { "address": "2001:b211:317c:147e:211:32ff:fe5d:fd11", "prefix_length": 64, "scope": "global", }, { "address": "fe80::211:32ff:fe5d:fd11", "prefix_length": 64, "scope": "link", }, ], "mac": "00-11-32-XX-XX-11", "type": "lan", }, { "id": "eth1", "ip": [{"address": "192.168.1.100", "netmask": "255.255.255.0"}], "ipv6": [ { "address": "2001:b011:300c:176c:211:11ff:fe5d:fd12", "prefix_length": 64, "scope": "global", }, { "address": "fe80::211:31ff:ff5d:fd12", "prefix_length": 64, "scope": "link", }, ], "mac": "00-11-32-XX-XX-12", "type": "lan", }, { "id": "ppp0", "ip": [{"address": "114.45.2.158", "netmask": "255.255.255.255"}], "type": "pppoe", }, ], "workgroup": "WORKGROUP", }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/storage/000077500000000000000000000000001467623651400227035ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/storage/__init__.py000066400000000000000000000000421467623651400250100ustar00rootroot00000000000000"""DSM 6 SYNO.Storage.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_6/storage/const_6_storage_storage.py000066400000000000000000002435771467623651400301220ustar00rootroot00000000000000"""DSM 6 SYNO.Storage.CGI.Storage data.""" from tests.const import UNIQUE_KEY DSM_6_STORAGE_STORAGE_DS1819_PLUS_SHR2_8DISKS_1VOL = { "data": { "disks": [ { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sda", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 0, "exceed_bad_sector_thr": False, "firm": "81.00A81", "has_system": True, "id": "sda", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 1", "model": "WD80EFAX-68KNBN0 ", "name": "Drive 1", "num_id": 1, "order": 1, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "VAHG7V1L", "size_total": "8001563222016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 39, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdb", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 0, "exceed_bad_sector_thr": False, "firm": "81.00A81", "has_system": True, "id": "sdb", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 2", "model": "WD80EFAX-68KNBN0 ", "name": "Drive 2", "num_id": 2, "order": 2, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "VAHGLLPL", "size_total": "8001563222016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 40, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdc", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 0, "exceed_bad_sector_thr": False, "firm": "81.00A81", "has_system": True, "id": "sdc", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 3", "model": "WD80EFAX-68KNBN0 ", "name": "Drive 3", "num_id": 3, "order": 3, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "VAHH38AL", "size_total": "8001563222016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 40, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdd", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 0, "exceed_bad_sector_thr": False, "firm": "81.00A81", "has_system": True, "id": "sdd", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 4", "model": "WD80EFAX-68KNBN0 ", "name": "Drive 4", "num_id": 4, "order": 4, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "VAHGW7VL", "size_total": "8001563222016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 41, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sde", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 0, "exceed_bad_sector_thr": False, "firm": "GX2M", "has_system": True, "id": "sde", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 5", "model": "HDWN180 ", "name": "Drive 5", "num_id": 5, "order": 5, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "399CK0FUFAVG", "size_total": "8001563222016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 36, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "TOSHIBA ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdf", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 0, "exceed_bad_sector_thr": False, "firm": "GX2M", "has_system": True, "id": "sdf", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 6", "model": "HDWN180 ", "name": "Drive 6", "num_id": 6, "order": 6, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "399CK0G0FAVG", "size_total": "8001563222016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 36, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "TOSHIBA ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdg", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 510, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sdg", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 7", "model": "WD40EFRX-68WT0N0 ", "name": "Drive 7", "num_id": 7, "order": 7, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC4E7PD98ZY", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 33, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1819+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdh", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 488, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sdh", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 8", "model": "WD40EFRX-68N32N0 ", "name": "Drive 8", "num_id": 8, "order": 8, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K3FP148E", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 31, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, ], "env": { "batchtask": {"max_task": 64, "remain_task": 64}, "bay_number": "8", "data_scrubbing": {"sche_enabled": "0", "sche_status": "disabled"}, "ebox": [], "fs_acting": False, "isSyncSysPartition": False, "is_space_actioning": False, "isns": {"address": "", "enabled": False}, "isns_server": "", "max_fs_bytes": "118747255799808", "max_fs_bytes_high_end": "219902325555200", "model_name": "DS1819+", "ram_enough_for_fs_high_end": False, "ram_size": 16, "ram_size_required": 32, "showpooltab": True, "status": {"system_crashed": False, "system_need_repair": False}, "support": {"ebox": True, "raid_cross": True, "sysdef": True}, "support_fit_fs_limit": True, "unique_key": UNIQUE_KEY, "volume_full_critical": 0.1, "volume_full_warning": 0.2, }, "hotSpareConf": {"cross_repair": True, "disable_repair": []}, "hotSpares": [], "iscsiLuns": [], "iscsiTargets": [], "ports": [], "ssdCaches": [], "storagePools": [ { "cacheStatus": "", "can_do": { "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "raid_cross": True, }, "container": "internal", "desc": "SHR-2", "device_type": "shr_with_2_disk_protect", "disk_failure_number": 0, "disks": ["sda", "sdb", "sdc", "sdd", "sde", "sdf", "sdg", "sdh"], "drive_type": 0, "id": "reuse_1", "is_actioning": False, "is_scheduled": False, "is_writable": True, "last_done_time": 0, "limited_disk_number": 24, "maximal_disk_size": "0", "minimal_disk_size": "8001457274880", "next_schedule_time": 0, "num_id": 1, "pool_child": [{"id": "volume_1", "size": {"total": "39978088267776"}}], "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "multiple", "raids": [ { "designedDiskCount": 6, "devices": [ {"id": "sdf", "slot": 5, "status": "normal"}, {"id": "sde", "slot": 4, "status": "normal"}, {"id": "sdd", "slot": 3, "status": "normal"}, {"id": "sdc", "slot": 2, "status": "normal"}, {"id": "sdb", "slot": 1, "status": "normal"}, {"id": "sda", "slot": 0, "status": "normal"}, ], "hasParity": True, "minDevSize": "8001457274880", "normalDevCount": 6, "raidPath": "/dev/md3", "raidStatus": 1, "spares": [], }, { "designedDiskCount": 8, "devices": [ {"id": "sdh", "slot": 7, "status": "normal"}, {"id": "sdg", "slot": 6, "status": "normal"}, {"id": "sdf", "slot": 5, "status": "normal"}, {"id": "sde", "slot": 4, "status": "normal"}, {"id": "sdd", "slot": 3, "status": "normal"}, {"id": "sdc", "slot": 2, "status": "normal"}, {"id": "sdb", "slot": 1, "status": "normal"}, {"id": "sda", "slot": 0, "status": "normal"}, ], "hasParity": True, "minDevSize": "8001457274880", "normalDevCount": 8, "raidPath": "/dev/md2", "raidStatus": 1, "spares": [], }, ], "scrubbingStatus": "has_not_run_yet", "size": {"total": "39978100850688", "used": "39978100850688"}, "space_path": "/dev/vg1", "spares": [], "status": "normal", "suggestions": [], "timebackup": False, "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": False, "errCode": 768, "stopService": False, }, "remove": { "can_do": False, "errCode": 768, "stopService": False, }, "resize": { "can_do": False, "errCode": 768, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, } ], "volumes": [ { "atime_checked": False, "atime_opt": "relatime", "cacheStatus": "", "can_do": {"delete": True, "raid_cross": True}, "container": "internal", "desc": "Located on Storage Pool 1, SHR", "device_type": "shr_with_2_disk_protect", "disk_failure_number": 0, "disks": [], "drive_type": 0, "eppool_used": "0", "exist_alive_vdsm": False, "fs_type": "btrfs", "id": "volume_1", "is_acting": False, "is_actioning": False, "is_inode_full": False, "is_scheduled": False, "is_writable": True, "last_done_time": 0, "limited_disk_number": 24, "max_fs_size": "1152921504606846976", "next_schedule_time": 0, "num_id": 1, "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "multiple", "scrubbingStatus": "", "size": { "free_inode": "0", "total": "38378964738048", "total_device": "39978088267776", "total_inode": "0", "used": "26724878606336", }, "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [], "timebackup": False, "used_by_gluster": False, "vol_path": "/volume1", "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": {"can_do": True, "errCode": 0, "stopService": True}, "remove": {"can_do": True, "errCode": 0, "stopService": False}, "resize": {"can_do": True, "errCode": 0, "stopService": False}, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, } ], }, "success": True, } DSM_6_STORAGE_STORAGE_DS1515_PLUS_SHR2_10DISKS_1VOL_WITH_EXPANSION = { "data": { "disks": [ { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1515+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sda", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 510, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sda", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 1", "model": "WD40EFRX-68WT0N0 ", "name": "Drive 1", "num_id": 1, "order": 1, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC4E2JL3SNU", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 33, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1515+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdb", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 490, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sdb", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 2", "model": "WD40EFRX-68N32N0 ", "name": "Drive 2", "num_id": 2, "order": 2, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K0NAV92K", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 30, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1515+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdc", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 510, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sdc", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 3", "model": "WD40EFRX-68WT0N0 ", "name": "Drive 3", "num_id": 3, "order": 3, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC4E4NTR3PK", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 31, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1515+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdd", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 510, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sdd", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 4", "model": "WD40EFRX-68WT0N0 ", "name": "Drive 4", "num_id": 4, "order": 4, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC4E2CDEDH1", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 32, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS1515+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sde", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 510, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": True, "id": "sde", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 5", "model": "WD40EFRX-68WT0N0 ", "name": "Drive 5", "num_id": 5, "order": 5, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC4E2HAC6NK", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 30, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 1, "str": "DX513-1", "supportPwrBtnDisable": True, "type": "ebox", }, "device": "/dev/sdga", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 492, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": False, "id": "sdga", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 1 (DX513-1)", "model": "WD40EFRX-68N32N0 ", "name": "Drive 1 (DX513-1)", "num_id": 1, "order": 1, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K1UZSF9D", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 33, "testing_progress": "", "testing_type": "", "tray_status": "", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 1, "str": "DX513-1", "supportPwrBtnDisable": True, "type": "ebox", }, "device": "/dev/sdgb", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 498, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": False, "id": "sdgb", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 2 (DX513-1)", "model": "WD40EFRX-68N32N0 ", "name": "Drive 2 (DX513-1)", "num_id": 2, "order": 2, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K6ZKJE8Y", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 34, "testing_progress": "", "testing_type": "", "tray_status": "", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 1, "str": "DX513-1", "supportPwrBtnDisable": True, "type": "ebox", }, "device": "/dev/sdgc", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 494, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": False, "id": "sdgc", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 3 (DX513-1)", "model": "WD40EFRX-68N32N0 ", "name": "Drive 3 (DX513-1)", "num_id": 3, "order": 3, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K6AKHYDP", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 35, "testing_progress": "", "testing_type": "", "tray_status": "", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 1, "str": "DX513-1", "supportPwrBtnDisable": True, "type": "ebox", }, "device": "/dev/sdgd", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 502, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": False, "id": "sdgd", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 4 (DX513-1)", "model": "WD40EFRX-68N32N0 ", "name": "Drive 4 (DX513-1)", "num_id": 4, "order": 4, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K7JSL21J", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 35, "testing_progress": "", "testing_type": "", "tray_status": "", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 1, "str": "DX513-1", "supportPwrBtnDisable": True, "type": "ebox", }, "device": "/dev/sdge", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 508, "exceed_bad_sector_thr": False, "firm": "82.00A82", "has_system": False, "id": "sdge", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 5 (DX513-1)", "model": "WD40EFRX-68N32N0 ", "name": "Drive 5 (DX513-1)", "num_id": 5, "order": 5, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-WCC7K6ZKJJ7S", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 34, "testing_progress": "", "testing_type": "", "tray_status": "", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, ], "env": { "batchtask": {"max_task": 64, "remain_task": 64}, "bay_number": "5", "data_scrubbing": {"sche_enabled": "1", "sche_status": "done"}, "ebox": [{"id": "sdg", "str": "DX513-1"}], "fs_acting": False, "isSyncSysPartition": False, "is_space_actioning": False, "isns": {"address": "", "enabled": False}, "isns_server": "", "max_fs_bytes": "118747255799808", "max_fs_bytes_high_end": "219902325555200", "model_name": "DS1515+", "ram_enough_for_fs_high_end": False, "ram_size": 2, "ram_size_required": 32, "showpooltab": False, "status": {"system_crashed": False, "system_need_repair": False}, "support": {"ebox": True, "raid_cross": True, "sysdef": True}, "support_fit_fs_limit": True, "unique_key": UNIQUE_KEY, "volume_full_critical": 0.1, "volume_full_warning": 0.2, }, "hotSpareConf": {"cross_repair": True, "disable_repair": []}, "hotSpares": [], "iscsiLuns": [], "iscsiTargets": [], "ports": [], "ssdCaches": [], "storagePools": [ { "cacheStatus": "", "can_do": { "convert_shr_to_pool": 1, "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "raid_cross": True, }, "container": "cross", "deploy_path": "volume_1", "desc": "", "device_type": "shr_with_2_disk_protect", "disk_failure_number": 0, "disks": [ "sda", "sdb", "sdc", "sdd", "sde", "sdga", "sdgb", "sdgc", "sdgd", "sdge", ], "drive_type": 0, "id": "reuse_1", "is_actioning": False, "is_scheduled": True, "is_writable": True, "last_done_time": 1585897389, "limited_disk_number": 12, "maximal_disk_size": "0", "minimal_disk_size": "4000681082880", "next_schedule_time": 1588320000, "num_id": 1, "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "single", "raids": [ { "designedDiskCount": 10, "devices": [ {"id": "sdge", "slot": 6, "status": "normal"}, {"id": "sdgd", "slot": 7, "status": "normal"}, {"id": "sdgc", "slot": 8, "status": "normal"}, {"id": "sdgb", "slot": 9, "status": "normal"}, {"id": "sdga", "slot": 5, "status": "normal"}, {"id": "sde", "slot": 4, "status": "normal"}, {"id": "sdd", "slot": 3, "status": "normal"}, {"id": "sdc", "slot": 2, "status": "normal"}, {"id": "sdb", "slot": 1, "status": "normal"}, {"id": "sda", "slot": 0, "status": "normal"}, ], "hasParity": True, "minDevSize": "4000681082880", "normalDevCount": 10, "raidPath": "/dev/md2", "raidStatus": 1, "spares": [], } ], "scrubbingStatus": "done", "size": {"total": "31966715969536", "used": "31966715969536"}, "space_path": "/dev/vg1000/lv", "spares": [], "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [], "timebackup": False, "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": {"can_do": True, "errCode": 0, "stopService": True}, "remove": {"can_do": True, "errCode": 0, "stopService": False}, "resize": {"can_do": True, "errCode": 0, "stopService": False}, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, } ], "volumes": [ { "atime_checked": False, "atime_opt": "relatime", "cacheStatus": "", "can_do": { "convert_shr_to_pool": 1, "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "raid_cross": True, }, "container": "cross", "deploy_path": "volume_1", "desc": "", "device_type": "shr_with_2_disk_protect", "disk_failure_number": 0, "disks": [], "drive_type": 0, "eppool_used": "0", "exist_alive_vdsm": False, "fs_type": "ext4", "id": "volume_1", "is_acting": False, "is_actioning": False, "is_inode_full": False, "is_scheduled": True, "is_writable": True, "last_done_time": 1585897389, "limited_disk_number": 12, "max_fs_size": "1152921504606846976", "next_schedule_time": 1588320000, "num_id": 1, "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "single", "scrubbingStatus": "done", "size": { "free_inode": "974296118", "total": "31714659872768", "total_device": "31966715969536", "total_inode": "975548416", "used": "25419707531264", }, "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [{"str": "volume_usage_suggestion", "type": "warning"}], "timebackup": False, "used_by_gluster": False, "vol_path": "/volume1", "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": {"can_do": True, "errCode": 0, "stopService": True}, "remove": {"can_do": True, "errCode": 0, "stopService": False}, "resize": {"can_do": True, "errCode": 0, "stopService": False}, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, } ], }, "success": True, } DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS = { "data": { "disks": [ { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS213+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sda", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 510, "exceed_bad_sector_thr": False, "firm": "80.00A80", "has_system": True, "id": "sda", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 1", "model": "WD30E", "name": "Drive 1", "num_id": 1, "order": 1, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "WD-xxxxx", "size_total": "3000592982016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 29, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "WDC ", }, { "adv_progress": "", "adv_status": "not_support", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS213+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdb", "disable_secera": False, "diskType": "SATA", "disk_code": "", "erase_time": 424, "exceed_bad_sector_thr": False, "firm": "1AN10003", "has_system": True, "id": "sdb", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 2", "model": "HD20xxx", "name": "Drive 2", "num_id": 2, "order": 2, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "S1Uxxxxxxxxxxxx", "size_total": "2000398934016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 30, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_2", "vendor": "SAMSUNG ", }, ], "env": { "batchtask": {"max_task": 64, "remain_task": 64}, "bay_number": "2", "data_scrubbing": {"sche_enabled": "0", "sche_status": "disabled"}, "ebox": [], "fs_acting": False, "isSyncSysPartition": False, "is_space_actioning": False, "isns": {"address": "", "enabled": False}, "isns_server": "", "max_fs_bytes": "17592181850112", "max_fs_bytes_high_end": "219902325555200", "model_name": "DS213+", "ram_enough_for_fs_high_end": False, "ram_size": 0, "ram_size_required": 32, "showpooltab": True, "status": {"system_crashed": False, "system_need_repair": False}, "support": {"ebox": True, "raid_cross": False, "sysdef": True}, "support_fit_fs_limit": False, "unique_key": UNIQUE_KEY, "volume_full_critical": 0.05, "volume_full_warning": 0.1, }, "hotSpareConf": {"cross_repair": True, "disable_repair": []}, "hotSpares": [], "iscsiLuns": [], "iscsiTargets": [], "ports": [], "storagePools": [ { "cacheStatus": "", "can_do": { "delete": True, "expand_by_disk": 1, "migrate": {"to_shr2": 3}, }, "container": "internal", "desc": "Diskgroep 2", "device_type": "shr_without_disk_protect", "disk_failure_number": 0, "disks": ["sdb"], "drive_type": 0, "id": "reuse_2", "is_actioning": False, "is_scheduled": False, "is_writable": True, "last_done_time": 0, "limited_disk_number": 12, "maximal_disk_size": "0", "minimal_disk_size": "2000292986880", "next_schedule_time": 0, "num_id": 2, "pool_child": [{"id": "volume_2", "size": {"total": "1995435933696"}}], "pool_path": "reuse_2", "progress": {"percent": "-1", "step": "none"}, "raidType": "multiple", "raids": [ { "designedDiskCount": 1, "devices": [{"id": "sdb", "slot": 0, "status": "normal"}], "hasParity": False, "minDevSize": "2000292986880", "normalDevCount": 1, "raidPath": "/dev/md3", "raidStatus": 1, "spares": [], } ], "scrubbingStatus": "has_not_run_yet", "size": {"total": "1995448516608", "used": "1995448516608"}, "space_path": "/dev/vg2", "spares": [], "status": "normal", "suggestions": [], "timebackup": False, "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": False, "errCode": 53504, "stopService": False, }, "remove": { "can_do": False, "errCode": 53504, "stopService": False, }, "resize": { "can_do": False, "errCode": 53504, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, }, { "cacheStatus": "", "can_do": { "delete": True, "expand_by_disk": 1, "migrate": {"to_shr2": 3}, }, "container": "internal", "desc": "Diskgroep1", "device_type": "shr_without_disk_protect", "disk_failure_number": 0, "disks": ["sda"], "drive_type": 0, "id": "reuse_1", "is_actioning": False, "is_scheduled": False, "is_writable": True, "last_done_time": 0, "limited_disk_number": 12, "maximal_disk_size": "0", "minimal_disk_size": "3000487034880", "next_schedule_time": 0, "num_id": 1, "pool_child": [{"id": "volume_1", "size": {"total": "2995630637056"}}], "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "multiple", "raids": [ { "designedDiskCount": 1, "devices": [{"id": "sda", "slot": 0, "status": "normal"}], "hasParity": False, "minDevSize": "3000487034880", "normalDevCount": 1, "raidPath": "/dev/md2", "raidStatus": 1, "spares": [], } ], "scrubbingStatus": "has_not_run_yet", "size": {"total": "2995643219968", "used": "2995643219968"}, "space_path": "/dev/vg1", "spares": [], "status": "normal", "suggestions": [], "timebackup": False, "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": False, "errCode": 53504, "stopService": False, }, "remove": { "can_do": False, "errCode": 53504, "stopService": False, }, "resize": { "can_do": False, "errCode": 53504, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, }, ], "volumes": [ { "atime_checked": False, "atime_opt": "relatime", "cacheStatus": "", "can_do": {"delete": True}, "container": "internal", "desc": "Volume_Diskgroep2", "device_type": "shr_without_disk_protect", "disk_failure_number": 0, "disks": [], "drive_type": 0, "eppool_used": "0", "exist_alive_vdsm": False, "fs_type": "ext4", "id": "volume_2", "is_acting": False, "is_actioning": False, "is_inode_full": False, "is_scheduled": False, "is_writable": True, "last_done_time": 0, "limited_disk_number": 12, "max_fs_size": "17577577283584", "next_schedule_time": 0, "num_id": 2, "pool_path": "reuse_2", "progress": {"percent": "-1", "step": "none"}, "raidType": "multiple", "scrubbingStatus": "", "size": { "free_inode": "121689412", "total": "1964124495872", "total_device": "1995435933696", "total_inode": "121798656", "used": "1684179374080", }, "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [], "timebackup": False, "used_by_gluster": False, "vol_path": "/volume2", "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": False, "errCode": 53504, "stopService": False, }, "remove": { "can_do": False, "errCode": 53504, "stopService": False, }, "resize": { "can_do": False, "errCode": 53504, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, }, { "atime_checked": False, "atime_opt": "relatime", "cacheStatus": "", "can_do": {"delete": True}, "container": "internal", "desc": "Volume_Diskgroep1", "device_type": "shr_without_disk_protect", "disk_failure_number": 0, "disks": [], "drive_type": 0, "eppool_used": "0", "exist_alive_vdsm": False, "fs_type": "ext4", "id": "volume_1", "is_acting": False, "is_actioning": False, "is_inode_full": False, "is_scheduled": False, "is_writable": True, "last_done_time": 0, "limited_disk_number": 12, "max_fs_size": "17581339574272", "next_schedule_time": 0, "num_id": 1, "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "multiple", "scrubbingStatus": "", "size": { "free_inode": "182794183", "total": "2948623499264", "total_device": "2995630637056", "total_inode": "182845440", "used": "2710796488704", }, "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [{"str": "volume_usage_suggestion", "type": "warning"}], "timebackup": False, "used_by_gluster": False, "vol_path": "/volume1", "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": False, "errCode": 53504, "stopService": False, }, "remove": { "can_do": False, "errCode": 53504, "stopService": False, }, "resize": { "can_do": False, "errCode": 53504, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, }, ], }, "success": True, } DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL = { "data": { "disks": [ {"id": "test_disk"}, { "adv_progress": "", "adv_status": "normal", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS918+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sda", "disable_secera": False, "diskType": "SATA", "disk_code": "ironwolf", "erase_time": 448, "exceed_bad_sector_thr": False, "firm": "SC60", "has_system": True, "id": "sda", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 1", "model": "ST4000VN008-2DR166 ", "name": "Drive 1", "num_id": 1, "order": 1, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "ZDH4LYTS", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 24, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "Seagate", }, { "adv_progress": "", "adv_status": "normal", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS918+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdb", "disable_secera": False, "diskType": "SATA", "disk_code": "ironwolf", "erase_time": 448, "exceed_bad_sector_thr": False, "firm": "SC60", "has_system": True, "id": "sdb", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 2", "model": "ST4000VN008-2DR166 ", "name": "Drive 2", "num_id": 2, "order": 2, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "ZDH4LS72", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 24, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "Seagate", }, { "adv_progress": "", "adv_status": "normal", "below_remain_life_thr": False, "compatibility": "disabled", "container": { "order": 0, "str": "DS918+", "supportPwrBtnDisable": False, "type": "internal", }, "device": "/dev/sdc", "disable_secera": False, "diskType": "SATA", "disk_code": "ironwolf", "erase_time": 452, "exceed_bad_sector_thr": False, "firm": "SC60", "has_system": True, "id": "sdc", "ihm_testing": False, "is4Kn": False, "isSsd": False, "isSynoPartition": True, "is_erasing": False, "longName": "Drive 3", "model": "ST4000VN008-2DR166 ", "name": "Drive 3", "num_id": 3, "order": 3, "overview_status": "normal", "pciSlot": -1, "perf_testing": False, "portType": "normal", "remain_life": -1, "remote_info": {"compatibility": "disabled", "unc": 0}, "serial": "ZDH4LQ1H", "size_total": "4000787030016", "smart_progress": "", "smart_status": "normal", "smart_test_limit": 0, "smart_testing": False, "status": "normal", "support": False, "temp": 23, "testing_progress": "", "testing_type": "", "tray_status": "join", "unc": 0, "used_by": "reuse_1", "vendor": "Seagate", }, ], "env": { "batchtask": {"max_task": 64, "remain_task": 64}, "bay_number": "4", "data_scrubbing": { "sche_enabled": "0", "sche_status": "disabled", }, "ebox": [], "fs_acting": False, "isSyncSysPartition": False, "is_space_actioning": False, "isns": {"address": "", "enabled": False}, "isns_server": "", "max_fs_bytes": "118747255799808", "max_fs_bytes_high_end": "219902325555200", "model_name": "DS918+", "ram_enough_for_fs_high_end": False, "ram_size": 4, "ram_size_required": 32, "showpooltab": False, "status": { "system_crashed": False, "system_need_repair": False, }, "support": { "ebox": True, "raid_cross": True, "sysdef": True, }, "support_fit_fs_limit": True, "unique_key": UNIQUE_KEY, "volume_full_critical": 0.1, "volume_full_warning": 0.2, }, "hotSpareConf": {"cross_repair": True, "disable_repair": []}, "hotSpares": [], "iscsiLuns": [], "iscsiTargets": [], "ports": [], "ssdCaches": [], "storagePools": [ { "cacheStatus": "", "can_do": { "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "migrate": {"to_raid5+spare": "1-1", "to_raid6": 1}, "raid_cross": True, }, "container": "internal", "deploy_path": "volume_1", "desc": "Situé sur Groupe de stockage 1, RAID 5", "device_type": "raid_5", "disk_failure_number": 0, "disks": ["sda", "sdb", "sdc"], "drive_type": 0, "id": "reuse_1", "is_actioning": False, "is_scheduled": False, "is_writable": True, "last_done_time": 1551201018, "limited_disk_number": 24, "maximal_disk_size": "0", "minimal_disk_size": "4000681164800", "next_schedule_time": 0, "num_id": 1, "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "single", "raids": [ { "designedDiskCount": 3, "devices": [ { "id": "sdc", "slot": 2, "status": "normal", }, { "id": "sdb", "slot": 1, "status": "normal", }, { "id": "sda", "slot": 0, "status": "normal", }, ], "hasParity": True, "minDevSize": "4000681164800", "normalDevCount": 3, "raidPath": "/dev/md2", "raidStatus": 1, "spares": [], } ], "scrubbingStatus": "no_action", "size": { "total": "7991698522112", "used": "7991698522112", }, "space_path": "/dev/md2", "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [], "timebackup": False, "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": True, "errCode": 0, "stopService": True, }, "remove": { "can_do": True, "errCode": 0, "stopService": False, }, "resize": { "can_do": True, "errCode": 0, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, } ], "volumes": [ {"id": "test_volume"}, { "atime_checked": False, "atime_opt": "relatime", "cacheStatus": "", "can_do": { "data_scrubbing": True, "delete": True, "expand_by_disk": 1, "migrate": {"to_raid5+spare": "1-1", "to_raid6": 1}, "raid_cross": True, }, "container": "internal", "deploy_path": "volume_1", "desc": "Situé sur Groupe de stockage 1, RAID 5", "device_type": "raid_5", "disk_failure_number": 0, "disks": [], "drive_type": 0, "eppool_used": "0", "exist_alive_vdsm": False, "fs_type": "btrfs", "id": "volume_1", "is_acting": False, "is_actioning": False, "is_inode_full": False, "is_scheduled": False, "is_writable": True, "last_done_time": 1551201018, "limited_disk_number": 24, "max_fs_size": "1152921504606846976", "next_schedule_time": 0, "num_id": 1, "pool_path": "reuse_1", "progress": {"percent": "-1", "step": "none"}, "raidType": "single", "scrubbingStatus": "no_action", "size": { "free_inode": "0", "total": "7672030584832", "total_device": "7991698522112", "total_inode": "0", "used": "4377452806144", }, "ssd_trim": {"support": "not support"}, "status": "normal", "suggestions": [], "timebackup": False, "used_by_gluster": False, "vol_path": "/volume1", "vspace_can_do": { "drbd": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, "flashcache": { "apply": { "can_do": True, "errCode": 0, "stopService": True, }, "remove": { "can_do": True, "errCode": 0, "stopService": False, }, "resize": { "can_do": True, "errCode": 0, "stopService": False, }, }, "snapshot": { "resize": { "can_do": False, "errCode": 53504, "stopService": False, } }, }, }, ], }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_6/surveillance_station/000077500000000000000000000000001467623651400254745ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/surveillance_station/__init__.py000066400000000000000000000000561467623651400276060ustar00rootroot00000000000000"""DSM 6 SYNO.SurveillanceStation.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_6/surveillance_station/const_6_api_info.py000066400000000000000000004367341467623651400313060ustar00rootroot00000000000000"""DSM 6 SYNO.API.Info data with surveillance surppot.""" DSM_6_API_INFO = { "data": { "SYNO.API.Auth": {"maxVersion": 6, "minVersion": 1, "path": "auth.cgi"}, "SYNO.API.Encryption": { "maxVersion": 1, "minVersion": 1, "path": "encryption.cgi", }, "SYNO.API.Info": {"maxVersion": 1, "minVersion": 1, "path": "query.cgi"}, "SYNO.API.OTP": {"maxVersion": 1, "minVersion": 1, "path": "otp.cgi"}, "SYNO.AntiVirus.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.FileExt": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.General": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.Quarantine": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.Scan": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AntiVirus.WhiteList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioPlayer": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioPlayer.Stream": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.Album": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/album.cgi", }, "SYNO.AudioStation.Artist": { "maxVersion": 4, "minVersion": 1, "path": "AudioStation/artist.cgi", }, "SYNO.AudioStation.Browse.Playlist": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.Composer": { "maxVersion": 2, "minVersion": 1, "path": "AudioStation/composer.cgi", }, "SYNO.AudioStation.Cover": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/cover.cgi", }, "SYNO.AudioStation.Download": { "maxVersion": 1, "minVersion": 1, "path": "AudioStation/download.cgi", }, "SYNO.AudioStation.Folder": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/folder.cgi", }, "SYNO.AudioStation.Genre": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/genre.cgi", }, "SYNO.AudioStation.Info": { "maxVersion": 4, "minVersion": 1, "path": "AudioStation/info.cgi", }, "SYNO.AudioStation.Lyrics": { "maxVersion": 2, "minVersion": 1, "path": "AudioStation/lyrics.cgi", }, "SYNO.AudioStation.LyricsSearch": { "maxVersion": 2, "minVersion": 1, "path": "AudioStation/lyrics_search.cgi", }, "SYNO.AudioStation.MediaServer": { "maxVersion": 1, "minVersion": 1, "path": "AudioStation/media_server.cgi", }, "SYNO.AudioStation.Pin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.Playlist": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/playlist.cgi", }, "SYNO.AudioStation.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "AudioStation/proxy.cgi", }, "SYNO.AudioStation.Radio": { "maxVersion": 2, "minVersion": 1, "path": "AudioStation/radio.cgi", }, "SYNO.AudioStation.RemotePlayer": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/remote_player.cgi", }, "SYNO.AudioStation.RemotePlayerStatus": { "maxVersion": 1, "minVersion": 1, "path": "AudioStation/remote_player_status.cgi", }, "SYNO.AudioStation.Search": { "maxVersion": 1, "minVersion": 1, "path": "AudioStation/search.cgi", }, "SYNO.AudioStation.Song": { "maxVersion": 3, "minVersion": 1, "path": "AudioStation/song.cgi", }, "SYNO.AudioStation.Stream": { "maxVersion": 2, "minVersion": 1, "path": "AudioStation/stream.cgi", }, "SYNO.AudioStation.Tag": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.VoiceAssistant.Browse": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.VoiceAssistant.Challenge": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.VoiceAssistant.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.VoiceAssistant.Stream": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioStation.WebPlayer": { "maxVersion": 1, "minVersion": 1, "path": "AudioStation/web_player.cgi", }, "SYNO.Backup.App": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Backup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Restore": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App2.Backup": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App2.Restore": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Backup": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Restore": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Lunbackup": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Repository": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Repository.Certificate": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Restore": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Server": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.NetworkBackup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.TimeBackup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Share.Restore": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Source.Folder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.AmazonCloudDrive.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Azure.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Connect.Network": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Dropbox.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.GoogleDrive.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.HiDrive.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.OpenStack.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.OpenStack.Region": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.S3.Bucket": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Share.Local": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Share.Network": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.Share.Rsync": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.WebDAV.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Storage.hubiC.Container": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Target.Config": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Task": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Version": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Version.History": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.AuthForeign": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Cal": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Chatbot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Event": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.InviteMail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.InviteMailInit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.SendMail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Share.Priv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Sharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.SyncUser": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Timezone": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Cal.Todo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.CloudSync": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ACL": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.AccessControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.ReverseProxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.App": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.Rule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Cache": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Policy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.ServerInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CRT": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CSR": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CurrentConnection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.ExtIP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Provider": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Record": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Synology": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.TWNIC": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DSMNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect.Application": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Defs": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Initdata": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.JSUIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.SessionData": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.UIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Azure.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.ADHealthCheck": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.BaseDN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Login.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.utils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.WebSphere.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.EventScheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.DefaultPermission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.BonjourSharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Driver": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network.Host": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.OAuth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.EUnit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.eSATA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.UPS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.EzInternet": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Factory.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Factory.Manutild": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.AFP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.ChrootUser": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.SFTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.Security": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.AdvancedSetting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.IDMap": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.Kerberos": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.SharePrivilege": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ReflinkCopy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.Rsync.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.SMB": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ServiceDiscovery": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ServiceDiscovery.WSTransfer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Findhost": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.ExtraAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.Member": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.ValidLocalAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.GroupSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.BeepControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.DCOutput": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.DCOutput.Task": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.FanSpeed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Hibernation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.LCM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Led.Brightness": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.MemoryLayout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.NeedReboot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerRecovery": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerSchedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.RemoteFanStatus": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.SpectreMeltdown": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.VideoTranscoding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.ZRAM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Help": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.LUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Lunbkp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Replication": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Target": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.VLUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.IndexFolder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.MediaConverter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.MobileEnabled": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.ThumbnailQuality": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Authentication": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Authentication.Cert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bond": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bridge": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.ClientList": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.PXE": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.Reservation": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.Vendor": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.DHCPServer.WPAD": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Ethernet": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router.Prefix": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6Tunnel": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Interface": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.LocalBridge": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.MACClone": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.OVS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE.Relay": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.ConnectionList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.CountryCode": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.DMZ": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Gateway.List": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.LocalLan": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.MacFilter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.ParentalControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.PkgList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.PortForward": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Static.Route": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Topology": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.RouterRules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.UPnPServer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.USBModem": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.L2TP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN.CA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPNWithConf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPNWithConf.Certs": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.PPTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.WOL": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.Hotspot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Wifi.WPS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.NormalUser": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.NormalUser.LoginNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.CustomizedData": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.FilterSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.Variables": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.WarningPercentage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Auth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.AuthToken": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Provider": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OAuth.Scope": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OAuth.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Admin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.EnforcePolicy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Control": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.FakeIFrame": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Feed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Feed.Keyring": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.MyDS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.MyDS.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Screenshot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Screenshot.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Server": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting.Update": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Thumb": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Uninstallation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Event": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Filter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.android": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.iOS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.windows": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PhotoViewer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Polling.Data": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Compatibility": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterConf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.UserDataCollector": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Upnp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickStart.Info": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickStart.Install": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Quota": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.Language": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.DateTimeFormat": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SNMP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Embed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DoS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Adapter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Geoip": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Profile.Apply": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.VPNPassthrough": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.VPNPassthrough.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Operation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.PortInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto.Key": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.CryptoFile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.AutoKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.Key": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.MachineKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.Store": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration.Task": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Snapshot": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Initdata": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Session": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Trusted": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Untrusted": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Disk": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Pool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSILUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSITargets": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSIUtils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Form": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Synohdpack": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.FileTransfer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.PersonalActivity": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Setting.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Process": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ProcessGroup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ResetButton": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Utilization": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TFTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TaskScheduler": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Terminal": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.AppPortalLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Desktop": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.FileSharingLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TrustDevice": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Tuned": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UISearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.AutoUpgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Patch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.PreCheck": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Setting": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Home": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordConfirm": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordExpiry": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordMeter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordPolicy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UserSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Virtualization.Host.Capability": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM.External": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.Security.HTTPCompression": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.Security.TLSProfile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node.Credential": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node.Session": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.FindMe": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Info": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Network": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.PortEnable": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.PushNotification": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Retention": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request.Polling": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.BackgroundTask": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CheckExist": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CheckPermission": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Compress": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CopyMove": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CreateFolder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Delete": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.DirSize": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.External.GoogleDrive": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Extract": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Favorite": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.FormUpload": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Info": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.MD5": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Mount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Mount.List": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.ACLOwner": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.CompressSize": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.Mtime": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Rename": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Search": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Search.History": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Sharing": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Sharing.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Snapshot": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Thumb": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.UIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Upload": { "maxVersion": 3, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.UserGrp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Connection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.GDrive": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VirtualFolder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.AppIndexing.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Bookmark": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.SearchHistory": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.Spotlight": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File.Cover": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Folder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Highlight": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Indicate": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Preference": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.UserGrp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.Thumb": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.License.HA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Common": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Package": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Contacts": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Application.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.MailAccount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.MailAccount.Contacts": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.MailAccount.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Device": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Event": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Filter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.GDPR": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Identifier": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Mobile": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Settings": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Notification.VapidPublicKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Profile": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Personal.Profile.Photo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Album": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Category": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Concept": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Diff": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Folder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.GeneralTag": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Geocoding": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Item": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Person": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.RecentlyAdded": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Timeline": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Browse.Unit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Discover.Category": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Discover.Similar": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Discover.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Discover.Style": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Enhancement": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Index": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Search": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Setting.Admin": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Setting.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Setting.User": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Sharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.SharingLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Streaming": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Photo.Upload.Item": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Album": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Category": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Concept": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Diff": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Folder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.GeneralTag": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Geocoding": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Item": { "maxVersion": 3, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Person": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.RecentlyAdded": { "maxVersion": 3, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Timeline": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Browse.Unit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Discover.Category": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Discover.Similar": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Discover.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Discover.Style": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Enhancement": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Index": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Search": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Setting.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Sharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Streaming": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PhotoTeam.Upload.Item": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.EventRule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client.Job": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server.Pair": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SAS.APIRunner": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SAS.APIRunner.Chatbot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SAS.Encryption": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SAS.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SAS.Group.Members": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SAS.Guest": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Common.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Common.Statistic": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Common.Target": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Common.Version": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Explore.File": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Explore.Folder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Explore.Job": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Explore.Target": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Explore.Version": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SDS.Backup.Client.Fuse.Target": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Checklist": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Checklist.Alert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Location": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.LoginActivity": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Report": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Report.HTML": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ShareLink.Action": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ShareLink.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ShareLink.Manage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Snap.Usage.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Check": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.DualEnclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Enclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Flashcache": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.HddMan": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Pool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Smart": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Smart.Scheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Spare": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Spare.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Storage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.TaipeiEnclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.ActionRule": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.AddOns": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Alert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Alert.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Analytics.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.AppCenter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Archiving.Pull": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Archiving.Push": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.AudioOut": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.AudioPattern": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.AudioStream": { "maxVersion": 2, "minVersion": 1, "path": "SurveillanceStation/audioStreaming.cgi", }, "SYNO.SurveillanceStation.AxisAcsCtrler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.AxisAcsCtrler.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CMS.DsSearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CMS.Failover": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CMS.GetDsStatus": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CMS.SlavedsList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CMS.SlavedsWizard": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera": { "maxVersion": 9, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Event": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Export": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Import": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Intercom": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Status": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.VolEval": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Camera.Wizard": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.CameraCap": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Device": { "maxVersion": 2, "minVersion": 1, "path": "SurveillanceStation/device.cgi", }, "SYNO.SurveillanceStation.DigitalOutput": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.DualAuth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Emap": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Emap.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Event": { "maxVersion": 5, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Event.Export": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Event.Mount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Event.Mount.Wizard": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.ExternalDevice.IFTTT": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.ExternalDevice.Storage.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.ExternalDevice.Webhook": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.ExternalEvent": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.ExternalRecording": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Fisheye": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.GlobalSearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Help": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.HomeMode": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.HomeMode.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IOModule": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IOModule.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IPSpeaker": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IPSpeaker.Broadcast": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IPSpeaker.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IPSpeaker.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA.Archive": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA.License": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA.Recording": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA.Report": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA.Simulator": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.IVA.TaskGroup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Info": { "maxVersion": 8, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.JoystickSetting": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Layout": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.License": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.LocalDisplay": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Log": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.MobileCam": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification": { "maxVersion": 8, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.Email": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.Filter": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.MobileSetting": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.PushService": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.SMS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.SMS.ServiceProvider": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Notification.Schedule": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.PTZ": { "maxVersion": 5, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.PTZ.Patrol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.PTZ.Preset": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.PersonalSettings.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.PersonalSettings.Layout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.PersonalSettings.Photo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Player": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Player.LiveviewSrc": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Preload": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording": { "maxVersion": 6, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording.Bookmark": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording.Export": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording.Mount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording.Mount.Wizard": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording.Reindex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Recording.ShareRecording": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.RecordingPicker": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.SnapShot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Sort": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Stream": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Stream.VideoStreaming": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Streaming": { "maxVersion": 2, "minVersion": 1, "path": "SurveillanceStation/streaming.cgi", }, "SYNO.SurveillanceStation.System": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.TaskQueue": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.TimeLapse": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.TimeLapse.Recording": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Transactions.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Transactions.Transaction": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.UserPrivilege": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.VideoStream": { "maxVersion": 1, "minVersion": 1, "path": "SurveillanceStation/videoStreaming.cgi", }, "SYNO.SurveillanceStation.VideoStreaming": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.VisualStation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.VisualStation.Install": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.VisualStation.Layout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.VisualStation.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.Webhook": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SurveillanceStation.YoutubeLive": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.AdvanceSharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.AdvanceSharing.Public": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.AppIntegration": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Authentication": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Connection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.DBUsage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.DSM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Export": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Files": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.KeyManagement": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Labels": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Metrics": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Metrics.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Migration": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Node.Delete": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Node.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Node.Restore": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Notifications": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Office": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Photos": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Privilege": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Revisions": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.SCIM.Photo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.SCIM.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Services.DocumentViewer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Services.SynologyChat": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Services.VideoStation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Shard": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Share.Priv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Sharing": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.String": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Tasks": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.TeamFolders": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Trash": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Users": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDrive.Webhooks": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDriveShareSync.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDriveShareSync.Connection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDriveShareSync.Session": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SynologyDriveShareSync.Session.Set": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Utils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.VideoPlayer.Subtitle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.VideoPlayer.SynologyDrive.Subtitle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.WebDAV.CalDAV": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.WebDAV.CalDAV.Calendar": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.WebDAV.Common": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, }, "success": True, } const_6_surveillance_station_camera.py000066400000000000000000001116471467623651400352010ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/surveillance_station"""DSM 6 SYNO.SurveillanceStation.Camera data.""" DSM_6_SURVEILLANCE_STATION_CAMERA_LIST = { "data": { "cameras": [ { "ADCap": 0, "AppList": [], "DINum": 0, "DONum": 0, "MDCap": 0, "MDModeList": [0, 1], "PDCap": 0, "PDDepend": 0, "TDCap": 0, "advLiveMinDuration": 10, "advLiveProfile": 1, "advLiveTrigAuto": False, "advLiveTrigEvt": "10000000000000000000000000000000000000000000000000000000000000000000000000000000", "advLiveTrigSingle": True, "analyticsType": 0, "application": False, "audioCap": False, "audioOut": False, "audioType": 6, "autoFocus": False, "autoPan": 0, "auto_restart_interval": 0, "blAudioDisableRec": False, "blAudioPriv": True, "blDisableRec": False, "blEnableExtDI": False, "blEnableLiveBuffering": False, "blG726LE": False, "blLiveviewPriv": True, "blPresetSpeed": False, "blPtzShowIcon": False, "blReceivePocZero": False, "blThirdStream": True, "calling_notify_ado_src_id": 0, "calling_notify_duration": 0, "camIdOnRecServer": 0, "camLiveMode": 0, "camMobileLiveMode": 0, "camMountType": 0, "camRecShare": "surveillance", "camRecShareMountType": 0, "camRecSharePath": "/volume1/surveillance", "camRecStorageStatus": 0, "camRecVolume": "/volume1", "camRotOption": 0, "camStatus": 1, "channel_id": "1", "daybegin": 8, "dayend": 18, "defLiveProfile": 1, "deleted": False, "detailInfo": { "advContMinDuration": 10, "advContTrigEvt": "10000000000000000000000000000000000000000000000000000000000000000000000000000000", "advLiveMinDuration": 10, "advLiveTrigAuto": False, "advLiveTrigEvt": "10000000000000000000000000000000000000000000000000000000000000000000000000000000", "advLiveTrigSingle": True, "blAudioDisableRec": False, "blDisableRec": False, "blEnableExtDI": False, "blThirdStreamProfile": True, "camApplyCodecOptimization": False, "camApplyKeyFrameInterval": False, "camAudioType": 6, "camChannel": "1", "camCodecOptimization": "", "camDeviceType": 1, "camDynamicFps": False, "camDynamicGop": False, "camFirmware": "", "camFolder": "Camera1", "camFov": "", "camFps": "", "camIP": "192.168.1.101", "camIsRotByDate": True, "camIsRotBySpace": False, "camIsSetEvtPrefix": False, "camIsSetRecFolder": False, "camKeyFrameInterval": -1, "camLastKeyFrameInterval": -1, "camLiveAvgBitrate": 1000, "camLiveBitrateCtrl": 0, "camLiveCbrBitrate": 1000, "camLiveFps": "", "camLiveMode": 0, "camLiveQuality": "", "camLiveResolution": "1920x1080", "camLiveSmartBitrateCtrl": 0, "camLiveStreamNo": 0, "camMobileAvgBitrate": 1000, "camMobileBitrateCtrl": 0, "camMobileCbrBitrate": 1000, "camMobileFps": "", "camMobileLiveMode": 0, "camMobileQuality": "", "camMobileResolution": "1920x1080", "camMobileSmartBitrateCtrl": 0, "camMobileStreamNo": 0, "camModel": "", "camMountType": 0, "camName": "Camera1", "camPassWord": "########", "camPort": 554, "camPostRecTime": 5, "camPreRecTime": 5, "camPrefix": "Camera1", "camQuality": "", "camRecAvgBitrate": 1000, "camRecBitrateCtrl": 0, "camRecCbrBitrate": 1000, "camRecShare": "surveillance", "camRecSharePath": "/volume1/surveillance", "camRecSmartBitrateCtrl": 0, "camRecStorageStatus": 0, "camRecStreamNo": 0, "camRecTime": 30, "camResolution": "1920x1080", "camRotByDate": 30, "camRotBySpace": 10, "camRotOption": 0, "camRtspKeepAlive": 1, "camRtspProtocol": 4, "camSchedule": [ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], ], "camServer": 0, "camSourcePath": "/live", "camSourceType": 1, "camTvStandard": 0, "camUserName": "cam1", "camVendor": "User Define", "camVideoMode": "", "camVideoType": "H.264", "custom1DIDetect": 0, "custom1Detect": 1, "custom2DIDetect": 0, "custom2Detect": 1, "edgeStgDownloadSch": [ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], ], "edgeStgEnabled": False, "edgeStgPostRecTime": 5, "edgeStgPreRecTime": 5, "edgeStgRecDays": 127, "edgeStgRecMode": 1, "edgeStgRecStartTime": "00:00", "edgeStgRecStopTime": "00:00", "edgeStgRecTime": 60, "edgeStgRetEnabled": False, "edgeStgRetrieveAction": 2, "enableAdvCont": False, "enableAdvLive": False, "enableAutoLiveProfile": False, "enablePtzControl": True, "extDIDev": 0, "extDIPorts": -1, "extraDataSrc": 0, "informationHint": "", "isRemovableLens": False, "pairedSpeakerEnabled": False, "pairedSpeakerId": 0, "profileSettingList": "1,1,1,1,1,1,1,1,1,1,1,1", }, "deviceType": 1, "doorbellNum": 0, "dsIp": "", "dsPort": 7850, "enableAdvLive": False, "enableAutoLiveProfile": False, "enableMulticast": False, "enableMulticastMobile": False, "enablePtzControl": True, "enable_calling_notify": False, "enabled": True, "exposure_control": 6, "exposure_mode": 4, "extDIDev": 0, "extDIPorts": -1, "feRegionList": [], "firmware": "", "fisheyeDispMode": "", "fisheyeParam": {}, "folder": "/volume1/surveillance/Camera1", "forceEnableMulticast": False, "fps": 0, "hasCamParam": False, "host": "192.168.1.101", "id": 1, "isStatusUnrecognized": False, "is_rotated_by_date": True, "is_rotated_by_space": False, "last_restart_time": "2020-03-27T07:00:07Z", "last_sync_time": "2020-03-27T07:00:07Z", "ledCap": False, "liveBufferingSec": 1, "model": "Define", "multiDI": False, "multicastAudioPort": 0, "multicastAudioPortMobile": 0, "multicastGrpAddr": "", "multicastGrpAddrMobile": "", "multicastVideoPort": 0, "multicastVideoPortMobile": 0, "mute": False, "name": "Camera1", "objTrack": False, "osd_format": 0, "osd_position": 6, "osd_status": True, "ownerDsId": 0, "pairedSpeakerEnabled": False, "pairedSpeakerId": 0, "param_chklist": 0, "period_sync_time_hour": 0, "port": 554, "presetNum": 0, "privilege": 31, "profileSettingList": "1,1,1,1,1,1,1,1,1,1,1,1", "ptzCap": 0, "ptzContinuous": 0, "ptzDirection": 0, "quality": "", "recBitrateCtrl": 0, "recCbrBitrate": 1000, "recStatus": 1, "relayPortList": [], "resolution": "1920x1080", "restart_day": 0, "rotation_by_date": 30, "rotation_by_space": "10", "rotation_option": 0, "rtspPathTimeout": 0, "setDICap": False, "setDOCap": False, "singleStream": False, "snapshot_path": "/webapi/entry.cgi?api=SYNO.SurveillanceStation.Camera&method=GetSnapshot&version=1&cameraId=1×tamp=1592532741&preview=true", "speedDryCap": False, "status": 0, "status_flags": 0, "stmFisheyeType": 0, "stm_info": [ { "camPath": "camPath", "fps": 0, "quality": "", "resolution": "1920x1080", "stmNo": 1, "type": 0, }, { "camPath": "camPath", "fps": 0, "quality": "", "resolution": "1920x1080", "stmNo": 1, "type": 1, }, { "camPath": "camPath", "fps": 0, "quality": "", "resolution": "1920x1080", "stmNo": 1, "type": 2, }, ], "time_server": "", "tvStandard": 0, "type": 3, "uiStmNoList": "1,1,1", "update_time": 14630, "vendor": "User", "videoCapList": [ {"stList": ["RTSP"], "vt": "H.264"}, {"stList": ["RTSP"], "vt": "MPEG4"}, {"stList": ["HTTP"], "vt": "MJPEG"}, {"stList": ["RTSP"], "vt": "H.265"}, {"stList": ["RTSP"], "vt": "H.264+"}, {"stList": ["RTSP"], "vt": "H.265+"}, ], "videoMode": "", "video_flip": True, "video_mirror": True, "video_rotation": 0, "volume": 50, "volume_space": "460.402", "wiperCap": False, } ], "delcam": [], "existCamMntTypeMap": None, "keyTotalCnt": 2, "keyUsedCnt": 1, "timestamp": "1592532741", "total": 1, }, "success": True, } DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MOTION_ENUM = { "data": { "DVAParam": None, "MDParam": { "camRoi": {"channel": "", "type": 0}, "enhanceMDWithPD": {"value": False}, "history": { "camCap": False, "maxValue": 99, "minValue": 1, "ssCap": False, "value": 90, }, "keep": True, "mode": 0, "objectSize": { "camCap": False, "maxValue": 99, "minValue": 1, "ssCap": False, "value": 50, }, "percentage": { "camCap": False, "maxValue": 99, "minValue": 1, "ssCap": False, "value": 50, }, "region": "000000000000000000000000000000000000000001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100111111111111111111111111111111111111110011111111111111111111111111111111111111001111111111111111111111111111111111111100000000000000000000000000000000000000000", "relatedEvents": [], "sensitivity": { "camCap": False, "maxValue": 99, "minValue": 1, "ssCap": True, "value": 90, }, "shortLiveSecond": {"camCap": False, "ssCap": True, "value": 0}, "source": 1, "threshold": { "camCap": False, "maxValue": 99, "minValue": 1, "ssCap": True, "value": 10, }, }, "PDParam": { "keep": True, "sensitivity": {"cap": False, "maxValue": 0, "minValue": 0, "value": 0}, "source": -1, "triggerMotion": False, }, }, "success": True, } DSM_6_SURVEILLANCE_STATION_CAMERA_EVENT_MD_PARAM_SAVE = { "data": {"camId": 1}, "success": True, } DSM_6_SURVEILLANCE_STATION_CAMERA_GET_LIVE_VIEW_PATH = { "data": [ { "id": 1, "mjpegHttpPath": 'http://192.168.1.100:5000/webapi/entry.cgi?api=SYNO.SurveillanceStation.Stream.VideoStreaming&version=1&method=Stream&format=mjpeg&cameraId=1&StmKey="stmkey1234567890"', "multicstPath": "rtsp://syno:stmkey1234567890@192.168.1.100:554/Sms=1.multicast", "mxpegHttpPath": 'http://192.168.1.100:5000/webapi/entry.cgi?api=SYNO.SurveillanceStation.Stream.VideoStreaming&version=1&method=Stream&format=mxpeg&cameraId=1&StmKey="stmkey1234567890"', "rtspOverHttpPath": "rtsp://192.168.1.100:5000/webman/3rdparty/SurveillanceStation/cgi/rtsp.cgi?Sms=1.unicast&DsId=0&StmKey=stmkey1234567890", "rtspPath": "rtsp://syno:stmkey1234567890@192.168.1.100:554/Sms=1.unicast", } ], "success": True, } DSM_6_SURVEILLANCE_STATION_CAMERA_ENABLE = {"success": True} DSM_6_SURVEILLANCE_STATION_CAMERA_DISABLE = {"success": True} const_6_surveillance_station_home_mode.py000066400000000000000000000101501467623651400356700ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_6/surveillance_station"""DSM 6 SYNO.API.SurveillanceStation.HomeMode data.""" DSM_6_SURVEILLANCE_STATION_HOME_MODE_GET_INFO = { "data": { "actrule_on": False, "actrules": "-1", "cameras": "-1", "custom1_det": 1, "custom1_di": 1, "custom2_det": 1, "custom2_di": 1, "geo_delay_time": 60, "geo_lat": 12.00000, "geo_lng": -12.00000, "geo_radius": 100, "io_modules": "", "last_update_time": 0, "mode_schedule": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "mode_schedule_next_time": -1, "mode_schedule_on": True, "notify_event_list": [ {"eventGroupType": 2, "eventType": 3, "filter": 4}, {"eventGroupType": 2, "eventType": 4, "filter": 4}, {"eventGroupType": 2, "eventType": 5, "filter": 0}, {"eventGroupType": 2, "eventType": 6, "filter": 0}, {"eventGroupType": 2, "eventType": 7, "filter": 0}, {"eventGroupType": 2, "eventType": 10, "filter": 0}, {"eventGroupType": 2, "eventType": 11, "filter": 4}, {"eventGroupType": 2, "eventType": 12, "filter": 0}, {"eventGroupType": 2, "eventType": 13, "filter": 0}, {"eventGroupType": 2, "eventType": 14, "filter": 0}, {"eventGroupType": 2, "eventType": 15, "filter": 0}, {"eventGroupType": 1, "eventType": 28, "filter": 4}, {"eventGroupType": 1, "eventType": 29, "filter": 4}, {"eventGroupType": 1, "eventType": 32, "filter": 4}, {"eventGroupType": 1, "eventType": 33, "filter": 4}, {"eventGroupType": 1, "eventType": 34, "filter": 4}, {"eventGroupType": 8, "eventType": 35, "filter": 0}, {"eventGroupType": 8, "eventType": 36, "filter": 0}, {"eventGroupType": 8, "eventType": 37, "filter": 0}, {"eventGroupType": 8, "eventType": 38, "filter": 0}, {"eventGroupType": 8, "eventType": 39, "filter": 0}, {"eventGroupType": 8, "eventType": 40, "filter": 0}, {"eventGroupType": 8, "eventType": 41, "filter": 0}, {"eventGroupType": 8, "eventType": 42, "filter": 0}, {"eventGroupType": 8, "eventType": 43, "filter": 0}, {"eventGroupType": 8, "eventType": 44, "filter": 0}, {"eventGroupType": 1, "eventType": 45, "filter": 0}, {"eventGroupType": 2, "eventType": 62, "filter": 0}, {"eventGroupType": 2, "eventType": 63, "filter": 0}, {"eventGroupType": 2, "eventType": 64, "filter": 0}, {"eventGroupType": 2, "eventType": 65, "filter": 0}, {"eventGroupType": 2, "eventType": 66, "filter": 0}, {"eventGroupType": 12, "eventType": 82, "filter": 0}, {"eventGroupType": 12, "eventType": 83, "filter": 0}, {"eventGroupType": 1, "eventType": 90, "filter": 0}, ], "notify_on": True, "on": True, "onetime_disable_on": False, "onetime_disable_time": 0, "onetime_enable_on": False, "onetime_enable_time": 0, "reason": 2, "rec_sch_custom_det_app_list": [ {"custom1_app_det": 0, "custom2_app_det": 0}, {"custom1_app_det": 0, "custom2_app_det": 0}, ], "rec_schedule": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "rec_schedule_on": False, "stream_profile": "1,1,1,1,1,1", "streaming_on": False, "wifi_ssid": "SSID", }, "success": True, } DSM_6_SURVEILLANCE_STATION_HOME_MODE_SWITCH = {"success": True} py-synologydsm-api-2.5.3/tests/api_data/dsm_7/000077500000000000000000000000001467623651400212405ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_7/__init__.py000066400000000000000000000017751467623651400233630ustar00rootroot00000000000000"""DSM 7 datas.""" from .const_7_api_auth import ( DSM_7_AUTH_LOGIN, DSM_7_AUTH_LOGIN_2SA, DSM_7_AUTH_LOGIN_2SA_OTP, ) from .const_7_api_info import DSM_7_API_INFO from .core.const_7_core_external_usb import ( DSM_7_CORE_EXTERNAL_USB_DS1821_PLUS_EXTERNAL_USB, ) from .core.const_7_core_upgrade import DSM_7_CORE_UPGRADE_FALSE, DSM_7_CORE_UPGRADE_TRUE from .dsm.const_7_dsm_info import DSM_7_DSM_INFORMATION from .photos.const_7_photo import ( DSM_7_FOTO_ALBUMS, DSM_7_FOTO_ITEMS, DSM_7_FOTO_ITEMS_SEARCHED, DSM_7_FOTO_ITEMS_SHARED_ALBUM, DSM_7_FOTO_SHARED_ITEMS, ) __all__ = [ "DSM_7_AUTH_LOGIN", "DSM_7_AUTH_LOGIN_2SA", "DSM_7_AUTH_LOGIN_2SA_OTP", "DSM_7_API_INFO", "DSM_7_CORE_EXTERNAL_USB_DS1821_PLUS_EXTERNAL_USB", "DSM_7_CORE_UPGRADE_FALSE", "DSM_7_CORE_UPGRADE_TRUE", "DSM_7_DSM_INFORMATION", "DSM_7_FOTO_ALBUMS", "DSM_7_FOTO_ITEMS", "DSM_7_FOTO_ITEMS_SHARED_ALBUM", "DSM_7_FOTO_ITEMS_SEARCHED", "DSM_7_FOTO_SHARED_ITEMS", ] py-synologydsm-api-2.5.3/tests/api_data/dsm_7/const_7_api_auth.py000066400000000000000000000010651467623651400250420ustar00rootroot00000000000000"""DSM 7 SYNO.API.Auth data.""" from tests.const import ( DEVICE_TOKEN, ERROR_AUTH_OTP_NOT_SPECIFIED, SESSION_ID, SYNO_TOKEN, ) DSM_7_AUTH_LOGIN = { "data": {"is_portal_port": False, "sid": SESSION_ID, "synotoken": SYNO_TOKEN}, "success": True, } DSM_7_AUTH_LOGIN_2SA = ERROR_AUTH_OTP_NOT_SPECIFIED DSM_7_AUTH_LOGIN_2SA_OTP = { "data": { "device_id": DEVICE_TOKEN, "is_portal_port": False, "sid": SESSION_ID, "synotoken": SYNO_TOKEN, }, "success": True, } DSM_7_AUTH_LOGOUT = {"success": True} py-synologydsm-api-2.5.3/tests/api_data/dsm_7/const_7_api_info.py000066400000000000000000003047441467623651400250460ustar00rootroot00000000000000"""DSM 7 SYNO.API.Info data.""" DSM_7_API_INFO = { "data": { "SYNO.API.Auth": {"maxVersion": 7, "minVersion": 1, "path": "entry.cgi"}, "SYNO.API.Auth.Key": { "maxVersion": 7, "minVersion": 7, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.API.Auth.Key.Code": { "maxVersion": 7, "minVersion": 7, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.API.Auth.Type": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.API.Auth.UIConfig": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.API.Encryption": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.API.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.API.OTP": {"maxVersion": 1, "minVersion": 1, "path": "otp.cgi"}, "SYNO.AudioPlayer": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.AudioPlayer.Stream": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Backup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.App.Restore": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.AutoBackup": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Backup": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Config.Restore": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Backup.Service.NetworkBackup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ACL": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ActionPriv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ActionPriv.Role": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.AccessControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPortal.ReverseProxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.App": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.AppPriv.Rule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.BandwidthControl.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Cache": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Policy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.ServerInfo": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Task": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CMS.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CRT": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.CSR": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.LetsEncrypt.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Certificate.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.CurrentConnection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.ExtIP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Provider": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Record": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.Synology": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DDNS.TWNIC": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DSMNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DSMNotify.MailContent": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DSMNotify.Strings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DataCollect.Application": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Defs": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Initdata": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.JSUIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.SessionData": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.UIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Desktop.Upgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Azure.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.ADHealthCheck": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.Domain.Schedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.BaseDN": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Login.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Profile": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.Refresh": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.LDAP.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.IWA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.SSO.utils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Directory.WebSphere.SSO": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.Common": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.Debug": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.Domain": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.DomainJoin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.DomainService": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.DomainValidation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.LDAP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DirectoryServiceCheck.Progress": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.DisableAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.EventScheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Bluetooth.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.DefaultPermission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.BonjourSharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Driver": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.Network.Host": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.OAuth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Printer.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.EUnit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.USB": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.Storage.eSATA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ExternalDevice.UPS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Factory.Config": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Factory.Manutild": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileHandle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.AFP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.ChrootUser": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.SFTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.FTP.Security": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.AdvancedSetting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.IDMap": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.Kerberos": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.NFS.SharePrivilege": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ReflinkCopy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.Rsync.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.SMB": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ServiceDiscovery": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.FileServ.ServiceDiscovery.WSTransfer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Findhost": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.ExtraAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.Member": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Group.ValidLocalAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.GroupSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.BeepControl": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.FanSpeed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Hibernation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.LCM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.Led.Brightness": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.MemoryLayout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.NeedReboot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.OOBManagement": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerRecovery": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.PowerSchedule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.RemoteFanStatus": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.SpectreMeltdown": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.VideoTranscoding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Hardware.ZRAM": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Help": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.FCTarget": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Host": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.LUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Lunbkp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Replication": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.Target": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ISCSI.VMware": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.IndexFolder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.MediaConverter": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.Scheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MediaIndexing.ThumbnailQuality": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Account": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Logout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.MyDSCenter.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Authentication": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Authentication.Cert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Bond": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Ethernet": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.IPv6.Router.Prefix": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Interface": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.MACClone": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.OVS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.PPPoE.Relay": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Gateway.List": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.Router.Static.Route": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.RouterRules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.TrafficControl.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.UPnPServer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.L2TP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPN.CA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPNWithConf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.OpenVPNWithConf.Certs": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.VPN.PPTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Network.WOL": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.NormalUser": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.NormalUser.LoginNotify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.CustomizedData": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.FilterSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.Variables": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Advance.WarningPercentage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.CMS.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Auth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Mail.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.AuthToken": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.Push.Webhook.Provider": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Conf": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Notification.SMS.Provider": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OAuth.Scope": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OAuth.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Admin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.EnforcePolicy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Ex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.OTP.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.AutoUpgrade.Progress": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.CategoryImage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Control": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.FakeIFrame": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Feed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Feed.Keyring": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Installation.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.MyDS": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.MyDS.Purchase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Progress": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Screenshot": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Screenshot.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Server": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting.Update": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Setting.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Thumb": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Thumb.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Package.Uninstallation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Event": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Filter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Mobile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalNotification.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PersonalSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PhotoViewer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Polling.Data": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Compatibility": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterConf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.RouterList": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.PortForwarding.UserDataCollector": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Promotion.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Hostname": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.RegisterSite": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.SNI": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickConnect.Upnp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickStart.Info": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.QuickStart.Install": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Quota": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.RecycleBin.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.Language": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.DateTimeFormat": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Region.NTP.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.ResetAdmin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SNMP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.AutoBlock.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Embed": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DSM.Proxy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.DoS": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Adapter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Geoip": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Profile.Apply": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Security.Firewall.Rules.Serv": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Operation": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SecurityScan.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Service.PortInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Crypto.Key": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.CryptoFile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.AutoKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.Key": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.MachineKey": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.KeyManager.Store": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Migration.Task": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Permission": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.PermissionReport": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Share.Snapshot": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Initdata": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Sharing.Session": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Device": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Trusted": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.Untrusted": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SmartBlock.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Disk": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Disk.FWUpgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Pool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Storage.iSCSILUN": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Form": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SupportForm.Service": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Synohdpack": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.FileTransfer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.PersonalActivity": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Setting.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.SyslogClient.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Process": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ProcessGroup": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.ResetButton": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.SystemHealth": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.System.Utilization": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TFTP": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TaskScheduler": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Terminal": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.AppPortalLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Desktop": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.FileSharingLogin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Image": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Theme.Login": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.TrustDevice": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Tuned": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UISearch": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.AutoUpgrade": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Group.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.GroupInstall.Network": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Patch": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.PreCheck": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Server.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Upgrade.Setting": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Group": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.Home": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordConfirm": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordExpiry": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordMeter": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.User.PasswordPolicy": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.UserSettings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Virtualization.Host.Capability": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.DSM.External": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.Security.HTTPCompression": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Core.Web.Security.TLSProfile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node.Credential": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DR.Node.Session": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.FindMe": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Info": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.Network": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.PortEnable": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DSM.PushNotification": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.DisasterRecovery.Retention": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.Request.Polling": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Entry.SocketIo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.BackgroundTask": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CheckExist": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CheckPermission": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Compress": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CopyMove": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.CreateFolder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Delete": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.DirSize": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.External.GoogleDrive": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Extract": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Favorite": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.FormUpload": { "maxVersion": 2, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Info": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.MD5": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Mount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Mount.List": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Notify": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.PhotoUpload": { "maxVersion": 3, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.ACLOwner": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.CompressSize": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Property.Mtime": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Rename": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Search": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Search.History": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Sharing": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Sharing.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Snapshot": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Thumb": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Timeout": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.UIString": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.Upload": { "maxVersion": 3, "minVersion": 2, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.UserGrp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Connection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.GDrive": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Profile": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.Protocol": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VFS.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FileStation.VirtualFolder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.AppIndexing.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Bookmark": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.SearchHistory": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.Spotlight": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Elastic.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File.Cover": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.File.Thumbnail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Folder": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Highlight": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Indicate": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Search": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Status": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.FileIndexing.Term": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Preference": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.Settings": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Finder.UserGrp": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.Download": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.List": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FolderSharing.Thumb": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.BackgroundTask.File": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.BackgroundTask.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Album": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Category": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.ConditionAlbum": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Diff": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Folder": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.GeneralTag": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Geocoding": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Item": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.NormalAlbum": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Person": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.RecentlyAdded": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Timeline": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Browse.Unit": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Development.Admin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Favorite": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Index": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Migration": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Notification": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.PhotoRequest": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.PublicSharing": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Search.Filter": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Search.Search": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Setting.Admin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Setting.Guest": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Setting.MobileCompatibility": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Setting.TeamSpace": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Setting.User": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Setting.Wizard": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Sharing.Misc": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Sharing.Passphrase": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Streaming": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Thumbnail": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Upload.Item": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.Upload.PhotoRequestItem": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Foto.UserInfo": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FotoTeam.Browse.Item": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FotoTeam.Download": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.FotoTeam.Thumbnail": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.License.HA": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Network.DHCPServer": { "maxVersion": 4, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Network.DHCPServer.ClientList": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Network.DHCPServer.PXE": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Network.DHCPServer.Reservation": { "maxVersion": 3, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Network.DHCPServer.Vendor": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Network.DHCPServer.WPAD": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Common": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.OAUTH.Token": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Package": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Contacts": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.PersonMailAccount.Mail": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Remote.Credential": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Remote.Credential.Challenge": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Remote.Credential.Info": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Remote.Credential.Verifier": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.EventRule": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Log": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.ResourceMonitor.Setting": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Client.Job": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.S2S.Server.Pair": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator.Ex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator.Info": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator.Registration": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator.Registration.Ex": { "maxVersion": 2, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator.Request": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Authenticator.Verdict": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Fido.Manage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Fido.Manage.Ex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Fido.Register": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Fido.Register.Ex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Method": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Method.Admin": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Method.Ex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Package": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Package.Ex": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecureSignIn.Package.Request": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Checklist": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Checklist.Alert": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Conf.Location": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.LoginActivity": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Report": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.SecurityAdvisor.Report.HTML": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Snap.Usage.Share": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Cache.Protection": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Check": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.DetectedPool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.DualEnclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Enclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Flashcache": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.HddMan": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Pool": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Smart": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Smart.Scheduler": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Spare": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Spare.Conf": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Storage": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.TaipeiEnclosure": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Volume": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Storage.CGI.Volume.Installer": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.Utils": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.VideoPlayer.Subtitle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, "SYNO.VideoPlayer.SynologyDrive.Subtitle": { "maxVersion": 1, "minVersion": 1, "path": "entry.cgi", "requestFormat": "JSON", }, }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_7/core/000077500000000000000000000000001467623651400221705ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_7/core/__init__.py000066400000000000000000000000371467623651400243010ustar00rootroot00000000000000"""DSM 7 SYNO.Core.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_7/core/const_7_core_external_usb.py000066400000000000000000000170121467623651400277020ustar00rootroot00000000000000"""DSM 7 SYNO.Core.ExternalDevice.Storage.USB data.""" DSM_7_CORE_EXTERNAL_USB_DS1821_PLUS_NO_EXTERNAL_USB = { "data": {"devices": []}, "success": True, } DSM_7_CORE_EXTERNAL_USB_DS1821_PLUS_EXTERNAL_USB = { "data": { "devices": [ { "dev_id": "usb1", "dev_title": "USB Disk 1", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "ntfs", "filesystem": "ntfs", "name_id": "usb1p1", "partition_title": "USB Disk 1 Partition 1", "share_name": "usbshare1-1", "status": "normal", "total_size_mb": 1024, "used_size_mb": 10, }, { "dev_fstype": "vfat", "filesystem": "FAT32", "name_id": "usb1p2", "partition_title": "USB Disk 1 Partition 2", "share_name": "usbshare1-2", "status": "normal", "total_size_mb": 1024, "used_size_mb": 0, }, ], "producer": "PNY", "product": "Flash Drive", "progress": "", "status": "normal", "total_size_mb": 122070, }, { "dev_id": "usb2", "dev_title": "USB Disk 2", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "ext4", "filesystem": "ext4", "name_id": "usb2p1", "partition_title": "USB Disk 2 Partition 1", "share_name": "usbshare2", "status": "normal", "total_size_mb": 15138295, "used_size_mb": 10899326, } ], "producer": "Western Digital Technologies, Inc.", "product": "easystore 264D", "progress": "", "status": "normal", "total_size_mb": 15259648, }, { "dev_id": "usb3", "dev_title": "USB Disk 3", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "vfat", "filesystem": "FAT32", "name_id": "usb3p1", "partition_title": "USB Disk 3 Partition 1", "share_name": "usbshare3-1", "status": "normal", "total_size_mb": 197, "used_size_mb": 10, }, { "dev_fstype": "hfsplus", "filesystem": "hfsplus", "name_id": "usb3p2", "partition_title": "USB Disk 3 Partition 2", "share_name": "usbshare3-2", "status": "normal", "total_size_mb": 117020, "used_size_mb": 13965, }, ], "producer": "SanDisk Corp.", "product": " SanDisk 3.2Gen1", "progress": "", "status": "normal", "total_size_mb": 117348, }, { "dev_id": "usb4", "dev_title": "USB Disk 4", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "exfat", "filesystem": "exfat", "name_id": "usb4p1", "partition_title": "USB Disk 4 Partition 1", "share_name": "usbshare4", "status": "normal", "total_size_mb": 241397, "used_size_mb": 1, } ], "producer": "PNY", "product": "USB 3.0 FD", "progress": "", "status": "normal", "total_size_mb": 241408, }, { "dev_id": "usb5", "dev_title": "USB Disk 5", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "vfat", "filesystem": "FAT32", "name_id": "usb5p1", "partition_title": "USB Disk 5 Partition 1", "share_name": "usbshare5-1", "status": "normal", "total_size_mb": 3886, "used_size_mb": 0, }, { "dev_fstype": "vfat", "filesystem": "FAT32", "name_id": "usb5p2", "partition_title": "USB Disk 5 Partition 2", "share_name": "usbshare5-2", "status": "normal", "total_size_mb": 32, "used_size_mb": 27, }, ], "producer": "SanDisk Corp.", "product": "Cruzer Titanium+", "progress": "", "status": "normal", "total_size_mb": 3919, }, { "dev_id": "usb6", "dev_title": "USB Disk 6", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "ntfs", "filesystem": "ntfs", "name_id": "usb6p1", "partition_title": "USB Disk 6 Partition 1", "share_name": "usbshare6", "status": "normal", "total_size_mb": 715371, "used_size_mb": 203585, } ], "producer": "Western Digital Technologies, Inc.", "product": "My Passport Essential (WDBACY)", "progress": "", "status": "normal", "total_size_mb": 715372, }, { "dev_id": "usb8", "dev_title": "USB Disk 8", "dev_type": "usbDisk", "formatable": True, "partitions": [ { "dev_fstype": "unknown", "filesystem": "", "name_id": "usb8", "partition_title": "USB Disk 8", "share_name": "", "status": "normal", "total_size_mb": "", } ], "producer": "Genesys Logic, Inc.", "product": "All-in-One Cardreader", "progress": "", "status": "normal", "total_size_mb": 29, }, ] }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_7/core/const_7_core_upgrade.py000066400000000000000000000011571467623651400266410ustar00rootroot00000000000000"""DSM 7 SYNO.Core.Upgrade data.""" DSM_7_CORE_UPGRADE_FALSE = {"data": {"update": {"available": False}}, "success": True} DSM_7_CORE_UPGRADE_TRUE = { "data": { "update": { "available": True, "reboot": "now", "restart": "some", "type": "nano", "version": "7.0.1-42218 Update 3", "version_details": { "buildnumber": 42218, "major": 7, "micro": 1, "minor": 0, "nano": 3, "os_name": "DSM", }, } }, "success": True, } py-synologydsm-api-2.5.3/tests/api_data/dsm_7/dsm/000077500000000000000000000000001467623651400220235ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_7/dsm/__init__.py000066400000000000000000000000361467623651400241330ustar00rootroot00000000000000"""DSM 7 SYNO.DSM.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_7/dsm/const_7_dsm_info.py000066400000000000000000000015561467623651400256360ustar00rootroot00000000000000"""DSM 7 SYNO.DSM.Info data.""" DSM_7_DSM_INFORMATION_DS213_PLUS = { "data": { "codepage": "enu", "model": "DS213+", "ram": 512, "serial": "XXXXXXXXXXX", "temperature": 30, "temperature_warn": False, "time": "Thu Apr 30 14:57:35 2020", "uptime": 3258607, "version": "24922", "version_string": "DSM 7.0-41222", }, "success": True, } DSM_7_DSM_INFORMATION_DS918_PLUS = { "data": { "codepage": "fre", "model": "DS918+", "ram": 4096, "serial": "1920PDN001501", "temperature": 40, "temperature_warn": False, "time": "Sun Mar 29 19:33:41 2020", "uptime": 155084, "version": "24922", "version_string": "DSM 7.0-41222", }, "success": True, } DSM_7_DSM_INFORMATION = DSM_7_DSM_INFORMATION_DS918_PLUS py-synologydsm-api-2.5.3/tests/api_data/dsm_7/photos/000077500000000000000000000000001467623651400225545ustar00rootroot00000000000000py-synologydsm-api-2.5.3/tests/api_data/dsm_7/photos/__init__.py000066400000000000000000000000371467623651400246650ustar00rootroot00000000000000"""DSM 7 SYNO.Foto.* datas.""" py-synologydsm-api-2.5.3/tests/api_data/dsm_7/photos/const_7_photo.py000066400000000000000000000207651467623651400257250ustar00rootroot00000000000000"""DSM 7 SYNO.Foto.Browse.Album data.""" DSM_7_FOTO_ALBUMS = { "data": { "list": [ { "condition": {"folder_filter": [597], "user_id": 1}, "create_time": 1674514932, "end_time": 1640958550, "id": 4, "item_count": 3, "name": "Album1", "owner_user_id": 1, "passphrase": "", "shared": False, "sort_by": "default", "sort_direction": "default", "start_time": 1601653233, "type": "condition", "version": 197920, }, { "cant_migrate_condition": {}, "condition": {}, "create_time": 1668690757, "end_time": 1668538602, "freeze_album": False, "id": 1, "item_count": 1, "name": "Album2", "owner_user_id": 1, "passphrase": "", "shared": False, "sort_by": "default", "sort_direction": "default", "start_time": 1668538602, "temporary_shared": False, "type": "normal", "version": 195694, }, { "cant_migrate_condition": {}, "condition": {}, "create_time": 1718658534, "end_time": 1719075481, "freeze_album": False, "id": 3, "item_count": 1, "name": "Album3", "owner_user_id": 7, "passphrase": "NiXlv1i2N", "shared": False, "sort_by": "default", "sort_direction": "default", "start_time": 1659724703, "temporary_shared": False, "type": "normal", "version": 102886, }, ] }, "success": True, } DSM_7_FOTO_ITEMS = { "success": True, "data": { "list": [ { "id": 29807, "filename": "20221115_185642.jpg", "filesize": 2644859, "time": 1668538602, "indexed_time": 1668564550862, "owner_user_id": 1, "folder_id": 597, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "29807_1668560967", "unit_id": 29807, } }, }, { "id": 29808, "filename": "20221115_185643.jpg", "filesize": 2644859, "time": 1668538602, "indexed_time": 1668564550862, "owner_user_id": 0, "folder_id": 597, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "notready", "preview": "broken", "sm": "ready", "cache_key": "29808_1668560967", "unit_id": 29808, } }, }, { "id": 29809, "filename": "20221115_185644.jpg", "filesize": 2644859, "time": 1668538602, "indexed_time": 1668564550862, "owner_user_id": 1, "folder_id": 597, "type": "photo", "additional": { "thumbnail": { "m": "notready", "xl": "notready", "preview": "broken", "sm": "ready", "cache_key": "29809_1668560967", "unit_id": 29809, } }, }, ] }, } DSM_7_FOTO_ITEMS_SHARED_ALBUM = { "success": True, "data": { "list": [ { "id": 29807, "filename": "20221115_185645.jpg", "filesize": 2644859, "time": 1668538602, "indexed_time": 1668564550862, "owner_user_id": 7, "folder_id": 597, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "29810_1668560967", "unit_id": 29807, } }, }, ] }, } DSM_7_FOTO_SHARED_ITEMS = { "success": True, "data": { "list": [ { "id": 77, "filename": "shared_1.jpg", "filesize": 1404758, "time": 1627062628, "indexed_time": 1628329471168, "owner_user_id": 0, "folder_id": 17, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "77_1628323785", "unit_id": 77, } }, }, { "id": 490, "filename": "shared_2.jpg", "filesize": 888192, "time": 1627062618, "indexed_time": 1628329516646, "owner_user_id": 0, "folder_id": 37, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "490_1628323817", "unit_id": 490, } }, }, { "id": 96, "filename": "shared_3.jpg", "filesize": 4903571, "time": 1626987559, "indexed_time": 1628329472531, "owner_user_id": 0, "folder_id": 18, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "96_1628323786", "unit_id": 96, } }, }, ] }, } DSM_7_FOTO_ITEMS_SEARCHED = { "success": True, "data": { "list": [ { "id": 12340, "filename": "search_1.jpg", "filesize": 2644859, "time": 1668538602, "indexed_time": 1668564550862, "owner_user_id": 1, "folder_id": 597, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "12340_1668560967", "unit_id": 12340, } }, }, { "id": 12341, "filename": "search_2.jpg", "filesize": 2644859, "time": 1668538602, "indexed_time": 1668564550862, "owner_user_id": 1, "folder_id": 597, "type": "photo", "additional": { "thumbnail": { "m": "ready", "xl": "ready", "preview": "broken", "sm": "ready", "cache_key": "12341_1668560967", "unit_id": 12341, } }, }, ] }, } py-synologydsm-api-2.5.3/tests/conftest.py000066400000000000000000000017231467623651400206670ustar00rootroot00000000000000"""Main conftest.""" import pytest from synology_dsm.synology_dsm import SynologyDSM from . import ( VALID_HOST, VALID_HTTPS, VALID_PASSWORD, VALID_PORT, VALID_USER, SynologyDSMMock, ) @pytest.fixture def api() -> SynologyDSM: """Return a mock DSM 6 API.""" return SynologyDSMMock( None, VALID_HOST, VALID_PORT, VALID_USER, VALID_PASSWORD, VALID_HTTPS, ) @pytest.fixture( params=[5, 6], ids=["DSM 5", "DSM 6"], ) def dsm(request, api) -> SynologyDSM: """Return a mock DSM 6 API.""" api.dsm_version = request.param return api @pytest.fixture def dsm_5(api) -> SynologyDSM: """Return a mock DSM 5 API.""" api.dsm_version = 5 return api @pytest.fixture def dsm_6(api) -> SynologyDSM: """Alias for api fixture.""" return api @pytest.fixture def dsm_7(api) -> SynologyDSM: """Return a mock DSM 7 API.""" api.dsm_version = 7 return api py-synologydsm-api-2.5.3/tests/const.py000066400000000000000000000030411467623651400201630ustar00rootroot00000000000000"""Test constants.""" # API test data are localized in # `tests/api_data/dsm_[dsm_major_version]` # Data constant names should be like : # "DSM_[dsm_version]_[API_KEY]" # if data failed, add "_FAILED" SESSION_ID = "session_id" SYNO_TOKEN = "Syñ0_T0k€ñ" # noqa: S105 DEVICE_TOKEN = "Dév!cè_T0k€ñ" # noqa: S105 UNIQUE_KEY = "1x2X3x!_UK" # Common API error code ERROR_UNKNOWN = {"error": {"code": 100}, "success": False} ERROR_INVALID_PARAMETERS = {"error": {"code": 101}, "success": False} ERROR_API_NOT_EXISTS = {"error": {"code": 102}, "success": False} ERROR_API_METHOD_NOT_EXISTS = {"error": {"code": 103}, "success": False} ERROR_API_VERSION_NOT_SUPPORTED = {"error": {"code": 104}, "success": False} ERROR_INSUFFICIENT_USER_PRIVILEGE = {"error": {"code": 105}, "success": False} ERROR_CONNECTION_TIME_OUT = {"error": {"code": 106}, "success": False} ERROR_MULTIPLE_LOGIN_DETECTED = {"error": {"code": 107}, "success": False} # Auth API error code ERROR_AUTH_INVALID_CREDENTIALS = {"error": {"code": 400}, "success": False} ERROR_AUTH_GUEST_OR_DISABLED_ACCOUNT = {"error": {"code": 401}, "success": False} ERROR_AUTH_PERMISSION_DENIED = {"error": {"code": 402}, "success": False} ERROR_AUTH_OTP_NOT_SPECIFIED = {"error": {"code": 403}, "success": False} ERROR_AUTH_OTP_AUTHENTICATE_FAILED = {"error": {"code": 404}, "success": False} ERROR_AUTH_INCORRECT_APP_PORTAL = {"error": {"code": 405}, "success": False} ERROR_AUTH_OTP_CODE_ENFORCED = {"error": {"code": 406}, "success": False} ERROR_AUTH_MAX_TRIES = {"error": {"code": 407}, "success": False} py-synologydsm-api-2.5.3/tests/test_synology_dsm.py000066400000000000000000000527771467623651400226460ustar00rootroot00000000000000"""Synology DSM tests.""" # pylint: disable=protected-access import pytest from aiohttp import ClientTimeout from synology_dsm.api.core.external_usb import SynoCoreExternalUSB from synology_dsm.api.core.security import SynoCoreSecurity from synology_dsm.api.core.share import SynoCoreShare from synology_dsm.api.core.system import SynoCoreSystem from synology_dsm.api.core.upgrade import SynoCoreUpgrade from synology_dsm.api.core.utilization import SynoCoreUtilization from synology_dsm.api.download_station import SynoDownloadStation from synology_dsm.api.dsm.information import SynoDSMInformation from synology_dsm.api.photos import SynoPhotos from synology_dsm.api.storage.storage import SynoStorage from synology_dsm.api.surveillance_station import SynoSurveillanceStation from synology_dsm.const import API_AUTH, API_INFO from synology_dsm.exceptions import ( SynologyDSMAPIErrorException, SynologyDSMAPINotExistsException, SynologyDSMLogin2SAFailedException, SynologyDSMLogin2SARequiredException, SynologyDSMLoginFailedException, SynologyDSMLoginInvalidException, SynologyDSMNotLoggedInException, SynologyDSMRequestException, ) from . import ( USER_MAX_TRY, VALID_HOST, VALID_HTTPS, VALID_PASSWORD, VALID_PORT, VALID_USER, VALID_USER_2SA, SynologyDSMMock, ) class TestSynologyDSM: """Common SynologyDSM 5 and 6 test cases.""" def test_init(self, dsm): """Test init.""" assert dsm.username == VALID_USER assert str(dsm._base_url) == f"https://{VALID_HOST}:{VALID_PORT}" assert dsm._aiohttp_timeout.total == 10 assert not dsm.apis.get(API_AUTH) assert not dsm._session_id @pytest.mark.parametrize("version", [5, 6, 7]) @pytest.mark.asyncio async def test_login_neccessary(self, version): """Test login is neccessary.""" dsm = SynologyDSMMock( None, VALID_HOST, VALID_PORT, USER_MAX_TRY, VALID_PASSWORD, VALID_HTTPS, ) dsm.dsm_version = version with pytest.raises(SynologyDSMNotLoggedInException) as error: await dsm.utilisation.update() error_value = error.value.args[0] assert error_value["api"] is None assert error_value["code"] == -1 assert error_value["reason"] == "Unknown" assert error_value["details"] == "Not logged in. You have to do login() first." @pytest.mark.parametrize("version", [5, 6, 7]) @pytest.mark.asyncio async def test_login_basic_failed(self, version): """Test basic failed login.""" dsm = SynologyDSMMock( None, VALID_HOST, VALID_PORT, USER_MAX_TRY, VALID_PASSWORD, VALID_HTTPS, ) dsm.dsm_version = version with pytest.raises(SynologyDSMLoginFailedException) as error: await dsm.login() error_value = error.value.args[0] assert error_value["api"] == "SYNO.API.Auth" assert error_value["code"] == 407 assert error_value["reason"] == "Max Tries (if auto blocking is set to true)" assert error_value["details"] == USER_MAX_TRY @pytest.mark.parametrize("version", [5, 6, 7]) @pytest.mark.asyncio async def test_login_2sa_failed(self, version): """Test failed login with 2SA.""" dsm = SynologyDSMMock( None, VALID_HOST, VALID_PORT, VALID_USER_2SA, VALID_PASSWORD, VALID_HTTPS, ) dsm.dsm_version = version with pytest.raises(SynologyDSMLogin2SARequiredException) as error: await dsm.login() error_value = error.value.args[0] assert error_value["api"] == "SYNO.API.Auth" assert error_value["code"] == 403 assert error_value["reason"] == "One time password not specified" assert ( error_value["details"] == "Two-step authentication required for account: valid_user_2sa" ) with pytest.raises(SynologyDSMLogin2SAFailedException) as error: await dsm.login(888888) error_value = error.value.args[0] assert error_value["api"] == "SYNO.API.Auth" assert error_value["code"] == 404 assert error_value["reason"] == "One time password authenticate failed" assert ( error_value["details"] == "Two-step authentication failed, retry with a new pass code" ) assert dsm._session_id is None assert dsm._syno_token is None assert dsm._device_token is None @pytest.mark.parametrize("version", [5, 6, 7]) @pytest.mark.asyncio async def test_connection_failed(self, version): """Test failed connection.""" # No internet dsm = SynologyDSMMock( None, "no_internet", VALID_PORT, VALID_USER, VALID_PASSWORD, VALID_HTTPS, ) dsm.dsm_version = version with pytest.raises(SynologyDSMRequestException) as error: await dsm.login() error_value = error.value.args[0] assert not error_value["api"] assert error_value["code"] == -1 assert error_value["reason"] == "Unknown" assert ( "ClientError =