can get device id

master
B.J. Dweck 2021-01-28 15:31:25 +02:00
parent 3c0eece311
commit 3d90ed0708
8 changed files with 196 additions and 22 deletions

3
.env
View File

@ -2,6 +2,3 @@ SYNCTHING_VERSION=latest
PUID=1001
PGID=1001
TZ=Europe/London
SYNC_LISTEN_PORT=22000
SYNC1_LISTEN_PORT=22100
SYNC2_LISTEN_PORT=22101

View File

@ -8,15 +8,19 @@ services:
- sync1
- sync2
volumes:
- sync1data:/data1
- sync2data:/data2
- sync1data:/data1
- sync2data:/data2
networks:
- syncnet
sut1:
build: .
links:
- sync1
- sync1:sync
volumes:
- sync1config:/config:ro
- sync1config:/config
networks:
- syncnet
sync1:
image: ghcr.io/linuxserver/syncthing:${SYNCTHING_VERSION}
@ -27,15 +31,17 @@ services:
volumes:
- sync1config:/config
- sync1data:/data
ports:
- ${SYNC1_LISTEN_PORT}:22000
networks:
- syncnet
sut2:
build: .
links:
- sync2
- sync2:sync
volumes:
- sync2config:/config:ro
- sync2config:/config
networks:
- syncnet
sync2:
image: ghcr.io/linuxserver/syncthing:${SYNCTHING_VERSION}
@ -46,21 +52,23 @@ services:
volumes:
- sync2config:/config
- sync2data:/data
ports:
- ${SYNC2_LISTEN_PORT}:22000
networks:
- syncnet
etcd:
image: quay.io/coreos/etcd
command: /usr/local/bin/etcd --data-dir=/etcd-data
ports:
- 2379:2379
- 2380:2380
volumes:
- etcd-data:/etcd-data
- etcd-data:/etcd-data
networks:
- syncnet
volumes:
sync1data:
sync1config:
sync2data:
sync2config:
etcd-data:
etcd-data:
networks:
syncnet:

View File

@ -0,0 +1,2 @@
retrying
requests

View File

@ -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()
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__":
loop()

View File

@ -8,3 +8,13 @@ def parse_api_key(xml_path='/config/config.xml'):
# noinspection SpellCheckingInspection
api_key = gui.find('apikey').text
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)

View 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"]

View 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>

View File

@ -1,10 +1,35 @@
import io
import os
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):
def test_can_parse_api_key(self):
# 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)