{"id":41698198,"url":"https://github.com/grip-on-software/agent-config","last_synced_at":"2026-01-24T20:55:05.302Z","repository":{"id":171609865,"uuid":"648152496","full_name":"grip-on-software/agent-config","owner":"grip-on-software","description":"Web-based data gathering agent configuration","archived":false,"fork":false,"pushed_at":"2024-07-13T15:17:38.000Z","size":766,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-11T14:37:06.385Z","etag":null,"topics":["agent-based","configurator"],"latest_commit_sha":null,"homepage":"https://gros.liacs.nl","language":"JavaScript","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/grip-on-software.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-06-01T10:21:27.000Z","updated_at":"2024-07-13T15:17:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"19c12109-dc07-4390-b494-03ab069a63fb","html_url":"https://github.com/grip-on-software/agent-config","commit_stats":null,"previous_names":["grip-on-software/agent-config"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/grip-on-software/agent-config","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grip-on-software%2Fagent-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grip-on-software%2Fagent-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grip-on-software%2Fagent-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grip-on-software%2Fagent-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grip-on-software","download_url":"https://codeload.github.com/grip-on-software/agent-config/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grip-on-software%2Fagent-config/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28736791,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T19:23:36.361Z","status":"ssl_error","status_checked_at":"2026-01-24T19:23:28.966Z","response_time":89,"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":["agent-based","configurator"],"created_at":"2026-01-24T20:55:04.557Z","updated_at":"2026-01-24T20:55:05.288Z","avatar_url":"https://github.com/grip-on-software.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Web-based data gathering agent configuration\n\n[![npm](https://img.shields.io/npm/v/@gros/agent-config.svg)](https://www.npmjs.com/package/@gros/agent-config)\n[![Build \nstatus](https://github.com/grip-on-software/agent-config/actions/workflows/agent-config-tests.yml/badge.svg)](https://github.com/grip-on-software/agent-config/actions/workflows/agent-config-tests.yml)\n[![Coverage \nStatus](https://coveralls.io/repos/github/grip-on-software/agent-config/badge.svg?branch=master)](https://coveralls.io/github/grip-on-software/agent-config?branch=master)\n[![Quality Gate \nStatus](https://sonarcloud.io/api/project_badges/measure?project=grip-on-software_agent-config\u0026metric=alert_status)](https://sonarcloud.io/project/overview?id=grip-on-software_agent-config)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.11115708.svg)](https://doi.org/10.5281/zenodo.11115708)\n\nWeb service to provide access to status information, configuration and \nverification of a data gathering agent used in the Grip on Software (GROS) \nresearch project.\n\n## Requirements\n\nThe agent configuration service is tested with Node.js 20+ and npm 10+.\n\nA GROS [data-gathering](https://github.com/grip-on-software/data-gathering) \nagent should be deployed in concert with the configuration service in order to \nmake use of the created configuration; see the [Building](#building) for an \nexample Docker Compose setup. The agent also communicates with the controller \nserver daemon that is available in that repository.\n\nFor a standalone usage, install the dependencies of this package by running \n`npm install .` This also installs the front-end dependencies. If you do not \nplan to use the development modes, for example because you are installing this \nin production, then you can run `npm install --production .` instead.\n\n## Configuration\n\nCopy the file `lib/config.json` to `config.json` and adjust environmental \noptions in that file. You can also provide the settings via environment \nvariables when running the `npm run` command. The recognized configuration \noptions and related environment variables (uppercase variants) are:\n\n- `listen_address` (`LISTEN_ADDR`): The bind IP address to listen to. This \n  should usually be a local address such as `127.0.0.1` or the bind-any address \n  `0.0.0.0` to listen to all remote connections.\n- `listen_port` (`LISTEN_PORT`): The port to listen to.\n- `listen_host` (`LISTEN_HOST`): The hostname of the configuration web UI that\n  users must use to connect to the interface. If provided, then other domain\n  name and port combinations result in a Forbidden error, counteracting DNS \n  rebinding attacks.\n- `ssh_host` (`SSH_HOST`): The hostname of the controller API to connect to in \n  order to check for version updates of the agent.\n- `ssh_https_port` (`SSH_HTTPS_PORT`): Port of the controller API to connect to\n  in order to check for version updates of the agent.\n- `ssh_https_cert` (`SSH_HTTPS_CERT`): Certificate of the controller API to\n  validate during the connection to check for version updates.\n- `update_timeout` (`UPDATE_TIMEOUT`): Milliseconds to wait for the version\n  update check response before considering the connection to be unavailable.\n- `agent_host` (`AGENT_HOST`): The hostname of the agent related to this \n  configuration web UI. This is where the scraper API is running. This can be \n  a local hostname,\n  service hostname of another container running in a docker-compose instance,\n  or a remote hostname. Note that the configuration web UI only writes files to \n  filesystem paths, which must be shared with the agent; it does not use the \n  hostname to share any configuration.\n- `agent_port` (`AGENT_PORT`): The port of the agent where the scraper API is \n  running.\n- `scrape_timeout` (`SCRAPE_TIMEOUT`): Milliseconds to wait for the scraper API\n  before considering the connection to be unavailable.\n- `export_path` (`EXPORT_PATH`): The (relative) path in which dropins and \n  exported data from the agent are stored, including data source information \n  and scrape status. If this path is not the current working directory (empty \n  string), then the export data is accessible via the web UI.\n- `config_path` (`CONFIG_PATH`): The (relative) path in which agent settings \n  and credentials are stored. If this path is not the current working directory \n  (empty string), then the raw configuration is accessible via the web UI.\n- `key_path` (`IDENTITY_PATH`): The (relative) path in which SSH keys are \n  stored.\n- `visualization_url` (`VISUALIZATION_URL`): URL to link to from the index page \n  of the web UI, where the viewer can see what happens with collected data.\n\nAdditionally, the following options can be adjusted in order to display \ndifferent help snippets (example placeholders, information links) in the agent \nform editor:\n\n- `jira_url`: The base URL to a JIRA instance where the JIRA boards are found.\n- `bigboat_placeholder`: An example base URL of a BigBoat instance.\n- `quality_time_placeholder`: An example base URL of a Quality-time instance.\n- `sonar_placeholder`: An example base URL of a SonarQube instance.\n- `version_control_placeholder`: An example domain name of a version control \n  system, preferably a simple one.\n- `version_control_port_sample`: An example domain name of a version control \n  system including a port number.\n- `jenkins_placeholder`: An example domain name of a Jenkins CI build server.\n\n## Building\n\nA Jenkins Pipeline-based build definition is provided to generate and tag \na versioned Docker image. This allows one to bundle the image with a GROS data \ngathering agent image, using a `docker-compose.yml` file to start them with \nshared volumes. An example Docker Compose file is shown below.\n\n```compose\nagent:\n  image: gros-data-gathering:latest\n  volumes:\n    - /path/to/export:/home/agent/export\n    - /path/to/config:/home/agent/config\n    - /path/to/.ssh:/home/agent/.ssh\nwww:\n  image: gros-agent-config:latest\n  volumes:\n    - /path/to/export:/home/agent/export\n    - /path/to/config:/home/agent/config\n    - /path/to/.ssh:/home/agent/.ssh\n  environment:\n    - EXPORT_PATH=/home/agent/export\n    - CONFIG_PATH=/home/agent/config\n    - IDENTITY_PATH=/home/agent/.ssh\n```\n\nMake sure you that reference the correct Docker registry and that all paths are \nsimilar. The environment can also be configured in a file added during the \nbuild as described in the [Configuration](#configuration) section.\n\n## Running\n\nThe web server can be started in three environment modes: development, dev-sync \n(BrowserSync and nodemon autoreload support) and production. The three modes \ncan be started using respectively `npm run dev`, `npm run watch` or `npm start` \n(the latter is started automatically when using Docker). Use the autoreload \nsupport by starting `npm run watch` in a separate terminal, then you can \ndevelop and instantly see the changes take effect.\n\n## Development and testing\n\nRun the unit tests using `npm test`. You may want to override the configuration \noptions, especially if you if you have a `config.json` file with options \ndifferent from the default, or if you do not have privileges to open certain \nports. You can adjust these options by setting environment variables:\n\n```\nLISTEN_ADDR= SSH_HTTPS_PORT=8443 SSH_HTTPS_CERT=cert/server.crt \\\nSSH_HOST=localhost AGENT_PORT=7070 AGENT_HOST=localhost UPDATE_TIMEOUT=100 \\\nSCRAPE_TIMEOUT=100 LISTEN_HOST= npm test\n```\n\n[GitHub Actions](https://github.com/grip-on-software/agent-config/actions) is \nused to run the unit tests and report on coverage on commits and pull requests. \nThis includes quality gate scans tracked by \n[SonarCloud](https://sonarcloud.io/project/overview?id=grip-on-software_agent-config) \nand [Coveralls](https://coveralls.io/github/grip-on-software/agent-config) for \ncoverage history.\n\nWe publish releases to [npm](https://www.npmjs.com/package/@gros/agent-config). \nThe release files are also published on \n[GitHub](https://github.com/grip-on-software/agent-config/releases) and from \nthere are archived on [Zenodo](https://doi.org/10.5281/zenodo.11115707). \nNoteworthy changes are added to the [changelog](CHANGELOG.md).\n\n## License\n\nThe agent configuration service is licensed under the Apache 2.0 License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrip-on-software%2Fagent-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrip-on-software%2Fagent-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrip-on-software%2Fagent-config/lists"}