Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

2FA broken with Synology DSM version 7.0.1-42218 update 2 #64867

Closed
3 tasks done
j6s33m opened this issue Jan 24, 2022 · 90 comments · Fixed by #68584
Closed
3 tasks done

2FA broken with Synology DSM version 7.0.1-42218 update 2 #64867

j6s33m opened this issue Jan 24, 2022 · 90 comments · Fixed by #68584
Assignees
Labels
integration: synology_dsm problem in device Issue lies within the device, such firmware, software, or user customization/config

Comments

@j6s33m
Copy link

j6s33m commented Jan 24, 2022

Checklist

  • I have updated to the latest available Home Assistant version.
  • I have cleared the cache of my browser.
  • I have tried a different browser to see if it is related to my browser.

Describe the issue you are experiencing

Since restarting HA this morning, I have a notification that let's me know that I need to reconfigure my Synology integration. I follow the steps and use my login/password + 2FA and get success message. However, the integration does not update and show connection. I've restarted several times and it's still showing the same problem.

Describe the behavior you expected

I expect after successfully logging in that it works and the integration refreshes properly.

Steps to reproduce the issue

1.Click Reconfigure button in integration page for Synology
2.Login in with username, password, and then 2FA code

...

What version of Home Assistant Core has the issue?

core-2021.12.10

What was the last working version of Home Assistant Core?

core-2021.12.10

In which browser are you experiencing the issue with?

Google Chrome Version 97.0.4692.99 (Official Build) (x86_64)

Which operating system are you using to run this browser?

macOS Big Sur 11.6.2

State of relevant entities

No response

Problem-relevant frontend configuration

No response

Javascript errors shown in your browser console/inspector

Logger: homeassistant.config_entries
Source: config_entries.py:327
First occurred: 1:23:40 PM (1 occurrences)
Last logged: 1:23:40 PM

Config entry '192.168.[xxx.xxx]' for synology_dsm integration could not authenticate: reason: Two-step authentication required for account: [myaccountusername]

Additional information

No response

@spacegaier spacegaier transferred this issue from home-assistant/frontend Jan 24, 2022
@probot-home-assistant
Copy link

synology documentation
synology source
(message by IssueLinks)

@probot-home-assistant
Copy link

Hey there @hacf-fr, @Quentame, @mib1185, mind taking a look at this issue as it has been labeled with an integration (synology_dsm) you are listed as a code owner for? Thanks!
(message by CodeOwnersMention)


synology_dsm documentation
synology_dsm source
(message by IssueLinks)

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

Hi @j6s33m ,
please enable debug logging and provide the logs.
To do so add the following to your configuration.yaml:

logger:
  default: info
  logs:
    homeassistant.components.synology_dsm: debug
    synology_dsm: debug

Furthermore, are still able to login to you NAS with the same account directly via UI?

@mib1185 mib1185 self-assigned this Jan 25, 2022
@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

Hi @j6s33m , please enable debug logging and provide the logs. To do so add the following to your configuration.yaml:

logger:
  default: info
  logs:
    homeassistant.components.synology_dsm: debug
    synology_dsm: debug

Furthermore, are still able to login to you NAS with the same account directly via UI?

I've added this, but am not getting logs that are different from the error I added above. Nothing is showing up related to Synology for debug.

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

Did you have a look into the full log for this?
There must be many more outputs with DEBUG [homeassistant.components.synology_dsm] and DEBUG [synology_dsm] visible.

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022 via email

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

Could you please try again to enable the debug logging, since the very first visible error could be the same, even the cause is different and to obtain the cause I need the debug logs.
Did you try to get the full log of home assistant via UI or by console/ssh or maybe fileshare access?

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022 via email

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

If you look in the forums, this is a problem for a bunch of folks

Sorry, but on a first fast search I only found one actual forum thread which is about connection issues from HA to Synology -> https://community.home-assistant.io/t/did-2021-12-break-synology-integration/367264
The this issue was caused by an issue with an local NFS service ... so not related to HA.
If you could point my out some current forum threads/posts, where the user observe connection issues from HA to Synology DSM, than please provide them.

use the debug data from the other poster

There is no other user involved in this issue here, so I do not have any clue where this (partial) logs came from 🧐

