{"id":19900093,"url":"https://github.com/m-lab/siteinfo","last_synced_at":"2026-01-17T17:39:18.518Z","repository":{"id":34410867,"uuid":"172581186","full_name":"m-lab/siteinfo","owner":"m-lab","description":"M-Lab Public Site Information Automation","archived":false,"fork":false,"pushed_at":"2026-01-14T18:47:40.000Z","size":728,"stargazers_count":5,"open_issues_count":7,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-01-14T21:38:44.363Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Jsonnet","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-02-25T20:40:25.000Z","updated_at":"2026-01-14T17:52:39.000Z","dependencies_parsed_at":"2023-10-13T05:10:45.007Z","dependency_job_id":"fc9cd651-85ce-4965-b531-1a0a55252dae","html_url":"https://github.com/m-lab/siteinfo","commit_stats":{"total_commits":441,"total_committers":9,"mean_commits":49.0,"dds":"0.39229024943310653","last_synced_commit":"3d6e369ce565e40600fd578ee9ce82315c3110bb"},"previous_names":[],"tags_count":164,"template":false,"template_full_name":null,"purl":"pkg:github/m-lab/siteinfo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fsiteinfo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fsiteinfo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fsiteinfo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fsiteinfo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m-lab","download_url":"https://codeload.github.com/m-lab/siteinfo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fsiteinfo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28513871,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"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":"2024-11-12T20:11:08.444Z","updated_at":"2026-01-17T17:39:18.481Z","avatar_url":"https://github.com/m-lab.png","language":"Jsonnet","funding_links":[],"categories":[],"sub_categories":[],"readme":"# siteinfo\n\n## M-Lab Public Site Information\n\nThis repository is responsible for recording, tracking and publishing public\ninformation about every M-Lab site, server and measurement service. All of the\nraw information can be found directly in this repository. However, this raw\ninformation is meant to be processed using [Jsonnet](https://jsonnet.org/) into\nparsable JSON files. While this can be done by anyone with a clone of this\nrepository and the proper dependencies and utilities installed, the resources\nproduced by this repository are mostly meant to be consumed through a REST-ish\ninterface.\n\nThere are currently two API versions, v2, the current API version, and a\npartially deprecated v1. Please do not use v1 resources for new integrations, as\nit may be completely removed in the future.\n\n### v2\n\n\u003chttps://siteinfo.mlab-oti.measurementlab.net/v2/index.html\u003e\n\n* `./adhoc/placeholder.json`: internal use.\n* `./retired/placeholder.json`: internal use.\n* `./sites/locations-physical.json`: a list of site locations, ingested by\n  mlab-ns, but only containing physical sites. mlab-ns is now deprecated and\n  should only return physical sites in its results.\n* `./sites/machines.json`: a list of machines (both physical and virtual) on the\n  platform, along with IP addresses, type and GCP project.\n* `./sites/projects.json`: similar to machines.json above, but a map of every\n  machine, using the machine's short name (e.g., mlab2-lju01), to its GCP\n  project.\n* `./sites/registration.json`: consumed by the [Heartbeat Service](https://github.com/m-lab/locate/tree/main/cmd/heartbeat#readme) to create the registration message on start.\n* `./sites/sites.json`: an exhaustive inventory of every M-Lab site, with as\n  much data and metadata as we have about the site, the machines at the site and\n  the experiments running on each machine. This will generally be overkill for\n  most use cases.\n* `./sites/site-machines.json`: a map of every site listing which machines the\n  site has (e.g., [\"mlab1\", \"mlab2\"]). With the introduction of virtual sites,\n  it can no longer be assumed that every site has 4 machines.\n* `./zones/measurement-lab.org.zone`: BIND-style zone file for the\n  measurement-lab.org domain.\n* `./zones/measurement-lab.org.zone.diff`: internal use.\n* `./zones/mlab-oti.measurement-lab.org.zone`: BIND-style zone file for the\n  mlab-oti.measurement-lab.org domain.\n* `./zones/mlab-oti.measurement-lab.org.zone.diff`: internal use.\n\n### v1\n\n\u003chttps://siteinfo.mlab-oti.measurementlab.net/v1/index.html\u003e\n\n**NOTE**: the following v1 resources are still available, however are retired\nand should *not** be used, and will be removed in the future. Instead use the\ncorresponding v2 resource of the same name:\n\n* `./sites/hostnames.json`\n* `./sites/sites.json`\n\nBrief descriptions of each resource type can be found be below.\n\n* `./adhoc/placeholder.json`: internal use.\n* `./retired/annotations.json`: the same as annotations.json below, but for\n  sites which have been retired.\n* `./sites/annotations.json`: consumed by the\n  [uuid-annotator](https://github.com/m-lab/uuid-annotator) to annotate every\n  test that gets run against platform experiments.\n* `./sites/geo.json`: GeoJSON formatted information about sites.\n* `./sites/hostnames.json`: retired. Do not use.\n  experiments, along with IPv4 and IPv6 addresses.\n* `./sites/locations.json`: not dissimilar to geo.json, but with less\n  information and not GeoJSON formatted.\n* `./sites/sites.json`: retired. Do not use.\n* `./sites/switches.json`: a map of every site, with information about the layer\n  2 switch in front of the machines at that site.\n* `./zones/placeholder.zone`: internal use.\n* `./zones/placeholder.zone.diff`: internal use.\n\n## GCP Cloud DNS zones\n\nEvery GCP project must have these Cloud DNS zones:\n\n* Name `\u003cproject\u003e-measurement-lab-org` for DNS name `\u003cproject\u003e.measurement-lab.org`\n* Name `acme-\u003cproject\u003e-measurement-lab-org` for DNS name\n  `acme.\u003cproject\u003e.measurement-lab.org`\n\nThey can be easily created in the GCP Console or via gcloud like:\n\n```lang-sh\ngcloud dns managed-zones create \u003cname\u003e \\\n    --description \"Appropriate description.\" \\\n    --dns-name \"\u003cdns-name\u003e\" \\\n    --project \"${PROJECT}\"\n```\n\n**NOTE**: When a Cloud DNS zone is created Cloud DNS automatically create NS\nrecords for those zones. These nameservers are currently hard coded into the\nJsonnet zone file(s). If a Cloud DNS zone gets [re]created, then you will need\nto verify the nameservers assigned to the zone and appropriately update the\nJsonnet zone file(s) with the proper nameservers. The nameservers for zones\ncan be easily found in the GCP Console or you can find them with gcloud. For\nexample:\n\n```lang-sh\ngcloud dns record-sets list \\\n      --zone \"acme-mlab-sandbox-measurement-lab-org\" \\\n      --name \"acme.mlab-sandbox.measurement-lab.org\" \\\n      --type \"NS\" \\\n      --project mlab-sandbox\n```\n\n## Triggering builds in other repositories\n\nThe Cloud Build configuration for this repository has several steps which\ntrigger builds in other repositories (e.g, epoxy-images, switch-config). It does\nthis by leveraging the `cbctl` command from the gcp-config repository. For the\nmlab-staging and mlab-oti projects, this involves querying the Github API to find\nthe appropriate build reference (i.e., release tag name or branch). For private\nrepositories (like switch-config), this requires the Github client to\nauthenticate to the Github API. This is done by leveraging a [Github personal\naccess\ntokens](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token).\nA personal access token was created under the \"M-Lab Machine User\" Github\naccount for this purpose. In order for builds in this repository to access the\ntoken, the token is [stored as a secret in the GCP Secret\nManager](https://cloud.google.com/build/docs/securing-builds/use-secrets). The\nsecret can be created with this command:\n\n```lang-sh\necho -n \"\u003ctoken\u003e\" | gcloud secrets create siteinfo-builds-github-token --data-file=- --project \u003cproject\u003e\n```\n\nYou will then need to make sure that the Cloud Build service account for the\nproject has access to the secret. To do this you need to know the email of the\ndefault Cloud Build service account for the project. You can find this in the\nGCP Web Console by going to TOOLS -\u003e Cloud Build -\u003e Settings. Once you have this\nyou can run:\n\n```lang-sh\ngcloud secrets add-iam-policy-binding siteinfo-builds-github-token \\\n      --member 'serviceAccount:\u003cservice-account\u003e' \\\n      --role 'roles/secretmanager.secretAccessor' \\\n      --project \u003cproject\u003e\n```\n\nYou can refer to the cloudbuild.yaml file in this repository to see how this\nsecret is used in a build, or you can read [the documentation on using secrets\nfrom the Secret Manager in builds](https://cloud.google.com/build/docs/securing-builds/use-secrets).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm-lab%2Fsiteinfo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm-lab%2Fsiteinfo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm-lab%2Fsiteinfo/lists"}