{"id":34171115,"url":"https://github.com/est/ddns.est.im","last_synced_at":"2026-03-10T09:39:47.468Z","repository":{"id":7965951,"uuid":"9365217","full_name":"est/ddns.est.im","owner":"est","description":"dynamic dns you say?","archived":false,"fork":false,"pushed_at":"2016-09-27T11:17:13.000Z","size":770,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-21T03:51:30.467Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/est.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-04-11T08:05:20.000Z","updated_at":"2019-07-15T09:13:33.000Z","dependencies_parsed_at":"2022-09-25T05:51:30.054Z","dependency_job_id":null,"html_url":"https://github.com/est/ddns.est.im","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/est/ddns.est.im","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/est%2Fddns.est.im","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/est%2Fddns.est.im/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/est%2Fddns.est.im/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/est%2Fddns.est.im/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/est","download_url":"https://codeload.github.com/est/ddns.est.im/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/est%2Fddns.est.im/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30328888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-15T11:07:53.457Z","updated_at":"2026-03-10T09:39:47.459Z","avatar_url":"https://github.com/est.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"ddns.est.im\n===========\n\ndynamic DNS you say?\n\n\nwat\n---\n\n  - set any ddns to any domain you want. open webpage -\u003e my.ddns.est.im -\u003e filling ip or hostname -\u003e done.\n    - implicit CNAME\n      - cache and aggregating service\n        - cache with TTL\n        - combine results instead of Round-Robin\n        - dynamic weight\n        - premium http/smtp checking\n        - blacklist \u0026 cache invalidation policy\n    - explicit CNAME\n  - loose API in RESTful manner\n  - detect recursive DNS API, in case you are behind a DNS forwarder.\n  - monitor port 53 spams\n    - socket reuse routing to other apps\n    - every query is logged\n  - experimental R/W Python Dict Notation Format as \"Zone File\"\n    - functions are also values (lambdas)\n    - basically dict() but ordered\n    - reference pointers e.g. parent, sibling, etc.\n    - deep traversal mergable\n    - iterative/partial parsing for streams\n    - differential transport in incremental data\n  - collect ISP DNS from all over the world\n    - act as both forwarder and recursive dns\n    - history IP database\n  - DNS over HTTP\n    - find the quickest record using TCP PING in ajax\n\n\ndepends\n-------\n\n  GOPATH=$PWD go get github.com/mattn/go-sqlite3\n\nnotes\n----\n\n - How to tell Windows \u0026 *nix:\n   - Windows will lookup PTR\n   - ttl maybe?\n - LMDB\n   - http://symas.com/mdb/\n   - lmdb.readthedocs.org \n   - gitorious.org/mdb/mdb\n   - http://godoc.org/github.com/szferi/gomdb\n - sqlite\n   - https://github.com/mattn/go-sqlite3/blob/master/_example/simple/simple.go\n - name \n   - see 4.1.4. Message compression\n   - http://www.ietf.org/rfc/rfc1035.txt\n\n\n\nUPSERT in SQLite\n\nNot easy. http://stackoverflow.com/a/7511635/41948\n\n    // insert into record (id, name_r, type_id, value) values (1, 'com reddit', 1, X'173E6D57');\n\n    INSERT OR REPLACE INTO record (id, name_r, ttl, type_id, value)\n    SELECT old.id, old.name_r, new.ttl, old.type_id, old.value\n    FROM ( SELECT\n       'com reddit'    AS name_r, \n       1234           AS ttl,\n       1  as type_id,\n       X'173E6D57' as value\n    ) AS new\n    LEFT JOIN (\n       SELECT id, name_r, type_id, value\n       FROM record\n    ) AS old ON new.name_r = old.name_r AND new.type_id = old.type_id AND new.value = old.value;\n\n\nINSERT OR REPLACE INTO record \nSELECT \n    old.id, \n    COALESCE(new.name_r, old.name_r), \n    MAX(COALESCE(old.ttl, 0), new.ttl), \n    COALESCE(new.type_id, old.type_id), \n    COALESCE(new.value, old.value), \n    COALESCE(old.time_added, new.time_added), \n    new.time_accessed \nFROM ( SELECT\n    'com reddit' AS name_r, \n    1234 AS ttl, \n    1 AS type_id, \n    X'173E6D57' AS value, \n    datetime('now') AS time_added, \n    datetime('now') AS time_accessed \n) AS new\nLEFT JOIN (\n    SELECT id, name_r, ttl, type_id, value, time_added\n    FROM record\n) AS old ON \n    new.name_r = old.name_r AND \n    new.type_id = old.type_id AND \n    new.value = old.value;\n\n    \n        old.id, \n        COALESCE(new.name_r, old.name_r), \n        MAX(COALESCE(old.ttl, 0), new.ttl), \n        COALESCE(new.type_id, old.type_id), \n        COALESCE(new.value, old.value), \n        COALESCE(old.time_added, new.time_added), \n\n\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n  cb := make(chan int, 1)\n        tidMap := map[int] chan int{\n    1234: cb,\n  }\n  \n  tidMap[1234] \u003c- 333\n  fmt.Println(\u003c-tidMap[1234])\n  tidMap[1234] \u003c- 111\n  tidMap[1234] \u003c- 112         // blocks\n  fmt.Println(\u003c-tidMap[1234])\n  fmt.Println(\u003c-tidMap[1231]) // blocks\n\n\n\n  cb := make(chan int, 1)\n  cb \u003c- 1111\n  tidMap := map[int] chan int{}\n  tidMap[1234] = cb\n  fmt.Println(\u003c-tidMap[1234])\n  tidMap[1234] \u003c- 111\n  fmt.Println(\u003c-tidMap[1234])\n\n}\n\n\n\n\n\n\nCNAME cache\n\n0000   00 03 81 80 00 01 00 07 00 00 00 00 0a 75 75 75  .............uuu\n0010   75 31 32 33 38 37 35 09 77 6f 72 64 70 72 65 73  u123875.wordpres\n0020   73 03 63 6f 6d 00 00 01 00 01 c0 0c 00 05 00 01  s.com...........\n0030   00 00 38 40 00 05 02 6c 62 c0 17 c0 36 00 01 00  ..8@...lb...6...\n0040   01 00 00 01 2c 00 04 4c 4a fe 7b c0 36 00 01 00  ....,..LJ.{.6...\n0050   01 00 00 01 2c 00 04 4c 4a fe 78 c0 36 00 01 00  ....,..LJ.x.6...\n0060   01 00 00 01 2c 00 04 42 9b 09 ee c0 36 00 01 00  ....,..B....6...\n0070   01 00 00 01 2c 00 04 c0 00 50 fa c0 36 00 01 00  ....,....P..6...\n0080   01 00 00 01 2c 00 04 42 9b 0b ee c0 36 00 01 00  ....,..B....6...\n0090   01 00 00 01 2c 00 04 c0 00 51 fa                 ....,....Q.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fest%2Fddns.est.im","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fest%2Fddns.est.im","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fest%2Fddns.est.im/lists"}