I’ve tried six ways to Sunday and am in the log file in my console

If you share your configuration.yaml (limited to the part about logging configuration, so that no sensitive data is shared), so I could have a look and maybe give you a hint, why the debug log will not work for you?


Please allow me further questions about your issue description:

Since restarting HA this morning, I have a notification that let's me know that I need to reconfigure my Synology integration

  • Does this mean, that it worked as expected before?
  • Did you perform an update of HA before the reboot?
  • Does the NAS maybe performed an update?

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022 via email

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

logger:
  default: info
  logs:
    homeassistant.components.synology_dsm: debug
    synology_dsm: debug

if the indention is correct and there is no other logger: defined which overwrites this one than this should work after a reboot of HA

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Request url: https://192.168.**xxx.xxx:xxxx**/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=**[mynasnamehere]**&format=sid&api=SYNO.API.Auth&version=7&method=login 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Request status_code: 200 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Request headers: {'Server': 'nginx', 'Date': 'Tue, 25 Jan 2022 20:09:34 GMT', 'Content-Type': 'application/json; charset="UTF-8"', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Encoding': 'gzip'} 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Request Method: GET 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Successful returned data 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] API: SYNO.API.Auth 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] RESPONSE: {'error': {'code': 403, 'errors': {'token': '**[MYTOKENREMOVED]**', 'types': [{'type': 'otp'}]}}, 'success': False}

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

Encoding', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Encoding': 'gzip'} 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Request Method: GET 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] Successful returned data 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] API: SYNO.API.Auth 2022-01-25 14:09:34 DEBUG (SyncWorker_3) [synology_dsm.synology_dsm] RESPONSE: {'error': {'code': 403, 'errors': {'token': '[MYTOKENREMOVED]', 'types': [{'type': 'otp'}]}}, 'success': False} 2022-01-25 14:09:34 INFO (MainThread) [homeassistant.components.sensor] Setting up sensor.ipp

I removed some of my information (url, NAS name, token, etc)

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

could you please provide more logs around this single log entry?
These will contain many more needed debug information, which are needed to consider the whole setup process of the Synology DSM integration

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

I have no idea what else you want me to give you...these are the DEBUG logs tied to the Synology_dsm

