43 Commits
0.1.0 ... 0.2.0

Author SHA1 Message Date
953a97610d build: bump version 0.2.0-a2 -> 0.2.0
!11
2024-02-24 13:18:03 +00:00
Jon
0d11c40e21 Merge branch 'feat-work' into 'development'
chore: work from issues

Closes #5 and #10

See merge request nofusscomputing/projects/ansible/collections/phpipam_scan_agent!11
2024-02-24 12:56:46 +00:00
Jon
46f25ea616 feat(server): Update the time of last access for scan agent
!11 closes #5
2024-02-24 22:00:46 +09:30
Jon
181a3bdc44 feat(scanner): Add scanner timezone to scan report
!11 #13
2024-02-24 21:26:01 +09:30
Jon
667de0a41b feat(scanner): don't include PTR DNS records as hostname
!11 closes #10
2024-02-24 21:08:11 +09:30
Jon
4d19ead2f1 feat(scanner): for ssl cert validation when uploading to server
!11 #1
2024-02-24 20:16:37 +09:30
Jon
87b9296317 docs: cleanup
!11
2024-02-24 20:16:24 +09:30
Jon
b005a31aab feat(scanner): if an auth token has been set, fail non-https communication with server
except to localhost.

!11 #1
2024-02-24 20:11:06 +09:30
Jon
15b0ddb068 feat(scanner): Set user http user agent to <name>/<version>
!11
2024-02-24 20:09:13 +09:30
Jon
8f7ed4888a feat(server): scanner identity confirmation
!11 #1
2024-02-24 15:25:52 +09:30
Jon
cf879ac81b chore: update ci submodule
!9 !10
2024-02-23 18:39:31 +09:30
8b65ba0341 build: bump version 0.2.0-a1 -> 0.2.0-a2
!9
2024-02-23 08:24:29 +00:00
Jon
8f042b008e Merge branch 'work-2024-02-23' into 'development'
feat: small changes

Closes #12, #11, and #9

See merge request nofusscomputing/projects/ansible/collections/phpipam_scan_agent!9
2024-02-23 08:22:24 +00:00
Jon
d9885ef78b docs: badge rearrangement
!9
2024-02-23 17:33:06 +09:30
Jon
c41be4541e docs: clean up
!9
2024-02-23 17:00:17 +09:30
Jon
5ca5b98b38 refactor(server): don't process scan results in parallel
!9
2024-02-23 16:57:16 +09:30
Jon
a72b9fc8eb feat(server): update subnet discovery date/time
!9 closes #12
2024-02-23 16:54:17 +09:30
Jon
87b90bffa0 feat(server): move config of variables to vars file
!8 #11
2024-02-23 16:05:16 +09:30
Jon
de7752cfcf feat(agent): move config of variables to vars file
!8 closes #11
2024-02-23 15:13:17 +09:30
Jon
49682d6038 test(docker): unit test to ensure collection installed within container
!9 fixes #9
2024-02-23 13:02:37 +09:30
Jon
9ca7b14364 ci: attempt to fix multi-arch builds
!9
2024-02-23 12:10:30 +09:30
99513f6d65 build: bump version 0.1.2-a1 -> 0.2.0-a1
!8
2024-02-22 12:08:53 +00:00
Jon
999d3fbc6a Merge branch 'initial-bug-fixes' into 'development'
fix: Initial bug fixes

Closes #9

See merge request nofusscomputing/projects/ansible/collections/phpipam_scan_agent!8
2024-02-22 12:06:29 +00:00
Jon
98317f4831 fix(server): use correct sql syntax to insert ipaddress
!8 #4
2024-02-22 21:16:12 +09:30
Jon
3ab1936a0a chore(ci): update ci template repo to current head
!8
2024-02-22 21:04:35 +09:30
Jon
7d7a77b3fb feat(server): if hostname in scan report, update the database
!8 #4
2024-02-22 20:23:21 +09:30
Jon
4c631c67f9 feat(agent): if hostname present in nmap scan report, add to report for server
!8 #4
2024-02-22 20:22:28 +09:30
Jon
f8bdccd122 feat(agent): showsubnet address in logs when conducting subnet actions
!8
2024-02-22 18:38:21 +09:30
Jon
b3e911efcd ci: add submodule update job
!8
2024-02-22 18:26:32 +09:30
Jon
058781709c feat(server): show ip address in logs when updating an ip address
!8
2024-02-22 18:26:10 +09:30
Jon
2186a85abf fix(agent): only attempt to scan subnet if subnets were returned
!8
2024-02-22 17:11:02 +09:30
Jon
785ae77510 feat(api_call): before returning check if cached file exists
!8
2024-02-22 15:25:05 +09:30
Jon
a2444087a8 refactor(api_call): use var name that makes more sense
!8
2024-02-22 15:21:41 +09:30
Jon
9920fdb0b4 fix(agent): cater for api call that returns nothing
!8
2024-02-22 14:57:05 +09:30
Jon
634eff3b3a fix(docker): ensure correct variable used to install package
!8 fixes #9
2024-02-22 14:46:52 +09:30
Jon
d0ef68c54d Merge branch 'docs-fixes' into 'development'
docs: correct documentation

See merge request nofusscomputing/projects/ansible/collections/phpipam_scan_agent!7
2024-02-22 04:49:05 +00:00
Jon
d2e0275f1b docs: fix badges
!7
2024-02-22 13:52:57 +09:30
Jon
985f121b7f docs: move server component docs to correct location
!7
2024-02-22 13:45:25 +09:30
f3dbdfe562 build: bump version 0.1.1 -> 0.1.2-a1
!7
2024-02-21 12:55:00 +00:00
Jon
ac9914ae16 fix(build): ensure the correct tags and architectures are published
!7
2024-02-21 22:23:47 +09:30
Jon
da576e2197 docs(readme): fix galaxy badges
!7
2024-02-21 22:23:05 +09:30
9159cbc8ac build: bump version 0.1.0 -> 0.1.1
!2
2024-02-21 09:40:16 +00:00
Jon
5b5f968bdd fix(ci): use correct collection name
!2
2024-02-21 18:50:05 +09:30
24 changed files with 525 additions and 216 deletions

View File

@ -4,5 +4,5 @@ commitizen:
prerelease_offset: 1
tag_format: $version
update_changelog_on_bump: false
version: 0.1.0
version: 0.2.0
version_scheme: semver

View File

