Skip to content

Commit a3aabf4

Browse files
committed
add missing endpoints
1 parent 0d1e968 commit a3aabf4

2 files changed

Lines changed: 213 additions & 5 deletions

File tree

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
license = 'The MIT License',
1414
install_requires = [
1515
'python-dateutil>=2.8.1,<=2.8.2',
16-
'requests>=2.24.0,<=2.28.0'
16+
'requests>=2.24.0,<=2.28.1'
1717
],
1818
extras_require = {
1919
'dev': [
@@ -42,6 +42,8 @@
4242
'Programming Language :: Python :: 3',
4343
'Programming Language :: Python :: 3.7',
4444
'Programming Language :: Python :: 3.8',
45+
'Programming Language :: Python :: 3.9',
46+
'Programming Language :: Python :: 3.10',
4547
'Topic :: System :: Archiving :: Mirroring'
4648
],
4749
)

syncthing/__init__.py

Lines changed: 210 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def reraise(msg, exc):
4848
DEFAULT_TIMEOUT = 10.0
4949

5050
__all__ = ['SyncthingError', 'ErrorEvent', 'BaseAPI', 'System',
51-
'Database', 'Statistics', 'Syncthing',
51+
'Config', 'Cluster', 'Folder', 'Database', 'Statistics', 'Syncthing',
5252
# methods
5353
'keys_to_datetime', 'parse_datetime']
5454