2022-01-25 14:19:29 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Creating new session
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request url: https://192.168.[xxx.xxx:xxxx]/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request status_code: 200
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request headers: {'Server': 'nginx', 'Date': 'Tue, 25 Jan 2022 20:19:30 GMT', 'Content-Type': 'application/json; charset="UTF-8"', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Encoding': 'gzip'}
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request Method: GET
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Successful returned data
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] API: SYNO.API.Info
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] RESPONSE: {'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.RedirectURI': {'maxVersion': 1, 'minVersion': 1, '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.ActiveBackup.Activation': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Agent': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Agent.Device': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Agentless': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Device': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Inventory': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Log': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.NFSPrivilege': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Overview': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Report': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.ReportConfig': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.ReportGet': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Restore': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.RestoreVM': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Server': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Setting': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Share': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Storage': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Task': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.TaskTemplate': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.UserGroup': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveBackup.Version': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.ActiveInsight.Package': {'maxVersion': 2, '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.Auth.ForgotPwd': {'maxVersion': 1, 'minVersion': 1, '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.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.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.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.Repository.LoginPort': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.Backup.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.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.Btrfs.Replica.Core': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Account': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Bucket': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Conf': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.File': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Share': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Share.Status': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Transform': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.C2FS.Utils': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.CloudSync': {'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.Identity': {'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': 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.Certificate.Tencent': {'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.PersonalUpdater': {'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.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': 3, '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.Ethernet.External': {'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.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.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': 4, '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.PkgProfile': {'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.Image': {'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.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': 3, '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': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.Foto.Browse.Folder': {'maxVersion': 1, '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': 1, '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.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.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': 3, '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': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.Foto.Upload.Item': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.Foto.UserInfo': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.BackgroundTask.File': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Diff': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Folder': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.GeneralTag': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Geocoding': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Item': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Person': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.RecentlyAdded': {'maxVersion': 3, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Timeline': {'maxVersion': 3, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Browse.Unit': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Download': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Index': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Search.Filter': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Search.Search': {'maxVersion': 3, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Sharing.FolderBatchPermission': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Sharing.FolderPermission': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Sharing.Passphrase': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Streaming': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Thumbnail': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.FotoTeam.Upload.Item': {'maxVersion': 1, '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.MariaDB10.lib': {'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.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.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.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.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.BtrfsDedupe': {'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.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.Face': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SurveillanceStation.Face.Archive': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SurveillanceStation.Face.CMS': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SurveillanceStation.Face.Result': {'maxVersion': 1, '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': 6, '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': 2, '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.Dashboard': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.Files': {'maxVersion': 5, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.HybridShare.Privilege': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.Index': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.Info': {'maxVersion': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.KeyManagement': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.Labels': {'maxVersion': 2, '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.Migration.UserHome': {'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': 2, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.Privilege': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.SynologyDrive.Profiles': {'maxVersion': 2, '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': 2, '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.Statistics': {'maxVersion': 1, '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': 2, '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.TextEditor': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.TextEditor.Preference': {'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.WebStation.Default': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.ErrorPage': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.HTTP.VHost': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.PHP': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.PHP.Profile': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.Shortcut': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.Status': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.WebService.Portal': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}, 'SYNO.WebStation.WebService.Service': {'maxVersion': 1, 'minVersion': 1, 'path': 'entry.cgi', 'requestFormat': 'JSON'}}, 'success': True}
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request url: https://192.168.[removed rest of url xxx.xxx:xxxx]/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=[removedNASname]&format=sid&api=SYNO.API.Auth&version=7&method=login
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request status_code: 200
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request headers: {'Server': 'nginx', 'Date': 'Tue, 25 Jan 2022 20:19:30 GMT', 'Content-Type': 'application/json; charset="UTF-8"', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Encoding': 'gzip'}
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Request Method: GET
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] Successful returned data
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] API: SYNO.API.Auth
2022-01-25 14:19:30 DEBUG (SyncWorker_4) [synology_dsm.synology_dsm] RESPONSE: {'error': {'code': 403, 'errors': {'token': '[removedtoken]', 'types': [{'type': 'otp'}]}}, 'success': False}

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

Could you also please answer my last questions from #64867 (comment) and also provide the DSM version and model of your NAS?

From the provided logs, it looks like, that the NAS is not configured with 2FA in HA, since there is not device_id passed during the login call (/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=[removedNASname]&format=sid&api=SYNO.API.Auth&version=7&method=login) 🤔

Therefore may I ask you to perform the reconfiguration via UI and provide the logs (debug and info and warning ... just the logs during the timeframe, you perform the reconfiguration)

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

I'm using 2FA...I tried deleting the integration and reading it and so I don't know if that's the reason it's not showing the 2FA anymore. I just reconfigured again and can't include the logs because they exceeded the maximum 655536 character limit.

Synology DS220+
DSM Version: 7.01-42218

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

they exceeded the maximum 655536 character limit.

Sorry, forgot to mention that - just save the logs in a txt file and drag&drop it here - so it will be added as attachment

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

debug.txt

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

could you please provide the log including the integration related log messages?
If you filter the log with grep, than please just grep synology_dsm homeassistant.log

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

There is nothing in the log with "grep" or grep synology_dsm homeassistant.log

I noticed you pushed new code 4 days ago here: #64480

Everything seemed to be working fine until right around this date. Are you sure your latest pull request didn't break the code somewhere?

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

Others are having this problem too...

https://community.home-assistant.io/t/synology-dsm-7-2fa-problem/314505

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

There is nothing in the log with "grep" or grep synology_dsm homeassistant.log

no no, grep is a shell command to filter the output of a file ... for me every line from your (overall!) log which contains synology_dsm is of interesst - even it is info, warning or debug and if it is [synology_dsm...] or [homeassistant.components.synology_dsm...]

I noticed you pushed new code 4 days ago here: #64480

on initial post you mentioned, that you are on home assistant version 2021.12.10? So #64480 is not included in this version.


From the provided logs, I can see, that your NAS does not provide the device_id, which will be stored in HA to re-authenticate after a reboot.

I'm on DSM DSM 7.0.1-42218 (without update 2!) and everything works as expected ... from the logs I see, that you are already on DSM "7.0.1-42218 update 2". DId you do an update of your DSM?

@j6s33m
Copy link
Author

j6s33m commented Jan 25, 2022

Yes, my synology pushed an update last week (released on Jan 13) for v2. If that's the only variable that's different, then you probably found the culprit ...

@mib1185
Copy link
Contributor

mib1185 commented Jan 25, 2022

ok, than I will skip this update on my NAS 😆
To be serious, if this is really the cause, than we cannot do anything for now, besides waiting for a fix from Synology.
As workaround you could disable 2FA for the user you are using for HA to login to Syno.

@mundschenk-at
Copy link

When I run GET https://<IP:port>/webapi/entry.cgi?api=SYNO.API.Auth&version=7&method=login&account=<user>&passwd=<password>&otp_code=<code>&enable_device_token=yes&device_name=postman&format=sid, I get the following result:

{
    "data": {
        "account":"<user>",
        "device_id":"",
        "ik_message":"",
        "is_portal_port":false,
        "sid":"<token>",
        "synotoken":"--------"
    },
    "success":true
}

I am assuming device_id should contain a value? It does not for me.

@littletruckman
Copy link

@mundschenk-at

Have you restarted HA? It only occurs when the integration is initialized.

Yes of course: Both Synology and HA :-) and it keeps running... I cannot destroy this one :-)

@mib1185
Copy link
Contributor

mib1185 commented Mar 18, 2022

I am assuming device_id should contain a value? It does not for me.

@mundschenk-at this is exact the issue, we are trying to catch here 👍


let me try to summarize the available data

@littletruckman from #64867 (comment)

  • NAS: DS918+ with DSM 7.0.1-42218 Update 2
  • Request: GET https://my.syno.ip.adresse:sslport/webapi/entry.cgi?api=SYNO.API.Auth&version=7&method=login&account=<user>&passwd=<password>&otp_code=123456&enable_device_token=yes&device_name=postman&format=sid
  • Result:
{
    "data": {
        "account": "user",
        "device_id": "H5ZvWUp2M0VB3YbU38kYV25yZwwc2AJDB9IByFwHy0I5_mNHBNJMh0DCb3G8BAudU1zcpDlxixG1IggkTOSJCA",
        "ik_message": "",
        "is_portal_port": false,
        "sid": "fg97EITQIXhcP5K2MC5hdOqxWCNySoz8fZbGCZkmd5og82O8igrkOAWfj6ZGO97JPRHPDtaWwdy0QmhBsJowZ4",
        "synotoken": "--------"
    },
    "success": true
}

@mundschenk-at from #64867 (comment)

  • NAS: DS918+ with DSM 7.0.1-42218 Update 3
  • Request: GET https://<IP:port>/webapi/entry.cgi?api=SYNO.API.Auth&version=7&method=login&account=<user>&passwd=<password>&otp_code=<code>&enable_device_token=yes&device_name=postman&format=sid
  • Result:
{
    "data": {
        "account":"<user>",
        "device_id":"",
        "ik_message":"",
        "is_portal_port":false,
        "sid":"<token>",
        "synotoken":"--------"
    },
    "success":true
}

@j6s33m extracted from debug.txt from #64867 (comment)

  • NAS: DS220+with DSM Version: 7.01-42218 Update 2
  • Request: https://[mysynologyIPaddress]/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=[mySynologyNASname]&format=sid&otp_code=077221&api=SYNO.API.Auth&version=7&method=login
  • Result:
{
    "data": {
        "account":"Jordan",
        "device_id":"",
        "ik_message":"",
        "is_portal_port":false,
        "sid":"XHuIVY2PU07GcJeU4TXnNYYheJVBJ9ZP3Z-Mo0wkok8NbJPEYJ3E4Zq7XULM9D3M0R6t19LezwuJQzlqZNAqmI",
        "synotoken":"--------"
    },
    "success":true
}

based on the summarization @littletruckman may I ask you, to please verify again your results?

@littletruckman
Copy link

based on the summarization @littletruckman may I ask you, to please verify again your results?

I have just repeated the tests:

  • DS918+ still on DSM 7.0.1-42218 Update 2:

GET https://<IP-DS918:port>/webapi/entry.cgi?api=SYNO.API.Auth&version=7&method=login&account=<user>&passwd=<password>&otp_code=739778&enable_device_token=yes&device_name=postman
JSON Answer:

{
    "data": {
        "account": "user",
        "device_id": "H5ZvWUp2M0VB3YbU38kYV25yZwwc2AJDB9IByFwHy0I5_mNHBNJMh0DCb3G8BAudU1zcpDlxixG1IggkTOSJCA",
        "ik_message": "",
        "is_portal_port": false,
        "sid": "MWb_0dRkrtRa_QTBZTI7VEjcwQBAkKXyiLidRQhdQAoOdcjOoFTsTxN5Zd2Ai6VjgZGLfcNuv1koeWDaUiOfkY",
        "synotoken": "--------"
    },
    "success": true
}
  • DS218+ on DSM 7.0.1-42218 Update 3
    GET https://<IP-DS218:port>/webapi/entry.cgi?api=SYNO.API.Auth&version=7&method=login&account=<user>&passwd=<password>&otp_code=031498&enable_device_token=yes&device_name=postman
    JSON Answer:
{
    "data": {
        "account": "user",
        "device_id": "wEC5uIpdFJq1Es4CuWPk2XGK5h9zXDMjsuUq-7jlAxts3Db3Zpcv_IefzitqMFrgqKYK_dGmZfGWF806Hfc6Bg",
        "ik_message": "",
        "is_portal_port": false,
        "sid": "7mu9LOtGkAUR0PpuWFtV264-e1ouLaRk8bgnlLyg838LNk-rJhZgpN7eGoRUOKfbg8j8FH8agHKRWuXZMqCHMg",
        "synotoken": "--------"
    },
    "success": true
}

@littletruckman
Copy link

I also did the followings:

  1. Remove from HA the DS918+ failing integration

  2. Restarted the DS918+

  3. Resarted the docker environment and therefore HA with debug logs for DSM and synology

  4. Re-install the DSM integration for the DS918+
    => When doing so the integration goes through the various setup steps including the query for the OTP Code
    => All finishing with a success code and everything OK in the log (in fact nothing :-))

  5. Just after the setup, the configuration page of HA shows a warning that the 2FA failed for the DS918+
    => the following comes in the log:

2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] API: SYNO.API.Auth
2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] Request Method: GET
2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] Request url: https://IP-DS918:port/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=homeassistant&format=sid&api=SYNO.API.Auth&version=7&method=login
2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] Response status_code: 200
2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] Response headers: {'Server': 'nginx', 'Date': 'Fri, 18 Mar 2022 13:06:15 GMT', 'Content-Type': 'application/json; charset="UTF-8"', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'max-age=0, no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Strict-Transport-Security': 'max-age=15768000; includeSubdomains; preload'}
2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] Successful returned data
2022-03-18 14:06:15 DEBUG (SyncWorker_13) [synology_dsm.synology_dsm] RESPONSE: {'error': {'code': 403, 'errors': {'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyRkEiLCJleHAiOjE2NDc2MDkwNzUsImlhdCI6MTY0NzYwODc3NSwic3ViIjoiYWxsc3luYWRtIn0.r5kIZudZONzWzLvPmErEdTavBmuniZcxf9WIBBN2XCA', 'types': [{'type': 'otp'}]}}, 'success': False}
2022-03-18 14:06:15 WARNING (MainThread) [homeassistant.config_entries] Config entry 'IP-DS918' for synology_dsm integration could not authenticate: reason: Two-step authentication required for account: ***user***

The error code is the one that I get if I play it in a browser... and is normal BECAUSE the request is formated as it should be for a Login with OTP to enable to omit 2-factor verification AND EXCEPT that OTP is missing !!!!
If I add the &otp_code=<6digits> in the browser then it works !

The question is why is it issuing such a Login without &otp_code and not the loging with omited OTP and &device_id= since OTP was checked when registering the integration ?
the logged call works only if it was at least done once with a correct OTP... Then subsequent calls work.
It behaves as if the OTP omission request was not correctly done....

BR

@mib1185
Copy link
Contributor

mib1185 commented Mar 20, 2022

@littletruckman could you please provide the full home-assistant.log?
I would like to compare what the library does and your postman results.

The question is why is it issuing such a Login without &otp_code and not the loging with omited OTP and &device_id= since OTP was checked when registering the integration ?

this is because HA does not get the device_id back from the NAS, so it cannot save and re-use it

@littletruckman
Copy link

@mib1185

I could send you the full home-assistant log but you will not have much more concerning the DSM integration that what is shown in the extract I have sent.
Futhermore, since this WE and the last restart after the addition of another integration (Weatherbit) the 2nd Synology intégration is in error :-).

If it can help you, I will be able to start from scratch, cleanning all DSM integrations and adding one back, but I will need some time :-)

Let me know what is the more probant for you

@littletruckman
Copy link

@mib1185,

Found some time to do it once :-)

Attached you will find the complete log:

Line 4 to 738: Startup of HA without any DSM integration,

Line 739 -> 743: Addition of a new DSM integration (selecting the first discovered) -> No trace of UI
image
HA asks then for the username/password/port....
image

Line 744 to 758: HA make the connection to the synology with the provided info.
It fails because of the 2FA
HA asks for the OTP Code
image

Line 765 to 780: Once OTP is entered, HA proceed with a new connection that suceed. We see the sid provided as return

Line 787 to 824: HA Proceed with the addition of device and entities.
Everything is OK. The success message is displayed closing the addition procedure
image

Line 831 to 838: HA issue a new logon request without sid or OTP (according to the displayed parameters)
This request fails

END
Right after the end of the setup of the new integration, the followings appear in the integration panel:
image
and
image

Neverending Story:
If you try to reconfigure the integration, HA asks again for the user, password, ports, then for the OTP following exactly the same schema of logs, presenting the success message again.. but rigt after that the 2FA is again broken....

BR

home-assistant - LittleTruckMan.zip

@mib1185
Copy link
Contributor

mib1185 commented Mar 21, 2022

@littletruckman many thanks for this effort 👍
In line 779 you see the issue - after successful login via OTP, there is no device ID provided ('device_id': '') even it is requested in line 775 (...enable_device_token=yes...). This device ID is needed to omit the OTP during next login.
The session ID (sid) you mentioned, is just the active session cookie used by HA after login - it dos not have to do anything with the OTP - it's just the basis.

@littletruckman
Copy link

@mib1185

Damned You are right :-)