@ -1,6 +1,6 @@
variables:
ANSIBLE_GALAXY_PACKAGE_NAME: phpipam_scanagent
ANSIBLE_GALAXY_PACKAGE_NAME: phpipam_scan_agent
GIT_SYNC_URL: "https://$GITHUB_USERNAME_ROBOT:$GITHUB_TOKEN_ROBOT@github.com/NoFussComputing/ansible_collection_phpipam_scan_agent.git"
# GIT_SUBMODULE_PATHS: gitlab-ci
GIT_SUBMODULE_DEPTH: 1
@ -19,8 +19,23 @@ variables:
DOCKER_IMAGE_PUBLISH_REGISTRY: docker.io/nofusscomputing
DOCKER_IMAGE_PUBLISH_URL: https://hub.docker.com/r/nofusscomputing/$DOCKER_IMAGE_PUBLISH_NAME
RELEASE_ADDITIONAL_ACTIONS_BUMP: |
sed -E "/http_agent: nfc-phpipam-scan-agent/s/\/(.+)/\/$(cz version --project)/g" -i playbooks/tasks/scan_subnet.yaml;
git add playbooks/tasks/scan_subnet.yaml;
git status;
sed -E "/http_agent: nfc-phpipam-scan-agent/s/\/(.+)/\/$(cz version --project)/g" -i playbooks/tasks/api_call.yaml
git add playbooks/tasks/api_call.yaml;
git status;
include:
- local: .gitlab/unit-test.gitlab-ci.yml
- project: nofusscomputing/projects/gitlab-ci
ref: development
file:
@ -29,6 +44,11 @@ include:
- template/mkdocs-documentation.gitlab-ci.yaml
# ToDo: update gitlabCI jobs for collections workflow
- git_push_mirror/.gitlab-ci.yml
- automation/.gitlab-ci-ansible.yaml
Update Git Submodules:
extends: .ansible_playbook_git_submodule
Github (Push --mirror):
@ -136,50 +156,59 @@ Github (Push --mirror):
docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD;
for i in ${DOCKER_IMAGE_BUILD_TARGET_PLATFORMS//,/ }
do
# for i in ${DOCKER_IMAGE_BUILD_TARGET_PLATFORMS//,/ }
# do
docker buildx imagetools inspect $DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG;
docker buildx imagetools inspect $DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG;
DOCKER_MULTI_ARCH_IMAGES=$(docker buildx imagetools inspect "$DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG" --format "{{ range .Manifest.Manifests }}$DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG@{{ println .Digest }} {{end}}")
#DOCKER_MULTI_ARCH_IMAGES=$(docker buildx imagetools inspect "$DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG" --format "{{ range .Manifest.Manifests }}$DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG@{{ println .Digest }} {{end}}")
echo "[DEBUG] DOCKER_MULTI_ARCH_IMAGES=$DOCKER_MULTI_ARCH_IMAGES";
# echo "[DEBUG] DOCKER_MULTI_ARCH_IMAGES=$DOCKER_MULTI_ARCH_IMAGES";
done;
# done;
script:
- docker login docker.io -u $NFC_DOCKERHUB_USERNAME -p $NFC_DOCKERHUB_TOKEN
- docker image ls
- |
DOCKER_HUB_TAG=dev
# DOCKER_HUB_TAG=dev
echo "[DEBUG] default: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
# echo "[DEBUG] default: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
if [ "$CI_COMMIT_BRANCH" == "master" ]; then
# if [ "$CI_COMMIT_BRANCH" == "master" ]; then
DOCKER_HUB_TAG=latest
# DOCKER_HUB_TAG=latest
echo "[DEBUG] stable: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
# echo "[DEBUG] stable: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
elif [ "$CI_COMMIT_BRANCH" == "development" ]; then
# fi;
DOCKER_HUB_TAG=dev
# if [ "$CI_COMMIT_BRANCH" == "development" ]; then
echo "[DEBUG] dev: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
# DOCKER_HUB_TAG=dev
fi;
# echo "[DEBUG] dev: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
echo "[DEBUG] DOCKER_IMAGE_PUBLISH_NAME=$DOCKER_IMAGE_PUBLISH_NAME";
# fi;
# echo "[DEBUG] DOCKER_IMAGE_PUBLISH_NAME=$DOCKER_IMAGE_PUBLISH_NAME";
# echo "[DEBUG] final: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
# echo "[DEBUG] DOCKER_MULTI_ARCH_IMAGES=$DOCKER_MULTI_ARCH_IMAGES";
echo "[DEBUG] final: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
echo "[DEBUG] DOCKER_MULTI_ARCH_IMAGES=$DOCKER_MULTI_ARCH_IMAGES";
docker buildx imagetools create $DOCKER_MULTI_ARCH_IMAGES --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:$DOCKER_HUB_TAG;
if [ "${CI_COMMIT_TAG}" ]; then
docker buildx imagetools create $DOCKER_MULTI_ARCH_IMAGES --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:$CI_COMMIT_TAG;
docker buildx imagetools create $DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:$CI_COMMIT_TAG;
docker buildx imagetools create $DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:latest;
else
docker buildx imagetools create $DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:dev;
fi;
@ -225,10 +254,31 @@ Docker Container (dev):
- when: never
test:unit:docker:collection:installed:dev:
extends: .docker_collection_installed
needs:
- "Docker Container (dev)"
rules:
- if: $CI_COMMIT_TAG
when: never
- if: "$CI_COMMIT_AUTHOR =='nfc_bot <helpdesk@nofusscomputing.com>'"
when: never
- if:
$CI_COMMIT_BRANCH != "master"
&&
$CI_PIPELINE_SOURCE == "push"
when: always
- when: never
Docker Hub (dev):
extends: .publish-docker-hub
needs:
- "Docker Container (dev)"
- "test:unit:docker:collection:installed:dev"
resource_group: docker-build
rules:
- if: $CI_COMMIT_TAG
@ -241,7 +291,7 @@ Docker Hub (dev):
$CI_COMMIT_BRANCH == "development"
&&
$CI_PIPELINE_SOURCE == "push"
when: always
when: on_success
- when: never
@ -267,10 +317,31 @@ Docker Container:
- when: never
test:unit:docker:collection:installed:
extends: .docker_collection_installed
needs:
- Docker Container
rules:
- if: $CI_COMMIT_TAG
when: on_success
- if: "$CI_COMMIT_AUTHOR =='nfc_bot <helpdesk@nofusscomputing.com>'"
when: never
# - if: # Occur on merge
# $CI_COMMIT_BRANCH == "development"
# &&
# $CI_PIPELINE_SOURCE == "push"
# when: always
- when: never
Docker Hub:
extends: .publish-docker-hub
needs:
- "Docker Container"
- "test:unit:docker:collection:installed"
- "Gitlab Release"
resource_group: docker-build
rules:

View File

@ -0,0 +1,33 @@
.docker_collection_installed:
stage: test
image:
name: nofusscomputing/docker-buildx-qemu:dev
pull_policy: always
services:
- name: docker:23-dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_DOCKERFILE: dockerfile
# See https://github.com/docker-library/docker/pull/166
DOCKER_TLS_CERTDIR: ""
GIT_STRATEGY: none
before_script:
- | # Pull the image
docker pull $DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG;
- | # Show local images
docker images;
script:
- | # Confirm the package is installed within the docker container
docker run \
--rm \
$DOCKER_IMAGE_BUILD_REGISTRY/$DOCKER_IMAGE_BUILD_NAME:$DOCKER_IMAGE_BUILD_TAG \
ansible-galaxy collection list | grep nofusscomputing.phpipam_scan_agent;

View File

@ -1,10 +1,47 @@
## Unreleased
## 0.2.0 (2024-02-24)
### Feat
- **server**: Update the time of last access for scan agent
- **scanner**: Add scanner timezone to scan report
- **scanner**: don't include PTR DNS records as hostname
- **scanner**: for ssl cert validation when uploading to server
- **scanner**: if an auth token has been set, fail non-https communication with server
- **scanner**: Set user http user agent to <name>/<version>
- **server**: scanner identity confirmation
- **server**: update subnet discovery date/time
- **server**: move config of variables to vars file
- **agent**: move config of variables to vars file
- **server**: if hostname in scan report, update the database
- **agent**: if hostname present in nmap scan report, add to report for server
- **agent**: showsubnet address in logs when conducting subnet actions
- **server**: show ip address in logs when updating an ip address
- **api_call**: before returning check if cached file exists
### Fix
- **server**: use correct sql syntax to insert ipaddress
- **agent**: only attempt to scan subnet if subnets were returned
- **agent**: cater for api call that returns nothing
- **docker**: ensure correct variable used to install package
- **build**: ensure the correct tags and architectures are published
### Refactor
- **server**: don't process scan results in parallel
- **api_call**: use var name that makes more sense
## 0.1.1 (2024-02-21)
### Fix
- **ci**: use correct collection name
## 0.1.0 (2024-02-21)
### Feat
- **docker**: adjust scanner job to run every 5 mins
- **docs**: add initial doc layout and CI jobs
- **docker**: container that launches server and scanner in one
### Fix
@ -13,4 +50,3 @@
- **ci**: ensure docker build and publish occurs
- Don't process results if scan report is empty
- **docs**: correct nav link
- add missing collection dep 'ansible.utils'

View File

@ -1,9 +1,13 @@
<span align="center">
<span style="text-align: center;">
# No Fuss Computing - Ansible Collection PHPIPAM Scan Agent
![Project Status - Active](https://img.shields.io/badge/Project%20Status-Active-green?logo=gitlab&style=plastic)
[![Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgalaxy.ansible.com%2Fapi%2Fv3%2Fplugin%2Fansible%2Fcontent%2Fpublished%2Fcollections%2Findex%2Fnofusscomputing%2Fphpipam_scan_agent%2F&query=%24.download_count&style=plastic&logo=ansible&logoColor=white&label=Galaxy%20Downloads&labelColor=black&color=cyan)](https://galaxy.ansible.com/ui/repo/published/nofusscomputing/phpipam_scan_agent/)
[![Docker Pulls](https://img.shields.io/docker/pulls/nofusscomputing/phpipam-scan-agent?style=plastic&logo=docker&logoColor=0db7ed&color=0db7ed)](https://hub.docker.com/r/nofusscomputing/phpipam-scan-agent)
----
<br>
@ -28,20 +32,6 @@ This project is hosted on [gitlab](https://gitlab.com/nofusscomputing/projects/a
![Gitlab build status - development](https://img.shields.io/badge/dynamic/json?color=ff782e&label=Build&query=0.status&url=https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%2Fprojects%2F55052132%2Fpipelines%3Fref%3Ddevelopment&logo=gitlab&style=plastic) ![branch release version](https://img.shields.io/badge/dynamic/yaml?color=ff782e&logo=gitlab&style=plastic&label=Release&query=%24.commitizen.version&url=https%3A//gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent%2F-%2Fraw%2Fdevelopment%2F.cz.yaml)
----
**Ansible Galaxy**
[![Latest Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgalaxy.ansible.com%2Fapi%2Fv3%2Fplugin%2Fansible%2Fcontent%2Fpublished%2Fcollections%2Findex%2Fnofusscomputing%2Fphp_scan_agent%2F&query=%24.highest_version.version&style=plastic&logo=ansible&logoColor=white&label=Latest%20Release&labelColor=black&color=cyan)](https://galaxy.ansible.com/ui/repo/published/nofusscomputing/ci_test_collection/)
![Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgalaxy.ansible.com%2Fapi%2Fv3%2Fplugin%2Fansible%2Fcontent%2Fpublished%2Fcollections%2Findex%2Fnofusscomputing%2Fphp_scan_agent%2F&query=%24.download_count&style=plastic&logo=ansible&logoColor=white&label=Downloads&labelColor=black&color=cyan)
----
**Docker Hub**
[![Docker Image Version](https://img.shields.io/docker/v/nofusscomputing/phpipam-scan-agent?sort=semver&style=plastic&logo=docker&logoColor=0db7ed&color=0db7ed&label=Latest%20Release)](https://hub.docker.com/r/nofusscomputing/phpipam-scan-agent)
[![Docker Pulls](https://img.shields.io/docker/pulls/nofusscomputing/phpipam-scan-agent?style=plastic&logo=docker&logoColor=0db7ed&color=0db7ed)](https://hub.docker.com/r/nofusscomputing/phpipam-scan-agent)
</span>
----

View File

@ -94,7 +94,7 @@ RUN mkdir -p /tmp/collection; \
if [ "$COLLECTION_PACKAGE" != "dev" ]; then \
echo "specified"; \
ansible-galaxy collection install --force-with-deps --pre \
$COLLECTION; \
$COLLECTION_PACKAGE; \
elif [ "$COLLECTION_PACKAGE" == "dev" ]; then \
git clone \
--depth=1 \
@ -106,7 +106,9 @@ RUN mkdir -p /tmp/collection; \
/tmp/collection/.; \
rm -Rf /tmp/collection; \
fi; \
chmod +x /etc/cron.d/*;
chmod +x /etc/cron.d/*; \
chown root:root -R /etc/phpipam; \
chmod 740 -R /etc/phpipam;
WORKDIR /root

View File

@ -19,16 +19,11 @@ Launching the docker container can be done with
docker run \
-d \
-e "API_URL=<your value here>" \
-e "MYSQL_HOST=<your value here>" \
-e "MYSQL_USER=<your value here>" \
-e "MYSQL_PASSWORD=<your value here>" \
-e "SCANNER_TOKEN=<your value here>" \
-e "SCANNER_NAME=<your value here>" \
-e "SCANNER_CODE=<your value here>" \
-p "5000:5000" \
-v "./scan_agent.yaml:/etc/phpipam/scan_agent.yaml" \
-v "./scan_server.yaml:/etc/phpipam/scan_server.yaml" \
--name scan-agent \
scan-agent:latest;
nofusscomputing/phpipam-scan-agent:latest;
```
@ -44,7 +39,11 @@ During the build of the container environmental variable `ANSIBLE_FORCE_COLOR='t
### Volumes
There are no volumes for this container.
You will need to configure the scan components:
- scanner config file at path `/etc/phpipam/scan_agent.yaml`, see [scanner docs](scanner.md#variables) for details.
- server config at path `/etc/phpipam/scan_server.yaml`, see [server docs](server.md#variables) for details.
If you wish to customize the cronjob for the scan component within the container, mount a new cron file to path `/etc/cron.d/scanner`. The default cron file is as follows:

View File

@ -6,14 +6,16 @@ template: project.html
about: https://gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent
---
<span align="center">
<span style="text-align: center;">
![Project Status - Active](https://img.shields.io/badge/Project%20Status-Active-green?logo=gitlab&style=plastic)
[![Latest Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgalaxy.ansible.com%2Fapi%2Fv3%2Fplugin%2Fansible%2Fcontent%2Fpublished%2Fcollections%2Findex%2Fnofusscomputing%2Fphp_scan_agent%2F&query=%24.highest_version.version&style=plastic&logo=ansible&logoColor=white&label=Latest%20Release&labelColor=black&color=cyan)](https://galaxy.ansible.com/ui/repo/published/nofusscomputing/ci_test_collection/)
![Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgalaxy.ansible.com%2Fapi%2Fv3%2Fplugin%2Fansible%2Fcontent%2Fpublished%2Fcollections%2Findex%2Fnofusscomputing%2Fphp_scan_agent%2F&query=%24.download_count&style=plastic&logo=ansible&logoColor=white&label=Downloads&labelColor=black&color=cyan)
[![Docker Image Version](https://img.shields.io/docker/v/nofusscomputing/phpipam-scan-agent?sort=semver&style=plastic&logo=docker&logoColor=0db7ed&color=0db7ed&label=Latest%20Release)](https://hub.docker.com/r/nofusscomputing/phpipam-scan-agent)
![branch release version](https://img.shields.io/badge/dynamic/yaml?color=ff782e&logo=gitlab&style=plastic&label=Stable%20Release&query=%24.commitizen.version&url=https%3A//gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent%2F-%2Fraw%2Fmaster%2F.cz.yaml)
![branch release version](https://img.shields.io/badge/dynamic/yaml?color=ff782e&logo=gitlab&style=plastic&label=Dev%20Release&query=%24.commitizen.version&url=https%3A//gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent%2F-%2Fraw%2Fdevelopment%2F.cz.yaml)
[![Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgalaxy.ansible.com%2Fapi%2Fv3%2Fplugin%2Fansible%2Fcontent%2Fpublished%2Fcollections%2Findex%2Fnofusscomputing%2Fphpipam_scan_agent%2F&query=%24.download_count&style=plastic&logo=ansible&logoColor=white&label=Galaxy%20Downloads&labelColor=black&color=cyan)](https://galaxy.ansible.com/ui/repo/published/nofusscomputing/phpipam_scan_agent/)
[![Docker Pulls](https://img.shields.io/docker/pulls/nofusscomputing/phpipam-scan-agent?style=plastic&logo=docker&logoColor=0db7ed&color=0db7ed)](https://hub.docker.com/r/nofusscomputing/phpipam-scan-agent)
@ -48,7 +50,7 @@ The following features are available or planned to be implmented:
!!! info
It's only possible to obtain a MAC Address if the scanner is on the same L2 network (Broadcast Domain). Within the docs you will find the different methods available to achieve this.
- [**ToDo** Remote Network Scanning](https://gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent/-/issues/1)
- Remote Network Scanning
- [**ToDo** Resolve DNS names](https://gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent/-/issues/4)
@ -68,6 +70,22 @@ When this setting is enabled, the scanner will scan the entire subnet that has b
the work in [Hosts check](https://gitlab.com/nofusscomputing/projects/ansible/collections/phpipam_scan_agent/-/issues/3), will adjust this behaviour to only add hosts that dont exist.
- Location `Subnet -> Discover new hosts [Last discovery time]`
This is displayed within the subnet interface next to the `Discover new hosts` field. Whenever a scan report is received by the server this filed is updated to reflect the last scan time.
### Scan Agent
- Location `Administration -> Scan agents [Last access]`
This is displayed within the Scan Agent table in column `Last access`. When ever the scanner checks in, the time of the checkin is used to update the field.
- Location `Subnet -> Scan agent [Last Check]`
This is displayed within the subnet interface next to `Scan agent` field. When ever the scanner checks in, the time of the checkin is used to update the field.
## Development Notes
Contributions to this project are welcome. Below you will find some useful commands for use during development.
@ -80,13 +98,8 @@ docker build . --tag scan-agent:dev --build-arg COLLECTION_BRANCH=<your feature
# Launch your build container
docker run \
-d \
-e "API_URL=<your value here>" \
-e "MYSQL_HOST=<your value here>" \
-e "MYSQL_USER=<your value here>" \
-e "MYSQL_PASSWORD=<your value here>" \
-e "SCANNER_TOKEN=<your value here>" \
-e "SCANNER_NAME=<your value here>" \
-e "SCANNER_CODE=<your value here>" \
-v "./scan_agent.yaml:/etc/phpipam/scan_agent.yaml" \
-v "./scan_server.yaml:/etc/phpipam/scan_server.yaml" \
-e "ANSIBLE_LOG_PATH=/var/log/ansible.log" \
-p "5000:5000" \
--name scan-agent \

View File

@ -11,15 +11,11 @@ The Scan Agent Scanner component is intended to scan networks that are assigned
## Usage
After installing the collection, running the agent is as simple as running the following command:
After installing the collection and configuring. Running the agent is as simple as running the following command:
``` bash
ansible-playbook nofusscomputing.phpipam_scan_agent.agent \
--extra-vars "api_url=<your value here>" \
--extra-vars "client_token=<your value here>" \
--extra-vars "client_name=<your value here>" \
--extra-vars "scanagent_code=<your value here>"
ansible-playbook nofusscomputing.phpipam_scan_agent.agent
```
@ -33,24 +29,25 @@ The scanner component requires API access to phpIPAM. THe API user that is used,
### Variables
The variables described below, if optional the value specified here is the default value. Any variable that can be set via environmental variables have the variable name enclosed in `[]`
Variables for the scanner are set in a variables file at path `/etc/phpipam/scan_agent.yaml`. The variables described below, if optional the value specified here is the default value.
``` yaml
nofusscomputing_phpipam_scan_agent:
client_token: "" # Mandatory, String client api token to connect to phpIPAM API [SCANNER_TOKEN]
client_name: "" # Mandatory, String. The scanner name as set in phpIPAM interface [SCANNER_NAME]
scanagent_code: "" # Mandatory, String. Scan Agent Code as set in phpIPAM interface [SCANNER_CODE]
api_url: # Mandatory, String. url with protocol of the phpIPAM API to connect to.
http_port: 5000 # Optional, Integer. http port to connect to the server.
http_server: http://127.0.0.1 # Optional, Integer. url with protocol of the Scan Server to connect to.
auth_token: # Optional, String. The Scan-Agent server authentication token.
nfc_c_http_port: 5000 # Optional, Integer. http port to connect to the server. [HTTP_PORT]
nfc_c_http_server: http://127.0.0.1 # Optional, Integer. url with protocol of the Scan Server to connect to. [HTTP_URL]
cache_expire_time: 1800 # Optional, Integer. Time in seconds to expire the phpIPAM cache.
epoch_time_offset: 0 # optional, int. Value in seconds to offset the time
# phpIPAM Scan Agent Settings
client_token: # Mandatory, String client api token to connect to phpIPAM API
client_name: # Mandatory, String. The scanner name as set in phpIPAM interface
scanagent_code: # Mandatory, String. Scan Agent Code as set in phpIPAM interface
api_url: http://127.0.0.1 # Optional, String. url with protocol of the phpIPAM API to connect to. [API_URL]
nfc_c_cache_expire_time: 1800 # Optional, Integer. Time in seconds to expire the phpIPAM cache.
nfc_c_epoch_time_offset: 0 # optional, int. Value in seconds to offset the time
```
@ -63,13 +60,11 @@ nfc_c_epoch_time_offset: 0 # optional, int. Value in seconds to offs
These images are of the phpIPAM interface that show in green text the variable name that would be set as detailed above.
![phpIPAM API](images/phpipam_api.png)
phpIPAM API Settings
----
![phpIPAM Scan Agent](images/phpipam_scan_agent_details.png)
phpIPAM Scan Agent Settings
@ -99,3 +94,15 @@ The scanner component has the following workflow:
1. upload scan report to configured Server.
1. workflow complete.
## Remote network Scannning
Once the [server component](server.md#remote-network-scannning) has been setup, the client can be installed/used from any network. Even a network that is isolated from the server. Only caveat is that the client can communicate with the server. To ensure that the client can connect to the server set the `auth_token` to match that of the server.
There is no true confirmation of the servers identity outside of confirming the TLS Certificate is trusted. Due to this fact, you're advised to use your own CA to sign the server components TLS Certificate. By doing this only you can issue a certificate to the server component. All that is required is to ensure that your CA certificate is within the trusted certificates of the machine that is running the agent.
!!! danger "Security"
Failing to secure the server component communication with TLS will allow anyone with direct access to the line of communication to view the `auth_token`. Anyone who has the `auth_token` will be able to upload data to the server.
In an attempt to mitigate this, the scanner will fail to communicate with the server if you have set an `auth_token` and attempt non-TLS communication with the server.

View File

@ -22,24 +22,27 @@ ansible-rulebook -r nofusscomputing.phpipam_scan_agent.agent_receive
### Variables
The variables described below, if optional the value specified here is the default value. All variables that are used by the server component are environmental variables that must be set before execution.
The variables described below, if optional the value specified here is the default value. The variables are to be set in a variables file at path `/etc/phpipam/scan_server.yaml`
``` bash
``` yaml
# phpIPAM MariaDB/MySQL Variables
MYSQL_HOST= # Mandatory, String. IP/DNS of host to connect.
MYSQL_PORT=3306 # Optional, Integer. port to use for connection.
MYSQL_USER= # Mandatory, String. User to authenticate with.
MYSQL_PASSWORD= # Mandatory, String. Password for the user to connect with.
nofusscomputing_phpipam_scan_server:
# phpIPAM MariaDB/MySQL Variables
mysql_host: # Mandatory, String. IP/DNS of host to connect.
mysql_port: 3306 # Optional, Integer. port to use for connection.
mysql_user: # Mandatory, String. User to authenticate with.
mysql_password: # Mandatory, String. Password for the user to connect with.
# Server Component Variables
HTTP_PORT=5000 # Optional, Integer. The port for the Server component to listen for connections.
# Server Component Variables
http_port: 5000 # Optional, Integer. The port for the Server component to listen for connections.
auth_token: # Optional, String. Token used to authentication Agents.
```
# Workflow
## Workflow
The Server componet has the following workflow:
@ -54,3 +57,13 @@ The Server componet has the following workflow:
- _if no results found, no further processing occurs_
1. Update the phpIPAM MariaDB/MySQL database directly
## Remote network Scannning
Remote network scanning is possible with the Scan-Agent. The server must be setup and have connectivity to the phpIPAM MariaDB/MySQL database. Currently the server does not perform secure communication. As such you are strongly encouraged to setup the server component behind a reverse proxy that conducts the TLS termination.
The [scan](scanner.md#remote-network-scannning) and server component must be setup with the same `auth_token`. It is this token that provides a means to ensure that what the server is receiving, is from an authorized client.
!!! danger "Security"
Failing to secure the server component communication with TLS will allow anyone with direct access to the line of communication to view the `auth_token`. Anyone who has the `auth_token` will be able to upload data to the server.

View File

@ -1,12 +1,12 @@
- name: Agent Webhook
hosts: all
execution_strategy: parallel
sources:
- name: Webhook
ansible.eda.webhook:
host: 0.0.0.0
port: "{{ HTTP_PORT }}"
port: "{{ nofusscomputing_phpipam_scan_server.http_port | default(5000) | int }}"
token: "{{ nofusscomputing_phpipam_scan_server.auth_token | default('no-token-set') }}"
rules:

View File

@ -8,7 +8,7 @@ namespace: nofusscomputing
name: phpipam_scan_agent
# The version of the collection. Must be compatible with semantic versioning
version: 0.1.0
version: 0.2.0
# The path to the Markdown (.md) readme file. This path is relative to the root of the collection
readme: README.md

View File

@ -0,0 +1,20 @@
---
nofusscomputing_phpipam_scan_agent:
# api_url: http://127.0.0.1 # Mandatory, String. url with protocol of the phpIPAM API to connect to.
# http_port: 5000 # Optional, Integer. http port to connect to the server.
# http_server: http://127.0.0.1 # Optional, Integer. url with protocol of the Scan Server to connect to.
# cache_expire_time: 1800 # Optional, Integer. Time in seconds to expire the phpIPAM cache.
# epoch_time_offset: 0 # optional, int. Value in seconds to offset the time
# phpIPAM Scan Agent Settings
client_token: # Mandatory, String client api token to connect to phpIPAM API [client_token]
client_name: # Mandatory, String. The scanner name as set in phpIPAM interface [client_name]
scanagent_code: # Mandatory, String. Scan Agent Code as set in phpIPAM interface [scanagent_code]
# auth_token: # Optional, String. The Scan-Agent server authentication token.

View File

@ -0,0 +1,15 @@
---
nofusscomputing_phpipam_scan_server:
# phpIPAM MariaDB/MySQL Variables
# mysql_host: # Mandatory, String. IP/DNS of host to connect. [nfc_c_]
# mysql_port: 3306 # Optional, Integer. port to use for connection. [nfc_c_]
# mysql_user: # Mandatory, String. User to authenticate with. [nfc_c_]
# mysql_password: # Mandatory, String. Password for the user to connect with. [nfc_c_]
# Server Component Variables
# http_port: 5000 # Optional, Integer. The port for the Server component to listen for connections.
# auth_token: # Optional, String. Token used to authentication Agents.

View File

@ -1,7 +1,7 @@
[program:rulebook]
startsecs=0
stopwaitsecs=55
command=ansible-rulebook -r nofusscomputing.phpipam_scan_agent.agent_receive --env-vars "HTTP_PORT" -i /root/hosts.yaml -v
command=ansible-rulebook -r nofusscomputing.phpipam_scan_agent.agent_receive --vars /etc/phpipam/scan_server.yaml -i /root/hosts.yaml -v
autorestart=true
autostart=true
stdout_logfile=/dev/fd/1

View File

@ -5,64 +5,48 @@
tasks:
- name: Check for Existance of config file
ansible.builtin.stat:
path: /etc/phpipam/scan_agent.yaml
register: config_file_check
- name: Fetch Required Environmental Variables
ansible.builtin.set_fact:
client_token: "{{ lookup('ansible.builtin.env', 'SCANNER_TOKEN') | default('') }}"
client_name: "{{ lookup('ansible.builtin.env', 'SCANNER_NAME') }}"
scanagent_code: "{{ lookup('ansible.builtin.env', 'SCANNER_CODE') | default('') }}"
api_url: "{{ lookup('ansible.builtin.env', 'API_URL') | default('') }}"
no_log: true
- name: Load Config File
ansible.builtin.include_vars:
file: /etc/phpipam/scan_agent.yaml
when: >
client_token is not defined
and
client_name is not defined
and
scanagent_code is not defined
and
api_url is not defined
- name: Fetch Required Environmental Variable - HTTP_URL
ansible.builtin.set_fact:
nfc_c_http_server: "{{ lookup('ansible.builtin.env', 'HTTP_URL') | default('') }}"
when: >
lookup('ansible.builtin.env', 'HTTP_URL') | default('') != ''
- name: Fetch Required Environmental Variable - HTTP_PORT
ansible.builtin.set_fact:
nfc_c_http_port: "{{ lookup('ansible.builtin.env', 'HTTP_PORT') | default('') }}"
when: >
lookup('ansible.builtin.env', 'HTTP_PORT') | default('') != ''
config_file_check.stat.exists
- name: Confirm 'api_url' is Set
ansible.builtin.assert:
that:
- api_url is defined
- api_url != ''
- nofusscomputing_phpipam_scan_agent.api_url is defined
- nofusscomputing_phpipam_scan_agent.api_url != ''
msg: "missing Required Variables"
- name: Confirm 'client_token' is Set
ansible.builtin.assert:
that:
- client_token is defined
- nofusscomputing_phpipam_scan_agent.client_token is defined
- nofusscomputing_phpipam_scan_agent.client_token != ''
msg: "missing Required Variables"
- name: Confirm 'client_name' is Set
ansible.builtin.assert:
that:
- client_name is defined
- nofusscomputing_phpipam_scan_agent.client_name is defined
- nofusscomputing_phpipam_scan_agent.client_name != ''
msg: "missing Required Variables"
- name: Confirm 'scanagent_code' is Set
ansible.builtin.assert:
that:
- scanagent_code is defined
- nofusscomputing_phpipam_scan_agent.scanagent_code is defined
- nofusscomputing_phpipam_scan_agent.scanagent_code != ''
msg: "missing Required Variables"
@ -84,17 +68,17 @@
- name: Scan Subnet
ansible.builtin.include_tasks:
file: tasks/scan_subnet.yaml
loop: "{{ nfc_c_scan_agent_subnets }}"
loop: "{{ nfc_c_scan_agent_subnets | default([]) }}"
loop_control:
loop_var: subnet
vars: # ToDo: remove the below t4est vars
vars:
nfc_c_cache_expire_time: 1800
nfc_c_http_port: 5000
nfc_c_http_server: http://127.0.0.1
nfc_c_path_cache: "{{ playbook_dir }}/../cache"
api_address: addresses
api_subnets: subnets
api_scanagents: tools/scanagents
nfc_c_path_cache: "{{ playbook_dir }}/../cache"
nfc_c_cache_expire_time: 1800

View File

@ -7,26 +7,29 @@
tasks:
- name: Fetch Required Environmental Variables
ansible.builtin.set_fact:
nfc_c_mysql_host: "{{ lookup('ansible.builtin.env', 'MYSQL_HOST') | default('') }}"
nfc_c_mysql_port: "{{ lookup('ansible.builtin.env', 'MYSQL_PORT') | default(3306) | int }}"
nfc_c_mysql_user: "{{ lookup('ansible.builtin.env', 'MYSQL_USER') | default('') }}"
nfc_c_mysql_password: "{{ lookup('ansible.builtin.env', 'MYSQL_PASSWORD') | default('') }}"
no_log: true
- name: TRACE Inbound data Received
ansible.builtin.debug:
msg: "{{ inbound_data }}"
- name: Check for Existance of config file
ansible.builtin.stat:
path: /etc/phpipam/scan_server.yaml
register: config_file_check
- name: Load Config File
ansible.builtin.include_vars:
file: /etc/phpipam/scan_server.yaml
when: >
config_file_check.stat.exists
- name: Fetch Agent Details
community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}"
login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam'
query: >
@ -35,12 +38,30 @@
register: mysql_query_agent_details
- name: Update Scan Agent Last seen
community.mysql.mysql_query:
login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam'
query: |-
UPDATE
scanAgents
SET
last_access = '{{ ('%Y-%m-%d %H:%M:%S' | strftime) }}'
WHERE
id = '{{ mysql_query_agent_details.query_result[0][0].id }}'
single_transaction: true
- name: Confirm Subnet Assignment
community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}"
login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam'
query: >

View File

@ -4,10 +4,10 @@
ansible.builtin.include_tasks:
file: tasks/api_call.yaml
vars:
api_client_name: "{{ client_name }}"
api_token: "{{ client_token }}"
api_client_name: "{{ nofusscomputing_phpipam_scan_agent.client_name }}"
api_token: "{{ nofusscomputing_phpipam_scan_agent.client_token }}"
api_path: "{{ api_scanagents }}"
api_query_string: "filter_by=code&filter_value={{ scanagent_code }}"
api_query_string: "filter_by=code&filter_value={{ nofusscomputing_phpipam_scan_agent.scanagent_code }}"
- name: My ScanAgent ID

View File

@ -3,15 +3,6 @@
block:
- name: Mandatory Variables set
ansible.builtin.assert:
that:
- api_client_name is defined
- api_path is defined
- api_token is defined
- api_url is defined
- name: API Facts
ansible.builtin.set_fact:
epoch: "{{ ((('%Y-%m-%d %H:%M:%S' | strftime) | string | to_datetime) - ('1970-01-01 00:00:00' | to_datetime)).total_seconds() | int }}"
@ -26,64 +17,69 @@
- name: check Cache Files
ansible.builtin.stat:
path: "{{ cache_filepath }}"
register: cache_files
register: cached_file
- name: Expire
ansible.builtin.set_fact:
expired: "{{ ((epoch | int + (nfc_c_epoch_time_offset | default(0)) | int) >= ((cache_files.stat.mtime | int) + nfc_c_cache_expire_time | int) | int ) | bool }}"
when: cache_files.stat.exists
expired: "{{ ((epoch | int + (nfc_c_epoch_time_offset | default(0)) | int) >= ((cached_file.stat.mtime | int) +
(nofusscomputing_phpipam_scan_agent.cache_expire_time | default(nfc_c_cache_expire_time)) | int) | int ) | bool }}"
when: cached_file.stat.exists
- name: TRACE - Cached file
ansible.builtin.debug:
msg:
- "exists: {{ cache_files.stat.exists | default('') }}"
- "mtime: {{ cache_files.stat.mtime | default(0) | int }}"
- "expire: {{ (cache_files.stat.mtime | int) + nfc_c_cache_expire_time | int }}"
- "epoch: {{ (epoch | int + (nfc_c_epoch_time_offset | default(0)) | int) | int }} [{{ nfc_c_cache_expire_time }}]"
- "exists: {{ cached_file.stat.exists | default('') }}"
- "mtime: {{ cached_file.stat.mtime | default(0) | int }}"
- "expire: {{ (cached_file.stat.mtime | int) + (nofusscomputing_phpipam_scan_agent.cache_expire_time | default(nfc_c_cache_expire_time)) | int }}"
- "epoch: {{ (epoch | int + (nfc_c_epoch_time_offset | default(0)) | int) | int }} [{{
(nofusscomputing_phpipam_scan_agent.cache_expire_time | default(nfc_c_cache_expire_time)) }}]"
- "epoch: {{ epoch }}"
- "expired: {{ expired }}"
when: cache_files.stat.exists
when: cached_file.stat.exists
- name: Expire Cache
ansible.builtin.file:
path: "{{ cache_files.stat.path }}"
path: "{{ cached_file.stat.path }}"
state: absent
when: >
expired
and
cache_files.stat.exists
cached_file.stat.exists
# Note: Dont edit http_agent version as the build pipeline updates automagically!!
# see ci variable 'RELEASE_ADDITIONAL_ACTIONS_BUMP'
- name: >
PHPIPAM API Call - {{ api_path }}{%- if api_query_string is defined -%}
/?{{ api_query_string }}
{%- endif %}
ansible.builtin.uri:
url: >-
{{ api_url }}/api/{{ api_client_name }}/{{ api_path }}
{{ nofusscomputing_phpipam_scan_agent.api_url }}/api/{{ api_client_name }}/{{ api_path }}
{%- if api_query_string is defined -%}
/?{{ api_query_string }}
{%- endif %}
headers:
token: "{{ api_token }}"
http_agent: nfc-phpipam-scan-agent/0.2.0-a2
return_content: true
status_code:
- 200
- 404
validate_certs: false
changed_when: api_call.json | length | int > 0
changed_when: api_call.json | default([]) | length | int > 0
no_log: true
register: api_call
when: >
(
expired
and
cache_files.stat.exists
cached_file.stat.exists
)
or
not cache_files.stat.exists
not cached_file.stat.exists
- name: Create Cache DIR
@ -104,9 +100,14 @@
(
expired
and
cache_files.stat.exists
cached_file.stat.exists
)
or
not cache_files.stat.exists
not cached_file.stat.exists
and
api_call.status | default(0) | int != 404
- name: check Cache Files
ansible.builtin.stat:
path: "{{ cache_filepath }}"
register: cached_file

View File

@ -1,21 +1,23 @@
---
- name: Scan subnet
- name: Scan subnet - {{ subnet.address }}
ansible.builtin.command:
cmd: nmap -sn "{{ subnet.address }}" -oX -
become: true
register: nmap_scan
- name: Get subnets Address'
ansible.builtin.include_tasks:
file: tasks/api_call.yaml
vars:
api_client_name: "{{ client_name }}"
api_token: "{{ client_token }}"
api_client_name: "{{ nofusscomputing_phpipam_scan_agent.client_name }}"
api_token: "{{ nofusscomputing_phpipam_scan_agent.client_token }}"
api_path: "{{ api_address }}"
api_query_string: "filter_by=subnetId&filter_value={{ subnet.id }}"
- name: Load Subnet
- name: Load Subnet - {{ subnet.address }}
ansible.builtin.set_fact:
cached_subnet: "{{ lookup('file', cache_filepath) }}"
cacheable: false
@ -24,7 +26,7 @@
api_call.status | default(0) | int != 404
- name: Process Scan Results
- name: Process Scan Results - {{ subnet.address }}
ansible.builtin.set_fact:
subnet_scan_results: |-
[
@ -42,29 +44,88 @@
{%- endfor %}
"subnetId": "{{ subnet.id }}",
"ip": "{{ scanned_host.address['@addr'] | default(scanned_host.address[0]['@addr']) }}",
"lastSeen": "{{ nmap_scan.start }}",
"lastSeen": "{{ (nmap_scan.start | split('.'))[0] }}",
{% if scanned_host.hostnames.hostname is defined %}
{% set ip_address = scanned_host.address['@addr'] | default(scanned_host.address[0]['@addr']) | split('.') %}
{% if
'.' in scanned_host.hostnames.hostname['@name'] | string
and
(ip_address[0] + '-' + ip_address[1] + '-' + ip_address[2] + '-' + ip_address[3]) not in scanned_host.hostnames.hostname['@name'] | string
and
(ip_address[3] + '-' + ip_address[2] + '-' + ip_address[1] + '-' + ip_address[0]) not in scanned_host.hostnames.hostname['@name'] | string
%}
"hostname": "{{ (scanned_host.hostnames.hostname['@name'] | split('.'))[0] }}",
{% elif
'.' not in scanned_host.hostnames.hostname['@name'] | string
and
(ip_address[0] + '-' + ip_address[1] + '-' + ip_address[2] + '-' + ip_address[3]) not in scanned_host.hostnames.hostname['@name'] | string
and
(ip_address[3] + '-' + ip_address[2] + '-' + ip_address[1] + '-' + ip_address[0]) not in scanned_host.hostnames.hostname['@name'] | string
%}
"hostname": "{{ scanned_host.hostnames.hostname['@name'] }}",
{% endif %}
{% endif %}
{% if scanned_host.address['@addrtype'] | default(scanned_host.address[1]['@addrtype']) == 'mac' %}
"mac": "{{ scanned_host.address['@addr'] | default(scanned_host.address[1]['@addr']) | upper }}"
{% endif %}
},
{% endif %}
{% endfor %}
]
- name: To JSON
- name: Force Failure for non-HTTPS Communication
ansible.builtin.assert:
that:
- |-
not
(
(
'http:' in (nofusscomputing_phpipam_scan_agent.http_server | default(nfc_c_http_server) | string)
and
'http://127.0.0.1' not in (nofusscomputing_phpipam_scan_agent.http_server | default(nfc_c_http_server) | string)
)
and
nofusscomputing_phpipam_scan_agent.auth_token | default('no-token-set') != 'no-token-set'
)
fail_msg: 'Failing task as an attempt was made to communicate with the server over a non-encrypted channel'
success_msg: 'OK'
- name: To JSON - {{ subnet.address }}
ansible.builtin.set_fact:
subnet_scan_results: "{{ subnet_scan_results | from_yaml }}"
- name: Upload Scan Results
# Note: Dont edit http_agent version as the build pipeline updates automagically!!
# see ci variable 'RELEASE_ADDITIONAL_ACTIONS_BUMP'
- name: Upload Scan Results - {{ subnet.address }}
ansible.builtin.uri:
url: "{{ nfc_c_http_server }}:{{ nfc_c_http_port }}/"
headers:
Authorization: "Bearer {{ nofusscomputing_phpipam_scan_agent.auth_token | default('no-token-set') }}"
http_agent: nfc-phpipam-scan-agent/0.2.0-a2
url: "{{
nofusscomputing_phpipam_scan_agent.http_server | default(nfc_c_http_server)
}}:{{ nofusscomputing_phpipam_scan_agent.http_port | default(nfc_c_http_port) }}/"
method: POST
body_format: json
body: {
"code": "{{ scanagent_code }}",
"code": "{{ nofusscomputing_phpipam_scan_agent.scanagent_code }}",
"scan": {
"subnet": "{{ subnet.address }}",
"results": "{{ subnet_scan_results }}"
"results": "{{ subnet_scan_results }}",
"tz": "{{ '%z' | strftime }}"
}
}
validate_certs: true # Ensure always true

View File

@ -1,12 +1,12 @@
---
- name: Update IP Address' found
- name: "Update IP Address' found - {{ scan_address.ipaddress.ip }}"
community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}"
login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam'
query: |-
@ -18,6 +18,12 @@
SET
lastSeen = '{{ scan_address.ipaddress.lastSeen }}'
{% if scan_address.ipaddress.hostname | default('') != '' %},
hostname = '{{ scan_address.ipaddress.hostname }}'
{% endif %}
{% if scan_address.ipaddress.mac | default('') != '' %},
mac = '{{ scan_address.ipaddress.mac }}'
@ -36,6 +42,7 @@
subnetId,
ip_addr,
description,
{% if scan_address.ipaddress.hostname | default('') != '' %}hostname,{% endif %}
{% if scan_address.ipaddress.mac | default('') != '' %}mac,{% endif %}
note,
lastSeen
@ -46,6 +53,12 @@
'{{ scan_address.ipaddress.ip | ip2ipam }}',
'-- autodiscovered --',
{% if scan_address.ipaddress.hostname | default('') != '' %}
'{{ scan_address.ipaddress.hostname }}',
{% endif %}
{% if scan_address.ipaddress.mac | default('') != '' %}
'{{ scan_address.ipaddress.mac }}',

View File

@ -3,10 +3,10 @@
- name: Match Scan Addresses to DB Details
community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}"
login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam'
query: |-
@ -26,6 +26,24 @@
loop_var: ipaddress
- name: Update Subnet Discovery Time
community.mysql.mysql_query:
login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam'
query: |-
UPDATE
subnets
SET
lastDiscovery = '{{ inbound_data.scan.results[0].lastSeen }}'
WHERE
subnet = '{{ (inbound_data.scan.subnet | split('/'))[0] | ip2ipam }}'
single_transaction: true
- name: Update IP Addresses
ansible.builtin.include_tasks:
file: tasks/server/ipaddress.yaml

View File

@ -9,21 +9,33 @@
ansible.builtin.include_tasks:
file: tasks/api_call.yaml
vars:
api_client_name: "{{ client_name }}"
api_token: "{{ client_token }}"
api_client_name: "{{ nofusscomputing_phpipam_scan_agent.client_name }}"
api_token: "{{ nofusscomputing_phpipam_scan_agent.client_token }}"
api_path: "{{ api_subnets }}"
api_query_string: "filter_by=scanAgent&filter_value={{ nfc_c_scan_agent_id }}"
- name: Update Subnets List
ansible.builtin.set_fact:
nfc_c_scan_agent_subnets: "{{ nfc_c_scan_agent_subnets + [{
'id': network.id,
'address': network.subnet + '/' + network.mask
}] }}"
loop: "{{ data | default ([]) }}"
loop_control:
loop_var: network
vars:
data: "{{ lookup('file', cache_filepath) }}"
when: network.discoverSubnet | int == 1
- name: Try/Catch
block:
- name: Update Subnets List
ansible.builtin.set_fact:
nfc_c_scan_agent_subnets: "{{ nfc_c_scan_agent_subnets + [{
'id': network.id,
'address': network.subnet + '/' + network.mask
}] }}"
loop: "{{ lookup('file', cache_filepath) | default ([]) }}"
loop_control:
loop_var: network
when: >
network.discoverSubnet | int == 1
rescue:
- name: Confirm 'Subnets List' Error is Expected
ansible.builtin.assert:
that:
- not cached_file.stat.exists
success_msg: "OK. Success. The error occured as there is no cache file. This normally means there are no subnets assigned to the agent."
fail_msg: "ERROR. Something went wrong, Cache file exists."