This gem provides bindings for SyncthingREST API
Add this line to your application's Gemfile:
gem'syncthing'And then execute:
$ bundle
Or install it yourself as:
$ gem install syncthing
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| api_key | string | API key | Yes |
| api_url | string | Url to connect to. Default is localhost:8080 | No |
Make a new instance of SyncthingClinet with API key and url — let's shake!
2.1.2:001 > sc=SyncthingClient.new('BO6406JTI3NH879QRHOGU840PL8702')=>#<SyncthingClient:0x007ffb1f1102c0 @syncthing_url="https://localhost:8080/rest", @syncthing_apikey="BO6406JTI3NH879QRHOGU840PL8702"> returns current version
2.1.2:002 > sc.get_version=>{"arch"=>"amd64","longVersion"=>"syncthing v0.11.9 (go1.4.2 darwin-amd64 default) unknown-user@syncthing-builder 2015-06-14 11:52:00 UTC","os"=>"darwin","version"=>"v0.11.9"}Returns current connections
2.1.2:003 > sc.get_connections=>{"connections"=>{},"total"=>{"address"=>"","at"=>"2015-06-20T09:15:35.066466715+06:00","clientVersion"=>"","inBytesTotal"=>0,"outBytesTotal"=>0}}Returns current syncthing config
2.1.2:004 > sc.get_config=>{"version"=>10,"folders"=>[{"id"=>"123","path"=>"/Users/retgoat/workspace/tapp","devices"=>[{"deviceID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT"}],"readOnly"=>true,"rescanIntervalS"=>60,"ignorePerms"=>false,"autoNormalize"=>true,"versioning"=>{"type"=>"simple","params"=>{"keep"=>"5"}},"copiers"=>1,"pullers"=>16,"hashers"=>0,"order"=>"smallestFirst","invalid"=>""}],"devices"=>[{"deviceID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT","name"=>"iMac-Roman.local","addresses"=>["dynamic"],"compression"=>"metadata","certName"=>"","introducer"=>false}],"gui"=>{"enabled"=>true,"address"=>"127.0.0.1:8080","user"=>"","password"=>"","useTLS"=>true,"apiKey"=>"BO6406JTI3NH879QRHOGU840PL8702"},"options"=>{"listenAddress"=>["0.0.0.0:22000"],"globalAnnounceServers"=>["udp4://announce.syncthing.net:22025"],"globalAnnounceEnabled"=>true,"localAnnounceEnabled"=>true,"localAnnouncePort"=>21025,"localAnnounceMCAddr"=>"[ff32::5222]:21026","maxSendKbps"=>0,"maxRecvKbps"=>0,"reconnectionIntervalS"=>60,"startBrowser"=>true,"upnpEnabled"=>true,"upnpLeaseMinutes"=>60,"upnpRenewalMinutes"=>30,"upnpTimeoutSeconds"=>10,"urAccepted"=>1,"urUniqueId"=>"Dr9WJK-1","restartOnWakeup"=>true,"autoUpgradeIntervalH"=>12,"keepTemporariesH"=>24,"cacheIgnoredFiles"=>true,"progressUpdateIntervalS"=>5,"symlinksEnabled"=>true,"limitBandwidthInLan"=>false,"databaseBlockCacheMiB"=>0},"ignoredDevices"=>[]}Returns current insync condition
2.1.2:005 > sc.get_insync=>{"configInSync"=>true}Returns raised and not cleared errors
sc.get_errors=>{"errors"=>[]}Returns local discovery hash
2.1.2:003 > sc.get_discovery=>{}Raises a new error with given message. Returns code 200 on success.
sc.new_error('foo')=>{:code=>200,:message=>"Completed successfully"}Clears previously rised errors. Returns code 200 on success.
2.1.2:005 > sc.clear_errors=>{:code=>200,:message=>"Completed successfully"}Uploads a new config to syncthing server.
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| config | hash | New syncthing config | Yes |
cfg={"version"=>10,"folders"=>[{"id"=>"123","path"=>"/Users/retgoat/workspace/tapp","devices"=>[{"deviceID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT"}],"readOnly"=>true,"rescanIntervalS"=>60,"ignorePerms"=>false,"autoNormalize"=>true,"versioning"=>{"type"=>"simple","params"=>{"keep"=>"5"}},"copiers"=>1,"pullers"=>16,"hashers"=>0,"order"=>"smallestFirst","invalid"=>""}],"devices"=>[{"deviceID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT","name"=>"iMac-Roman.local","addresses"=>["dynamic"],"compression"=>"metadata","certName"=>"","introducer"=>false}],"gui"=>{"enabled"=>true,"address"=>"127.0.0.1:8080","user"=>"","password"=>"","useTLS"=>true,"apiKey"=>"BO6406JTI3NH879QRHOGU840PL8702"},"options"=>{"listenAddress"=>["0.0.0.0:22000"],"globalAnnounceServers"=>["udp4://announce.syncthing.net:22025"],"globalAnnounceEnabled"=>true,"localAnnounceEnabled"=>true,"localAnnouncePort"=>21025,"localAnnounceMCAddr"=>"[ff32::5222]:21026","maxSendKbps"=>0,"maxRecvKbps"=>0,"reconnectionIntervalS"=>60,"startBrowser"=>true,"upnpEnabled"=>true,"upnpLeaseMinutes"=>60,"upnpRenewalMinutes"=>30,"upnpTimeoutSeconds"=>10,"urAccepted"=>1,"urUniqueId"=>"Dr9WJK-1","restartOnWakeup"=>true,"autoUpgradeIntervalH"=>12,"keepTemporariesH"=>24,"cacheIgnoredFiles"=>true,"progressUpdateIntervalS"=>5,"symlinksEnabled"=>true,"limitBandwidthInLan"=>false,"databaseBlockCacheMiB"=>0},"ignoredDevices"=>[]}=>{"version"=>10,"folders"=>[{"id"=>"123","path"=>"/Users/retgoat/workspace/tapp","devices"=>[{"deviceID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT"}],"readOnly"=>true,"rescanIntervalS"=>60,"ignorePerms"=>false,"autoNormalize"=>true,"versioning"=>{"type"=>"simple","params"=>{"keep"=>"5"}},"copiers"=>1,"pullers"=>16,"hashers"=>0,"order"=>"smallestFirst","invalid"=>""}],"devices"=>[{"deviceID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT","name"=>"iMac-Roman.local","addresses"=>["dynamic"],"compression"=>"metadata","certName"=>"","introducer"=>false}],"gui"=>{"enabled"=>true,"address"=>"127.0.0.1:8080","user"=>"","password"=>"","useTLS"=>true,"apiKey"=>"BO6406JTI3NH879QRHOGU840PL8702"},"options"=>{"listenAddress"=>["0.0.0.0:22000"],"globalAnnounceServers"=>["udp4://announce.syncthing.net:22025"],"globalAnnounceEnabled"=>true,"localAnnounceEnabled"=>true,"localAnnouncePort"=>21025,"localAnnounceMCAddr"=>"[ff32::5222]:21026","maxSendKbps"=>0,"maxRecvKbps"=>0,"reconnectionIntervalS"=>60,"startBrowser"=>true,"upnpEnabled"=>true,"upnpLeaseMinutes"=>60,"upnpRenewalMinutes"=>30,"upnpTimeoutSeconds"=>10,"urAccepted"=>1,"urUniqueId"=>"Dr9WJK-1","restartOnWakeup"=>true,"autoUpgradeIntervalH"=>12,"keepTemporariesH"=>24,"cacheIgnoredFiles"=>true,"progressUpdateIntervalS"=>5,"symlinksEnabled"=>true,"limitBandwidthInLan"=>false,"databaseBlockCacheMiB"=>0},"ignoredDevices"=>[]}2.1.2:012 > sc.new_configcfg=>{:code=>200,:message=>"Completed successfully"}Will restart syncthing server
2.1.2:002 > sc.restart!=>{"ok"=>"restarting"}This means renaming all repository directories to temporary, unique names, wiping all indexes and restarting.
This should probably not be used during normal operations...
sc.reset!=>{"ok"=>"resetting database"}sc.shutdown!=>{"ok"=>"shutting down"}Check for the new veersion
2.1.2:003 > sc.upgrade=>{"latest"=>"v0.11.9","majorNewer"=>false,"newer"=>false,"running"=>"v0.11.9"}Perform an upgrade and restart if new version exists. Does nothing if current version is latest.
2.1.2:003 > sc.upgrade!=>{:code=>200,:message=>"Completed successfully"}Returns current status
2.1.2:005 > sc.get_status=>{"alloc"=>7061984,"cpuPercent"=>0.07942980406638137,"extAnnounceOK"=>{"udp4://announce.syncthing.net:22025"=>false},"goroutines"=>58,"myID"=>"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT","pathSeparator"=>"/","sys"=>22104312,"tilde"=>"/Users/retgoat","uptime"=>198}Returns a {"ping":"pong"} object
2.1.2:006 > sc.get_ping=>{"ping"=>"pong"}Doing exactly the same as get_ping but API key is required (for get_ping it isn't). However, SyncthingClient is always using it. So, there is no difference between these two methods.
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | Name of a database | Yes |
| level | int | Depth of a list. Default is 0 — maximum depth | No |
| prefix | string | Path to directory or subdirectory to start from | No |
Returns files in given folder
2.1.2:010 > sc.browse_databse'123'=>{".rspec"=>["2014-07-18T18:42:16+07:00",8],"Gemfile"=>["2015-06-16T08:09:23+06:00",1267],"Gemfile.lock"=>["2015-06-16T08:09:27+06:00",3224],"README.rdoc"=>["2014-04-29T15:40:52+07:00",478],"Rakefile"=>["2014-04-29T15:40:52+07:00",249],"app"=>{"assets"=>{"images"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"javascripts"=>{"application.js"=>["2014-04-29T15:40:52+07:00",664],"index.js.coffee"=>["2014-04-29T15:42:29+07:00",211]},"stylesheets"=>{"application.css"=>["2014-04-29T15:40:52+07:00",546],"index.css.scss"=>["2014-04-29T15:42:29+07:00",176]}},"controllers"=>{"application_controller.rb"=>["2014-04-29T15:40:52+07:00",204],"concerns"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"index_controller.rb"=>["2015-04-28T14:10:00+06:00",70]},"helpers"=>{"application_helper.rb"=>["2014-04-29T15:40:52+07:00",29],"index_helper.rb"=>["2014-04-29T15:42:29+07:00",23]},"mailers"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"models"=>{".keep"=>["2014-04-29T15:40:52+07:00",0],"Profile.rb"=>["2014-07-18T18:35:04+07:00",244],"concerns"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]}},"views"=>{"index"=>{"index.html.erb"=>["2015-06-15T18:45:28+06:00",8383]},"layouts"=>{"application.html.erb"=>["2014-07-17T14:29:29+07:00",399]}}},"bin"=>{"bundle"=>["2014-04-29T15:40:52+07:00",129],"rails"=>["2014-04-29T15:40:52+07:00",146],"rake"=>["2014-04-29T15:40:52+07:00",90]},"config"=>{"application.rb"=>["2014-04-29T15:40:52+07:00",981],"boot.rb"=>["2014-04-29T15:40:52+07:00",171],"database.yml"=>["2014-04-29T15:40:52+07:00",576],"environment.rb"=>["2014-04-29T15:40:52+07:00",150],"environments"=>{"development.rb"=>["2015-04-28T14:09:54+06:00",1484],"production.rb"=>["2014-04-29T15:40:52+07:00",3248],"test.rb"=>["2014-04-29T15:40:52+07:00",1558]},"initializers"=>{"backtrace_silencers.rb"=>["2014-04-29T15:40:52+07:00",404],"filter_parameter_logging.rb"=>["2014-04-29T15:40:52+07:00",194],"inflections.rb"=>["2014-04-29T15:40:52+07:00",647],"mime_types.rb"=>["2014-04-29T15:40:52+07:00",205],"secret_token.rb"=>["2014-04-29T15:40:52+07:00",658],"session_store.rb"=>["2014-04-29T15:40:52+07:00",136],"wrap_parameters.rb"=>["2014-04-29T15:40:52+07:00",517]},"locales"=>{"en.yml"=>["2014-04-29T15:40:52+07:00",634]},"routes.rb"=>["2014-04-29T15:42:51+07:00",1617]},"config.ru"=>["2014-05-23T13:46:38+07:00",154],"db"=>{"development.sqlite3"=>["2014-04-29T15:43:10+07:00",0],"seeds.rb"=>["2014-04-29T15:40:52+07:00",343],"test.sqlite3"=>["2014-07-18T18:43:42+07:00",0]},"lib"=>{"assets"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"tasks"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]}},"log"=>{".keep"=>["2014-04-29T15:40:52+07:00",0],"development.log"=>["2015-06-15T18:45:44+06:00",1068452],"test.log"=>["2014-07-18T18:46:45+07:00",388]},"public"=>{"404.html"=>["2014-04-29T15:40:52+07:00",1351],"422.html"=>["2014-04-29T15:40:52+07:00",1334],"500.html"=>["2014-04-29T15:40:52+07:00",1266],"favicon.ico"=>["2014-04-29T15:40:52+07:00",0],"robots.txt"=>["2014-04-29T15:40:52+07:00",204]},"spec"=>{"models"=>{"profile_spec.rb"=>["2014-07-18T18:46:41+07:00",204]},"spec_helper.rb"=>["2014-07-18T18:42:16+07:00",1643]},"test"=>{"controllers"=>{".keep"=>["2014-04-29T15:40:52+07:00",0],"index_controller_test.rb"=>["2014-04-29T15:42:29+07:00",162]},"fixtures"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"helpers"=>{".keep"=>["2014-04-29T15:40:52+07:00",0],"index_helper_test.rb"=>["2014-04-29T15:42:29+07:00",72]},"integration"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"mailers"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"models"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"test_helper.rb"=>["2014-04-29T15:40:52+07:00",492]},"tmp"=>{"cache"=>{"assets"=>{"development"=>{"sass"=>{"89feb0728f707c47a29d048edba3bf45e1ee8d15"=>{"index.css.scssc"=>["2014-04-29T15:43:10+07:00",628]}},"sprockets"=>{"04b6ee5372eb476903f644a722c4a495"=>["2014-04-29T15:43:10+07:00",398],"1093e36c1224ea4fe59ffdbc49d2b650"=>["2015-04-06T15:49:41+06:00",283415],"13fe41fee1fe35b49d145bcc06610705"=>["2014-04-29T15:43:10+07:00",922],"240ba0c0bcf617484d938fb7e77c612c"=>["2014-04-29T15:43:11+07:00",19366],"2f5173deea6c795b8fdde723bb4b63af"=>["2015-04-06T15:49:41+06:00",2425],"357970feca3ac29060c1e3861e2c0953"=>["2014-04-29T15:43:10+07:00",922],"38ee972e64d80f83b2fb54fbfaa3d1f9"=>["2015-04-06T15:49:41+06:00",16051],"41b411e5ea893da4b029d87c32e1c459"=>["2015-04-06T15:49:41+06:00",283415],"665e3c6c09ff1386e81473b096af14a5"=>["2014-04-29T15:43:11+07:00",699],"6f7cf560440e87c65a0e2bb4eafbd539"=>["2014-04-29T15:43:11+07:00",16056],"7c50eb7a8092e60c53cf8040f3b6d7d9"=>["2014-04-29T15:43:11+07:00",19366],"7f93ed4e723555db3219b6dcc1f38066"=>["2014-04-29T15:43:10+07:00",283788],"86a2f746b74fd2fc1e1a2758c377976d"=>["2014-04-29T15:43:11+07:00",16056],"9527d6c0ff83e08eb455eee782454eb8"=>["2014-04-29T15:43:11+07:00",443],"97417525be96730f55e03b0e709d6cff"=>["2015-04-06T15:49:41+06:00",16417],"97b02c9bfb861b59461dada7481ba655"=>["2015-04-06T15:49:41+06:00",19361],"9a93606ff987b0e40fa2eab9807f1795"=>["2014-04-29T15:43:11+07:00",283420],"a2200720e330965509460d82fe403934"=>["2014-04-29T15:43:10+07:00",652],"b0475a0dc287fcb33712767b43f64830"=>["2015-04-06T15:49:41+06:00",16051],"c05a25bd74345009c47e7f428bec1166"=>["2014-04-29T15:43:11+07:00",19746],"cdbc1151dab8bde9a96ea4d6305964ce"=>["2015-04-06T15:49:41+06:00",19361],"cffd775d018f68ce5dba1ee0d951a994"=>["2014-04-29T15:43:11+07:00",318443],"d0f5e8d8a2b644f9d7e25eb746857689"=>["2014-04-29T15:43:10+07:00",398],"d274fc4f3d6ee61a2eb6491ce44b8b5b"=>["2014-04-29T15:43:11+07:00",283420],"d771ace226fc8215a3572e0aa35bb0d6"=>["2014-04-29T15:43:10+07:00",1531],"e5fb54cb160fe0deabaa5df8f73edc3a"=>["2015-04-06T15:49:41+06:00",283773],"f10381530f627eb50aa84a64c645accf"=>["2015-04-06T15:49:41+06:00",19731],"f78c51de563675fb3abc0851a6644097"=>["2014-04-29T15:43:10+07:00",16432],"f7cbd26ba1d28d48de824f0e94586655"=>["2015-04-06T15:49:41+06:00",2425],"f925bbaa6d6a4ce22ba1f3fb2e416561"=>["2014-04-29T15:43:11+07:00",443]}}}},"pids"=>{},"sessions"=>{},"sockets"=>{}},"vendor"=>{"assets"=>{"javascripts"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]},"stylesheets"=>{".keep"=>["2014-04-29T15:40:52+07:00",0]}}}}2.1.2:004 > sc.browse_databse'123',0,'app/assets/images'=>{".keep"=>["2014-04-29T15:40:52+07:00",0]}Returns completion in persentage (0-100) for given device and folder
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| device | string | device_id | Yes |
| folder | string | folder name | Yes |
2.1.2:005 > sc.get_completion'7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT','123'=>{"completion"=>0}Returns info for given file
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| file | string | file name | Yes |
2.1.2:010 > sc.get_file'README.md'=>{"availability"=>nil,"global"=>{"flags"=>"0","localVersion"=>0,"modified"=>"1970-01-01T07:00:00+07:00","name"=>"","numBlocks"=>0,"size"=>0,"version"=>[]},"local"=>{"flags"=>"0","localVersion"=>0,"modified"=>"1970-01-01T07:00:00+07:00","name"=>"","numBlocks"=>0,"size"=>0,"version"=>[]}}Returns ignores for given folder
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | folder | Yes |
2.1.2:011 > sc.get_ignores'123'=>{"ignore"=>[".DS_Store",".gitignore"],"patterns"=>["(?i)^\\.DS_Store$","(?i)^.*/\\.DS_Store$","(?i)^\\.DS_Store/.*$","(?i)^.*/\\.DS_Store/.*$","(?i)^\\.gitignore$","(?i)^.*/\\.gitignore$","(?i)^\\.gitignore/.*$","(?i)^.*/\\.gitignore/.*$"]}Sets new ignores for given folder
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | folder | Yes |
| ingores | object | ignore object like in get_ignores response | Yes |
2.1.2:014 > ignores={'ignore'=>['foo']}=>{"ignore"=>["foo"]}2.1.2:015 > sc.new_ignores'123',ignores=>{"ignore"=>["foo"],"patterns"=>["(?i)^foo$","(?i)^.*/foo$","(?i)^foo/.*$","(?i)^.*/foo/.*$"]}Returns files which are needed for this device.
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | folder | Yes |
2.1.2:016 > sc.get_need'123'=>{"page"=>1,"perpage"=>65536,"progress"=>[],"queued"=>[],"rest"=>[],"total"=>0}Assigns top priority for a given file in a given folder
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | folder | Yes |
| file | string | filename | Yes |
2.1.2:017 > sc.assign_priority'123','README.md'=>{"page"=>1,"perpage"=>65536,"progress"=>[],"queued"=>[],"rest"=>[],"total"=>0}Request an immediate rescan of a folder with a subfolder
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | folder | Yes |
| subfilder | string | subfilder name | No |
2.1.2:018 > sc.scan'123'=>{:code=>200,:message=>"Completed successfully"}2.1.2:019 > sc.scan'123','app/assets'=>{:code=>200,:message=>"Completed successfully"}Returns status for a given folder
Parameters
| Name | Type | Description | Mandatory? |
|---|---|---|---|
| folder | string | folder | Yes |
2.1.2:020 > sc.get_folder_status'123'=>{"globalBytes"=>3370241,"globalDeleted"=>0,"globalFiles"=>148,"ignorePatterns"=>true,"inSyncBytes"=>3370241,"inSyncFiles"=>148,"invalid"=>"","localBytes"=>3370241,"localDeleted"=>0,"localFiles"=>148,"needBytes"=>0,"needFiles"=>0,"state"=>"idle","stateChanged"=>"2015-06-20T10:16:25.336122244+06:00","version"=>150}Returns device statistics
2.1.2:021 > sc.get_device_statistics=>{"7OFMTQD-Q64DFR3-37DAZ4O-LFETQAM-FGIH46F-XGGXHFQ-EYLKOZR-HHLDUQT"=>{"lastSeen"=>"1970-01-01T07:00:00+07:00"}}Returns general statistics about folders.
2.1.2:022 > sc.get_folder_statistics=>{"123"=>{"lastFile"=>{"at"=>"0001-01-01T00:00:00Z","filename"=>""}}}- Fork it ( https://github.com/retgoat/syncthing-ruby/fork )
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request
All code is licensed under the MIT License.