If I run exactly the same URL from a browser (placing of course the right Ip, user and password, I get the following response in HTML:

https://DS918-IP:5001/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=homeassistant&format=sid&otp_code=496405&api=SYNO.API.Auth&version=7&method=login

{"data":{"account":"*******","device_id":"bHN1V8bn6nUpuxMtNAT18CGaLpCFYM5eZfePubgdf-3lLTG1lH5KeZ4J0FMVILmFYyyJHC25rO5lammism_PkA","ik_message":"","is_portal_port":false,"sid":"H6W654hsOCUnw60ycHGxSecsORjq9lSA1Ym9W2_1pQQXxi7uTEEbpf7MhFxk_gjbCh_0bCh01KcchIYPG2mkQs","synotoken":"--------"},"success":true}

After that, running developer tool in the browser, I see the device id in the "did" cookie of the session.... maybe a remaining value from old attempts...
image

@mib1185
Copy link
Contributor

mib1185 commented Mar 21, 2022

@littletruckman could you please re-test, but with a cleared browser cache or just in a private browser window?

@littletruckman
Copy link

@mib1185

Damned You are ... again... right :-)
Starting with a cleared session, neither "did" nor device_id appears in the list of the cookies.

In fact once the cache is cleared as well as all site cookies, le device_id is not anymore returned when I issue the URL in the web browser....
Then, when connecting to the UI of my synology, I noticed that I have to do again the logon with OTP registration....
Once done, the did appears in the site cookies as well as the device_id: returned in the browser URL.