@@ -169,13 +169,31 @@ def post(self, endpoint, data=None, headers=None, params=None,
169169
return self._request('POST', endpoint, data, headers, params,
170170
return_response, raw_exceptions)
171171

172+
def put(self, endpoint, data=None, headers=None, params=None,
173+
return_response=False, raw_exceptions=False):
174+
endpoint = self.prefix + endpoint
175+
return self._request('PUT', endpoint, data, headers, params,
176+
return_response, raw_exceptions)
177+
178+
def patch(self, endpoint, data=None, headers=None, params=None,
179+
return_response=False, raw_exceptions=False):
180+
endpoint = self.prefix + endpoint
181+
return self._request('PATCH', endpoint, data, headers, params,
182+
return_response, raw_exceptions)
183+
184+
def delete(self, endpoint, data=None, headers=None, params=None,
185+
return_response=False, raw_exceptions=False):
186+
endpoint = self.prefix + endpoint
187+
return self._request('DELETE', endpoint, data, headers, params,
188+
return_response, raw_exceptions)
189+
172190
def _request(self, method, endpoint, data=None, headers=None, params=None,
173191
return_response=False, raw_exceptions=False):
174192
method = method.upper()
175193

176194
endpoint = self._base_url.format(endpoint=endpoint)
177195

178-
if method not in ('GET', 'POST', 'PUT', 'DELETE'):
196+
if method not in ('GET', 'POST', 'PUT', 'PATCH', 'DELETE'):
179197
raise SyncthingError(
180198
'unsupported http verb requested, %s' % method)
181199

@@ -234,7 +252,6 @@ def _request(self, method, endpoint, data=None, headers=None, params=None,
234252
raise SyncthingError(api_err)
235253
return json_data
236254

237-
238255
class System(BaseAPI):
239256
""" HTTP REST endpoint for System calls."""
240257

@@ -442,6 +459,14 @@ def log(self):
442459
"""
443460
return self.get('log')
444461

462+
def paths(self):
463+
""" Returns the path locations used internally for storing configuration, database, and others.
464+
465+
Returns:
466+
dict
467+
"""
468+
return self.get('paths')
469+
445470
def pause(self, device):
446471
""" Pause the given device.
447472
@@ -572,6 +597,144 @@ def version(self):
572597
"""
573598
return self.get('version')
574599

600+
class Config(BaseAPI):
601+
""" HTTP REST endpoint for Config calls."""
602+
603+
prefix = '/rest/config/'
604+
605+
def config(self):
606+
return self.get('')
607+
608+
def put_config(self, config):
609+
assert isinstance(config, dict)
610+
return self.put('', data=config)
611+
612+
def restart_required(self):
613+
return self.get('restart-required')
614+
615+
def folders(self, id=None):
616+
if(id):
617+
return self.get('folders/' + id)
618+
else:
619+
return self.get('folders')
620+
621+
def put_folders(self, config, id=None):
622+
if(id):
623+
return self.put('folders/' + id, data=config)
624+
else:
625+
return self.put('folders', data=config)
626+
627+
def patch_folders(self, config, id=None):
628+
if(id):
629+
return self.patch('folders/' + id, data=config)
630+
else:
631+
return self.patch('folders', data=config)
632+
633+
def delete_folders(self, config, id):
634+
return self.delete('folders/' + id, data=config)
635+
636+
def devices(self, id=None):
637+
if(id):
638+
return self.get('devices/' + id)
639+
else:
640+
return self.get('devices')
641+
642+
def put_devices(self, config, id=None):
643+
if(id):
644+
return self.put('devices/' + id, data=config)
645+
else:
646+
return self.put('devices', data=config)
647+
648+
def patch_devices(self, config, id=None):
649+
if(id):
650+
return self.patch('devices/' + id, data=config)
651+
else:
652+
return self.patch('devices', data=config)
653+
654+
def delete_devices(self, config, id):
655+
return self.delete('devices/' + id, data=config)
656+
657+
def defaults_folder(self):
658+
return self.get('defaults/folder')
659+
660+
def put_defaults_folder(self, config):
661+
return self.put('defaults/folder', data=config)
662+
663+
def patch_defaults_folder(self, config):
664+
return self.patch('defaults/folder', data=config)
665+
666+
def defaults_device(self):
667+
return self.get('defaults/device')
668+
669+
def put_defaults_device(self, config):
670+
return self.put('defaults/device', data=config)
671+
672+
def patch_defaults_device(self, config):
673+
return self.patch('defaults/device', data=config)
674+
675+
def defaults_ignores(self):
676+
return self.get('defaults/ignores')
677+
678+
def put_defaults_ignores(self, config):
679+
return self.put('defaults/ignores', data=config)
680+
681+
def options(self):
682+
return self.get('options')
683+
684+
def put_options(self, config):
685+
return self.put('options', data=config)
686+
687+
def patch_options(self, config):
688+
return self.patch('options', data=config)
689+
690+
def ldap(self):
691+
return self.get('ldap')
692+
693+
def put_ldap(self, config):
694+
return self.put('ldap', data=config)
695+
696+
def patch_ldap(self, config):
697+
return self.patch('ldap', data=config)
698+
699+
def gui(self):
700+
return self.get('gui')
701+
702+
def put_gui(self, config):
703+
return self.put('gui', data=config)
704+
705+
def patch_gui(self, config):
706+
return self.patch('gui', data=config)
707+
708+
class Cluster(BaseAPI):
709+
""" HTTP REST endpoint for Cluster calls."""
710+
711+
prefix = '/rest/cluster/pending/'
712+
713+
def devices (self):
714+
return self.get('devices')
715+
716+
def delete_devices(self, device):
717+
return self.delete('devices', params={'device': device})
718+
719+
def folders (self, device=None):
720+
return self.get('devices', params={'device': device})
721+
722+
def delete_folders(self, folder):
723+
return self.delete('folders', params={'folder': folder})
724+
725+
class Folder(BaseAPI):
726+
""" HTTP REST endpoint for Folder calls."""
727+
728+
prefix = '/rest/folder/'
729+
730+
def errors(self, folder, page=None, perpage=None):
731+
return self.get('errors', params={'folder': folder, 'page': page, 'perpage': perpage})
732+
733+
def versions(self):
734+
return self.get('versions')
735+
736+
def post_versions(self, folder):
737+
return self.post('versions', params={'folder': folder})
575738

576739
class Database(BaseAPI):
577740
""" HTTP REST endpoint for Database calls."""
@@ -1002,6 +1165,37 @@ def report(self):
10021165
"""
10031166
return self.get('report')
10041167

1168+
class Debug(BaseAPI):
1169+
""" HTTP REST endpoint for Debug calls."""
1170+
1171+
prefix = '/rest/debug/'
1172+
1173+
def peerCompletion(self):
1174+
return self.get('peerCompletion')
1175+
1176+
def httpmetrics(self):
1177+
return self.get('httpmetrics')
1178+
1179+
def cpuprof(self):
1180+
return self.get('cpuprof')
1181+
1182+
def heapprof(self):
1183+
return self.get('heapprof')
1184+
1185+
def support(self):
1186+
return self.get('support')
1187+
1188+
def file(self, folder, file):
1189+
#params={'folder': folder, 'file': file}
1190+
return self.get('file', params={'folder': folder, 'file': file})
1191+
1192+
class Noauth(BaseAPI):
1193+
""" HTTP REST endpoint for Noauth calls."""
1194+
1195+
prefix = '/rest/noauth/'
1196+
1197+
def health(self):
1198+
return self.get('health')
10051199

10061200
class Syncthing(object):
10071201
""" Default interface for interacting with Syncthing server instance.
@@ -1016,13 +1210,20 @@ class Syncthing(object):
10161210
10171211
Attributes:
10181212
system: instance of :class:`.System`.
1213+
config: instance of :class:`.Config`.
1214+
cluster: instance of :class:`.Cluster`.
1215+
folder: instance of :class:`.Folder`.
10191216
database: instance of :class:`.Database`.
10201217
stats: instance of :class:`.Statistics`.
10211218
misc: instance of :class:`.Misc`.
1219+
debug: instance of :class:`.Debug`.
1220+
noauth:instance of :class:`.Noauth`.
10221221
10231222
Note:
1024-
- attribute :attr:`.db` is an alias of :attr:`.database`
10251223
- attribute :attr:`.sys` is an alias of :attr:`.system`
1224+
- attribute :attr:`.conf` is an alias of :attr:`.config`
1225+
- attribute :attr:`.db` is an alias of :attr:`.database`
1226+
10261227
"""
10271228

10281229
def __init__(self, api_key, host='localhost', port=8384,
@@ -1047,9 +1248,14 @@ def __init__(self, api_key, host='localhost', port=8384,
10471248
}
10481249

10491250
self.system = self.sys = System(api_key, **kwargs)
1251+
self.config = self.conf = Config(api_key, **kwargs)
1252+
self.cluster = Cluster(api_key, **kwargs)
1253+
self.folder = Folder(api_key, **kwargs)
10501254
self.database = self.db = Database(api_key, **kwargs)
10511255
self.stats = Statistics(api_key, **kwargs)
10521256
self.misc = Misc(api_key, **kwargs)
1257+
self.debug = Debug(api_key, **kwargs)
1258+
self.noauth = Noauth(api_key, **kwargs)
10531259

10541260
def events(self, last_seen_id=None, filters=None, **kwargs):
10551261
kw = dict(self.__kwargs)

0 commit comments

Comments
 (0)