This gem provides bindings for Syncthing REST 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_config cfg
=> {: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.