.....

Do you known if there is s possibility to make the same kind of tests from the Home-Assistant serveur (docker instance) ?
I am not a specialist, but guided I could investigate a little bit.

@mib1185
Copy link
Contributor

mib1185 commented Mar 22, 2022

you could just use curl from a command line (-vvmeans verbose and k ignores certificates)
curl -vvk "https://DS918-IP:5001/webapi/entry.cgi?account=********&passwd=********&enable_device_token=yes&device_name=homeassistant&format=sid&otp_code=496405&api=SYNO.API.Auth&version=7&method=login"

@littletruckman
Copy link

Thanks @mib1185

Here are the results:

  1. First try: with &format=sid
    bash-5.1# curl -vvk https://DS918-IP:port/webapi/entry.cgi?'account=SynoUser&passwd=SynoPassword&enable_device_token=yes&device_name=homeassistant&format=sid&otp_code=908666&api=SYNO.API.Auth&version=7&method=login'
*   Trying AAA.BBB.CCC.DDD:PPPPP...
* Connected to DS918-IP:port (AAA.BBB.CCC.DDD) port PPPPP (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=myDomain.com
*  start date: Jan 20 14:44:55 2022 GMT
*  expire date: Apr 20 14:44:54 2022 GMT
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7f6c0dc85a90)
> GET /webapi/entry.cgi?account=SynoUser&passwd=SynoPassword&enable_device_token=yes&device_name=homeassistant&format=sid&otp_code=908666&api=SYNO.API.Auth&version=7&method=login HTTP/2
> Host: DS918-IP:port
> user-agent: curl/7.79.1
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< server: nginx
< date: Tue, 22 Mar 2022 13:40:13 GMT
< content-type: application/json; charset="UTF-8"
< p3p: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
< x-content-type-options: nosniff
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< x-xss-protection: 1; mode=block
< cache-control: max-age=0, no-cache, no-store, must-revalidate
< pragma: no-cache
< expires: 0
< strict-transport-security: max-age=15768000; includeSubdomains; preload
< 
* Connection #0 to host DS918-IP:port left intact
{"data":{"account":"SynoUser","device_id":"","ik_message":"","is_portal_port":false,"sid":"v3kCxCbJEKi0DhQyutEw17WucwnfwNqyrDtS16pERrUA-tyJt3kA3lesgyfkIrC4XF-TPYzalSn4qMerhx0ZYs","synotoken":"--------"},"success":true}bash-5.1# 

