can get device id
This commit is contained in:
parent
3c0eece311
commit
3d90ed0708
3
.env
3
.env
|
@ -2,6 +2,3 @@ SYNCTHING_VERSION=latest
|
||||||
PUID=1001
|
PUID=1001
|
||||||
PGID=1001
|
PGID=1001
|
||||||
TZ=Europe/London
|
TZ=Europe/London
|
||||||
SYNC_LISTEN_PORT=22000
|
|
||||||
SYNC1_LISTEN_PORT=22100
|
|
||||||
SYNC2_LISTEN_PORT=22101
|
|
||||||
|
|
|
@ -8,15 +8,19 @@ services:
|
||||||
- sync1
|
- sync1
|
||||||
- sync2
|
- sync2
|
||||||
volumes:
|
volumes:
|
||||||
- sync1data:/data1
|
- sync1data:/data1
|
||||||
- sync2data:/data2
|
- sync2data:/data2
|
||||||
|
networks:
|
||||||
|
- syncnet
|
||||||
|
|
||||||
sut1:
|
sut1:
|
||||||
build: .
|
build: .
|
||||||
links:
|
links:
|
||||||
- sync1
|
- sync1:sync
|
||||||
volumes:
|
volumes:
|
||||||
- sync1config:/config:ro
|
- sync1config:/config
|
||||||
|
networks:
|
||||||
|
- syncnet
|
||||||
|
|
||||||
sync1:
|
sync1:
|
||||||
image: ghcr.io/linuxserver/syncthing:${SYNCTHING_VERSION}
|
image: ghcr.io/linuxserver/syncthing:${SYNCTHING_VERSION}
|
||||||
|
@ -27,15 +31,17 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- sync1config:/config
|
- sync1config:/config
|
||||||
- sync1data:/data
|
- sync1data:/data
|
||||||
ports:
|
networks:
|
||||||
- ${SYNC1_LISTEN_PORT}:22000
|
- syncnet
|
||||||
|
|
||||||
sut2:
|
sut2:
|
||||||
build: .
|
build: .
|
||||||
links:
|
links:
|
||||||
- sync2
|
- sync2:sync
|
||||||
volumes:
|
volumes:
|
||||||
- sync2config:/config:ro
|
- sync2config:/config
|
||||||
|
networks:
|
||||||
|
- syncnet
|
||||||
|
|
||||||
sync2:
|
sync2:
|
||||||
image: ghcr.io/linuxserver/syncthing:${SYNCTHING_VERSION}
|
image: ghcr.io/linuxserver/syncthing:${SYNCTHING_VERSION}
|
||||||
|
@ -46,21 +52,23 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- sync2config:/config
|
- sync2config:/config
|
||||||
- sync2data:/data
|
- sync2data:/data
|
||||||
ports:
|
networks:
|
||||||
- ${SYNC2_LISTEN_PORT}:22000
|
- syncnet
|
||||||
|
|
||||||
etcd:
|
etcd:
|
||||||
image: quay.io/coreos/etcd
|
image: quay.io/coreos/etcd
|
||||||
command: /usr/local/bin/etcd --data-dir=/etcd-data
|
command: /usr/local/bin/etcd --data-dir=/etcd-data
|
||||||
ports:
|
|
||||||
- 2379:2379
|
|
||||||
- 2380:2380
|
|
||||||
volumes:
|
volumes:
|
||||||
- etcd-data:/etcd-data
|
- etcd-data:/etcd-data
|
||||||
|
networks:
|
||||||
|
- syncnet
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
sync1data:
|
sync1data:
|
||||||
sync1config:
|
sync1config:
|
||||||
sync2data:
|
sync2data:
|
||||||
sync2config:
|
sync2config:
|
||||||
etcd-data:
|
etcd-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
syncnet:
|
|
@ -0,0 +1,2 @@
|
||||||
|
retrying
|
||||||
|
requests
|
|
@ -1,10 +1,17 @@
|
||||||
from syncthing_monitor.config_xml import parse_api_key
|
from syncthing_monitor.config_xml import parse_api_key, set_listen_ip_to_any
|
||||||
|
from syncthing_monitor.syncthing_rest import get_device_id
|
||||||
|
|
||||||
|
|
||||||
def loop():
|
def loop(gui_port="8384", host="sync"):
|
||||||
|
|
||||||
api_key = parse_api_key()
|
api_key = parse_api_key()
|
||||||
print("Found API Key: {0}".format(api_key))
|
print("Found API Key: {0}".format(api_key))
|
||||||
|
|
||||||
|
set_listen_ip_to_any()
|
||||||
|
|
||||||
|
device_id = get_device_id(host, gui_port, api_key)
|
||||||
|
print("Found Device ID: {0}".format(device_id))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
loop()
|
loop()
|
||||||
|
|
|
@ -8,3 +8,13 @@ def parse_api_key(xml_path='/config/config.xml'):
|
||||||
# noinspection SpellCheckingInspection
|
# noinspection SpellCheckingInspection
|
||||||
api_key = gui.find('apikey').text
|
api_key = gui.find('apikey').text
|
||||||
return api_key
|
return api_key
|
||||||
|
|
||||||
|
|
||||||
|
def set_listen_ip_to_any(in_xml_path='/config/config.xml', out_xml_path='/config/config.xml', gui_port='8384'):
|
||||||
|
with open(in_xml_path, 'r') as file:
|
||||||
|
xml = file.read()
|
||||||
|
|
||||||
|
xml = xml.replace("127.0.0.1:8384", "0.0.0.0:"+gui_port)
|
||||||
|
|
||||||
|
with open(out_xml_path, 'w') as file:
|
||||||
|
file.write(xml)
|
||||||
|
|
11
syncthing_monitor/syncthing_rest.py
Normal file
11
syncthing_monitor/syncthing_rest.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from retrying import retry
|
||||||
|
|
||||||
|
|
||||||
|
@retry
|
||||||
|
def get_device_id(host, gui_port, api_key):
|
||||||
|
syncthing_headers = {'X-API-Key': api_key}
|
||||||
|
response = requests.get("http://" + host + ":" + gui_port + "/rest/system/status", headers=syncthing_headers)
|
||||||
|
return json.loads(response.content)["myID"]
|
114
test/test-syncthing-config-any-ip.xml
Normal file
114
test/test-syncthing-config-any-ip.xml
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
<configuration version="32">
|
||||||
|
<folder id="data" label="Data" path="/data" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
|
||||||
|
<filesystemType>basic</filesystemType>
|
||||||
|
<device id="MKXXCDW-3YWBXU4-PWJZU5P-VFOPIMT-22L7BAY-7GZY4I5-TQMLIYY-JSILEQC" introducedBy="">
|
||||||
|
<encryptionPassword></encryptionPassword>
|
||||||
|
</device>
|
||||||
|
<device id="OSRS6BZ-WRXI67N-55XSQSH-X64E4CL-52D7BGZ-7X2CPEX-OMUZ42H-F52URAI" introducedBy="">
|
||||||
|
<encryptionPassword></encryptionPassword>
|
||||||
|
</device>
|
||||||
|
<minDiskFree unit="%">1</minDiskFree>
|
||||||
|
<versioning>
|
||||||
|
<cleanupIntervalS>0</cleanupIntervalS>
|
||||||
|
</versioning>
|
||||||
|
<copiers>0</copiers>
|
||||||
|
<pullerMaxPendingKiB>0</pullerMaxPendingKiB>
|
||||||
|
<hashers>0</hashers>
|
||||||
|
<order>random</order>
|
||||||
|
<ignoreDelete>false</ignoreDelete>
|
||||||
|
<scanProgressIntervalS>0</scanProgressIntervalS>
|
||||||
|
<pullerPauseS>0</pullerPauseS>
|
||||||
|
<maxConflicts>10</maxConflicts>
|
||||||
|
<disableSparseFiles>false</disableSparseFiles>
|
||||||
|
<disableTempIndexes>false</disableTempIndexes>
|
||||||
|
<paused>false</paused>
|
||||||
|
<weakHashThresholdPct>25</weakHashThresholdPct>
|
||||||
|
<markerName>.stfolder</markerName>
|
||||||
|
<copyOwnershipFromParent>false</copyOwnershipFromParent>
|
||||||
|
<modTimeWindowS>0</modTimeWindowS>
|
||||||
|
<maxConcurrentWrites>2</maxConcurrentWrites>
|
||||||
|
<disableFsync>false</disableFsync>
|
||||||
|
<blockPullOrder>standard</blockPullOrder>
|
||||||
|
<copyRangeMethod>standard</copyRangeMethod>
|
||||||
|
<caseSensitiveFS>false</caseSensitiveFS>
|
||||||
|
<junctionsAsDirs>false</junctionsAsDirs>
|
||||||
|
</folder>
|
||||||
|
<device id="MKXXCDW-3YWBXU4-PWJZU5P-VFOPIMT-22L7BAY-7GZY4I5-TQMLIYY-JSILEQC" name="honeydew" compression="metadata" introducer="false" skipIntroductionRemovals="false" introducedBy="">
|
||||||
|
<address>dynamic</address>
|
||||||
|
<paused>false</paused>
|
||||||
|
<allowedNetwork>10.122.122.0/24</allowedNetwork>
|
||||||
|
<autoAcceptFolders>false</autoAcceptFolders>
|
||||||
|
<maxSendKbps>0</maxSendKbps>
|
||||||
|
<maxRecvKbps>0</maxRecvKbps>
|
||||||
|
<maxRequestKiB>0</maxRequestKiB>
|
||||||
|
<untrusted>false</untrusted>
|
||||||
|
<remoteGUIPort>0</remoteGUIPort>
|
||||||
|
</device>
|
||||||
|
<device id="OSRS6BZ-WRXI67N-55XSQSH-X64E4CL-52D7BGZ-7X2CPEX-OMUZ42H-F52URAI" name="blackberry" compression="metadata" introducer="false" skipIntroductionRemovals="false" introducedBy="">
|
||||||
|
<address>tcp://blackberry</address>
|
||||||
|
<paused>false</paused>
|
||||||
|
<allowedNetwork>10.122.122.0/24</allowedNetwork>
|
||||||
|
<autoAcceptFolders>false</autoAcceptFolders>
|
||||||
|
<maxSendKbps>0</maxSendKbps>
|
||||||
|
<maxRecvKbps>0</maxRecvKbps>
|
||||||
|
<maxRequestKiB>0</maxRequestKiB>
|
||||||
|
<untrusted>false</untrusted>
|
||||||
|
<remoteGUIPort>0</remoteGUIPort>
|
||||||
|
</device>
|
||||||
|
<gui enabled="true" tls="false" debugging="true">
|
||||||
|
<address>0.0.0.0:8384</address>
|
||||||
|
<user>syncadmin</user>
|
||||||
|
<password>$2a$10$.nzDwmF2w9gWfPFWto1wmOOek4RzEF/MlolVyzOLsOCXL733IleVC</password>
|
||||||
|
<apikey>dFoLNEaqEZFSP62EFVGC2Ds5juuTmvH2</apikey>
|
||||||
|
<theme>default</theme>
|
||||||
|
</gui>
|
||||||
|
<ldap></ldap>
|
||||||
|
<options>
|
||||||
|
<listenAddress>default</listenAddress>
|
||||||
|
<globalAnnounceServer>default</globalAnnounceServer>
|
||||||
|
<globalAnnounceEnabled>false</globalAnnounceEnabled>
|
||||||
|
<localAnnounceEnabled>false</localAnnounceEnabled>
|
||||||
|
<localAnnouncePort>21027</localAnnouncePort>
|
||||||
|
<localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr>
|
||||||
|
<maxSendKbps>0</maxSendKbps>
|
||||||
|
<maxRecvKbps>0</maxRecvKbps>
|
||||||
|
<reconnectionIntervalS>60</reconnectionIntervalS>
|
||||||
|
<relaysEnabled>false</relaysEnabled>
|
||||||
|
<relayReconnectIntervalM>10</relayReconnectIntervalM>
|
||||||
|
<startBrowser>true</startBrowser>
|
||||||
|
<natEnabled>false</natEnabled>
|
||||||
|
<natLeaseMinutes>60</natLeaseMinutes>
|
||||||
|
<natRenewalMinutes>30</natRenewalMinutes>
|
||||||
|
<natTimeoutSeconds>10</natTimeoutSeconds>
|
||||||
|
<urAccepted>-1</urAccepted>
|
||||||
|
<urSeen>3</urSeen>
|
||||||
|
<urUniqueID></urUniqueID>
|
||||||
|
<urURL>https://data.syncthing.net/newdata</urURL>
|
||||||
|
<urPostInsecurely>false</urPostInsecurely>
|
||||||
|
<urInitialDelayS>1800</urInitialDelayS>
|
||||||
|
<restartOnWakeup>true</restartOnWakeup>
|
||||||
|
<autoUpgradeIntervalH>12</autoUpgradeIntervalH>
|
||||||
|
<upgradeToPreReleases>false</upgradeToPreReleases>
|
||||||
|
<keepTemporariesH>24</keepTemporariesH>
|
||||||
|
<cacheIgnoredFiles>false</cacheIgnoredFiles>
|
||||||
|
<progressUpdateIntervalS>5</progressUpdateIntervalS>
|
||||||
|
<limitBandwidthInLan>false</limitBandwidthInLan>
|
||||||
|
<minHomeDiskFree unit="%">1</minHomeDiskFree>
|
||||||
|
<releasesURL>https://upgrades.syncthing.net/meta.json</releasesURL>
|
||||||
|
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
|
||||||
|
<tempIndexMinBlocks>10</tempIndexMinBlocks>
|
||||||
|
<trafficClass>0</trafficClass>
|
||||||
|
<defaultFolderPath>~</defaultFolderPath>
|
||||||
|
<setLowPriority>true</setLowPriority>
|
||||||
|
<maxFolderConcurrency>0</maxFolderConcurrency>
|
||||||
|
<crashReportingURL>https://crash.syncthing.net/newcrash</crashReportingURL>
|
||||||
|
<crashReportingEnabled>false</crashReportingEnabled>
|
||||||
|
<stunKeepaliveStartS>180</stunKeepaliveStartS>
|
||||||
|
<stunKeepaliveMinS>20</stunKeepaliveMinS>
|
||||||
|
<stunServer>default</stunServer>
|
||||||
|
<databaseTuning>auto</databaseTuning>
|
||||||
|
<maxConcurrentIncomingRequestKiB>0</maxConcurrentIncomingRequestKiB>
|
||||||
|
<announceLANAddresses>false</announceLANAddresses>
|
||||||
|
<sendFullIndexOnUpgrade>false</sendFullIndexOnUpgrade>
|
||||||
|
</options>
|
||||||
|
</configuration>
|
|
@ -1,10 +1,35 @@
|
||||||
|
import io
|
||||||
|
import os
|
||||||
import unittest
|
import unittest
|
||||||
|
from os import path
|
||||||
|
|
||||||
from syncthing_monitor.config_xml import parse_api_key
|
from syncthing_monitor.config_xml import parse_api_key, set_listen_ip_to_any
|
||||||
|
|
||||||
|
SYNCTHING_TEST_CONFIG_XML = 'test/test-syncthing-config.xml'
|
||||||
|
|
||||||
|
EXPECTED_API_KEY = "dFoLNEaqEZFSP62EFVGC2Ds5juuTmvH2"
|
||||||
|
SYNCTHING_EXPECTED_ANY_IP_CONFIG_XML = 'test/test-syncthing-config-any-ip.xml'
|
||||||
|
|
||||||
|
TEST_OUT_XML = 'test/out.xml'
|
||||||
|
|
||||||
|
|
||||||
|
def read_file(filename=TEST_OUT_XML):
|
||||||
|
with open(filename, 'r') as file:
|
||||||
|
return file.read()
|
||||||
|
|
||||||
|
|
||||||
class ConfigTests(unittest.TestCase):
|
class ConfigTests(unittest.TestCase):
|
||||||
|
|
||||||
def test_can_parse_api_key(self):
|
def test_can_parse_api_key(self):
|
||||||
# noinspection SpellCheckingInspection
|
# noinspection SpellCheckingInspection
|
||||||
self.assertEqual(parse_api_key('test/test-syncthing-config.xml'), "dFoLNEaqEZFSP62EFVGC2Ds5juuTmvH2")
|
self.assertEqual(parse_api_key(SYNCTHING_TEST_CONFIG_XML), EXPECTED_API_KEY)
|
||||||
|
|
||||||
|
def test_can_set_listen_ip_to_any(self):
|
||||||
|
set_listen_ip_to_any(SYNCTHING_TEST_CONFIG_XML, TEST_OUT_XML)
|
||||||
|
self.assertListEqual(
|
||||||
|
list(io.open(TEST_OUT_XML)),
|
||||||
|
list(io.open(SYNCTHING_EXPECTED_ANY_IP_CONFIG_XML)))
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
if path.exists(TEST_OUT_XML):
|
||||||
|
os.remove(TEST_OUT_XML)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user