=> "device_id":""

  1. Second try: without &format=sid
    bash-5.1# curl -vvk https://DS918-IP:port/webapi/entry.cgi?'account=SynoUser&passwd=SynoPassword&enable_device_token=yes&device_name=homeassistant&otp_code=270498&api=SYNO.API.Auth&version=7&method=login'
*   Trying AAA.BBB.CCC.DDD:PPPPP...
* Connected to DS918-IP:port (AAA.BBB.CCC.DDD) port PPPPP (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=myDomain.com
*  start date: Jan 20 14:44:55 2022 GMT
*  expire date: Apr 20 14:44:54 2022 GMT
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fb809ef3a90)
> GET /webapi/entry.cgi?account=SynoUser&passwd=SynoPassword&enable_device_token=yes&device_name=homeassistant&otp_code=270498&api=SYNO.API.Auth&version=7&method=login HTTP/2
> Host: DS918-IP:port
> user-agent: curl/7.79.1
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< server: nginx
< date: Tue, 22 Mar 2022 13:40:49 GMT
< content-type: application/json; charset="UTF-8"
< p3p: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
< x-content-type-options: nosniff
< x-xss-protection: 1; mode=block
< set-cookie: id=0vWzOZ1HaoPnXSOwbuX920IS8k9r3lm3Zyke8vTvVE0SiWeaWl_mLpdhT_a_o2c9QP5v2LvJ_M6MG7KhBOyypg;expires=Tue, 29-Mar-2022 13:40:49 GMT;path=/;HttpOnly
< set-cookie: did=10Vf1YIv571HVL2FRQDUiRKTCFcIwa4UIF9U125B3dqDrl8wlfs6ij8lOfoCyL7AeZga8jO3LkHFEIaAX4fKgQ;expires=Wed, 22-Mar-2023 13:40:48 GMT;path=/;HttpOnly
< x-content-type-options: nosniff
< x-xss-protection: 1; mode=block
< cache-control: max-age=0, no-cache, no-store, must-revalidate
< pragma: no-cache
< expires: 0
< strict-transport-security: max-age=15768000; includeSubdomains; preload
< 
* Connection #0 to host DS918-IP:port left intact
{"data":{"account":"SynoUser","device_id":"10Vf1YIv571HVL2FRQDUiRKTCFcIwa4UIF9U125B3dqDrl8wlfs6ij8lOfoCyL7AeZga8jO3LkHFEIaAX4fKgQ","ik_message":"","is_portal_port":false,"sid":"0vWzOZ1HaoPnXSOwbuX920IS8k9r3lm3Zyke8vTvVE0SiWeaWl_mLpdhT_a_o2c9QP5v2LvJ_M6MG7KhBOyypg","synotoken":"--------"},"success":true}bash-5.1# 

=> "device_id" is now set !
As well as did cookie....

Default behavior of the SYNO.API is
image

That's why I had Postman working because my PC was previously connected to DSM Manager and had a "did" cookie that identify the device for SYNO.API...

What do you think about trying to remove the &format=sid in the logon query(ies) ?

@mib1185
Copy link
Contributor

mib1185 commented Mar 22, 2022

@littletruckman nice finding 👍
so this is definitely a bug in DSM, since it worked well with format=sid (it is also like documented) before "DSM 7.0.1-42218 Update 2"
Will cross-chek this later this week and do a proper update of the underlying library

@littletruckman
Copy link

@mib1185
I have placed the findings in the ticket I had by the Synology support.
I hope it will help to have a move from their side or at least a recognition of the bug/regression.
I'll keep you informed.

@mundschenk-at
Copy link

mundschenk-at commented Mar 22, 2022

I have placed the findings in the ticket I had by the Synology support.
I hope it will help to have a move from their side or at least a recognition of the bug/regression.

I would not hold my breath. Their last responses to my ticket came close to satire (they told me to subscribe to their newsletter for any "news and changes" resulting from my ticket 🤡).

@littletruckman
Copy link

I am optimist by nature :-)
Pessimism never won any battle. ([Dwight D. Eisenhower]

@gabrio79
Copy link

gabrio79 commented Mar 24, 2022 via email

@mib1185
Copy link
Contributor

mib1185 commented Mar 24, 2022

From HA point of view the issue has been resolved by providing a workaround. Tracking the bug of another product is not intended here.

@gabrio79
Copy link

gabrio79 commented Mar 24, 2022 via email

@mitchoklemen
Copy link

I tried it and it works OK!
Thanks for update it!

@littletruckman
Copy link

Thanks again for the solution. It works like a charm!

As agreed, an update from the support from Synology for those who are interested.

After trying to discuss about: should we use "version=7" or "version=6" they finally agreed that "version=7" is OK (it is given has "maxVersion" in the SYNO.API.info answer.

> https://IP:port/webapi/entry.cgi?api=SYNO.API.Info&version=1&method=query&query=SYNO.API.Auth
> {
>     "data": {
>         "SYNO.API.Auth": {
>             "maxVersion": 7,
>             "minVersion": 1,
>             "path": "entry.cgi"
>         }
>     },
>     "success": true
> }
> 

They also recognized that the issue is due to the tag "format=sid" and this is now an identified problem that will be solved in a future DSM Update.....

Dear *****,

Thank you for your feedback.

After a second confirmation, you can also use version=7 but the output will be a little different.
It will return "device_id" with version=7.

Regarding the issue you encountered before, it is mainly due to "format=sid".
We have already recorded this issue and will fix it in the future version.

Thank you for bringing this to our attention.
Hope this information helps and kindly let us know if further assistance is needed.

Best regards and thanks

@mib1185
Copy link
Contributor

mib1185 commented Mar 30, 2022

@littletruckman could you please share your ticket number with me (discord: MiB1185#1922)

@snowmangh
Copy link

Here's mine. #3033970. And many thanks for looking into this one.

@littletruckman
Copy link

And mine: #3043290
BR

@github-actions github-actions bot locked and limited conversation to collaborators Apr 29, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
integration: synology_dsm problem in device Issue lies within the device, such firmware, software, or user customization/config
Projects
None yet
Development

Successfully merging a pull request may close this issue.