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
This commit is contained in:
2024-02-23 08:22:24 +00:00
20 changed files with 273 additions and 173 deletions

View File

@ -21,6 +21,9 @@ variables:
include: include:
- local: .gitlab/unit-test.gitlab-ci.yml
- project: nofusscomputing/projects/gitlab-ci - project: nofusscomputing/projects/gitlab-ci
ref: development ref: development
file: file:
@ -146,9 +149,9 @@ Github (Push --mirror):
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;
@ -177,23 +180,23 @@ Github (Push --mirror):
# fi; # fi;
echo "[DEBUG] DOCKER_IMAGE_PUBLISH_NAME=$DOCKER_IMAGE_PUBLISH_NAME"; # echo "[DEBUG] DOCKER_IMAGE_PUBLISH_NAME=$DOCKER_IMAGE_PUBLISH_NAME";
# echo "[DEBUG] final: DOCKER_HUB_TAG=$DOCKER_HUB_TAG"; # echo "[DEBUG] final: DOCKER_HUB_TAG=$DOCKER_HUB_TAG";
echo "[DEBUG] DOCKER_MULTI_ARCH_IMAGES=$DOCKER_MULTI_ARCH_IMAGES"; # echo "[DEBUG] DOCKER_MULTI_ARCH_IMAGES=$DOCKER_MULTI_ARCH_IMAGES";
if [ "${CI_COMMIT_TAG}" ]; then 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_MULTI_ARCH_IMAGES --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:latest; 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 else
docker buildx imagetools create $DOCKER_MULTI_ARCH_IMAGES --tag $DOCKER_IMAGE_PUBLISH_REGISTRY/$DOCKER_IMAGE_PUBLISH_NAME:dev; 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; fi;
@ -239,10 +242,31 @@ Docker Container (dev):
- when: never - 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): Docker Hub (dev):
extends: .publish-docker-hub extends: .publish-docker-hub
needs: needs:
- "Docker Container (dev)" - "Docker Container (dev)"
- "test:unit:docker:collection:installed:dev"
resource_group: docker-build resource_group: docker-build
rules: rules:
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG
@ -255,7 +279,7 @@ Docker Hub (dev):
$CI_COMMIT_BRANCH == "development" $CI_COMMIT_BRANCH == "development"
&& &&
$CI_PIPELINE_SOURCE == "push" $CI_PIPELINE_SOURCE == "push"
when: always when: on_success
- when: never - when: never
@ -281,10 +305,31 @@ Docker Container:
- when: never - 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: Docker Hub:
extends: .publish-docker-hub extends: .publish-docker-hub
needs: needs:
- "Docker Container" - "Docker Container"
- "test:unit:docker:collection:installed"
- "Gitlab Release" - "Gitlab Release"
resource_group: docker-build resource_group: docker-build
rules: 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,9 +1,13 @@
<span align="center"> <span style="text-align: center;">
# No Fuss Computing - Ansible Collection PHPIPAM Scan Agent # No Fuss Computing - Ansible Collection PHPIPAM Scan Agent
![Project Status - Active](https://img.shields.io/badge/Project%20Status-Active-green?logo=gitlab&style=plastic) ![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> <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) ![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%2Fphpipam_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/phpipam_scan_agent/)
![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=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> </span>
---- ----

View File

@ -106,7 +106,9 @@ RUN mkdir -p /tmp/collection; \
/tmp/collection/.; \ /tmp/collection/.; \
rm -Rf /tmp/collection; \ rm -Rf /tmp/collection; \
fi; \ fi; \
chmod +x /etc/cron.d/*; chmod +x /etc/cron.d/*; \
chown root:root -R /etc/phpipam; \
chmod 740 -R /etc/phpipam;
WORKDIR /root WORKDIR /root

View File

@ -19,16 +19,11 @@ Launching the docker container can be done with
docker run \ docker run \
-d \ -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" \ -p "5000:5000" \
-v "./scan_agent.yaml:/etc/phpipam/scan_agent.yaml" \
-v "./scan_server.yaml:/etc/phpipam/scan_server.yaml" \
--name scan-agent \ --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 ### 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: 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 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) ![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%2Fphpipam_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/phpipam_scan_agent/)
![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=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) [![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)
@ -68,6 +70,11 @@ 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. 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.
## Development Notes ## Development Notes
Contributions to this project are welcome. Below you will find some useful commands for use during development. Contributions to this project are welcome. Below you will find some useful commands for use during development.
@ -80,13 +87,8 @@ docker build . --tag scan-agent:dev --build-arg COLLECTION_BRANCH=<your feature
# Launch your build container # Launch your build container
docker run \ docker run \
-d \ -d \
-e "API_URL=<your value here>" \ -v "./scan_agent.yaml:/etc/phpipam/scan_agent.yaml" \
-e "MYSQL_HOST=<your value here>" \ -v "./scan_server.yaml:/etc/phpipam/scan_server.yaml" \
-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>" \
-e "ANSIBLE_LOG_PATH=/var/log/ansible.log" \ -e "ANSIBLE_LOG_PATH=/var/log/ansible.log" \
-p "5000:5000" \ -p "5000:5000" \
--name scan-agent \ --name scan-agent \

View File

@ -11,15 +11,11 @@ The Scan Agent Scanner component is intended to scan networks that are assigned
## Usage ## 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 ``` bash
ansible-playbook nofusscomputing.phpipam_scan_agent.agent \ 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>"
``` ```
@ -33,19 +29,24 @@ The scanner component requires API access to phpIPAM. THe API user that is used,
### Variables ### 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 ``` yaml
nofusscomputing_phpipam_scan_agent:
nfc_c_http_port: 5000 # Optional, Integer. http port to connect to the server. [HTTP_PORT] api_url: # Mandatory, String. url with protocol of the phpIPAM API to connect to.
nfc_c_http_server: http://127.0.0.1 # Optional, Integer. url with protocol of the Scan Server to connect to. [HTTP_URL]
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.
api_url: http://127.0.0.1 # Optional, String. url with protocol of the phpIPAM API to connect to. [API_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_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]
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
``` ```
@ -53,6 +54,19 @@ nfc_c_epoch_time_offset: 0 # optional, int. Value in seconds to offs
You can specify environmental variable `ANSIBLE_LOG_PATH=/var/log/ansible.log`, which will tell the scanner component to log to a file at path `/var/log/ansible.log` You can specify environmental variable `ANSIBLE_LOG_PATH=/var/log/ansible.log`, which will tell the scanner component to log to a file at path `/var/log/ansible.log`
#### phpIPAM Interface variable Mapping
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
## Workflow ## Workflow
The scanner component has the following workflow: The scanner component has the following workflow:

View File

@ -22,43 +22,26 @@ ansible-rulebook -r nofusscomputing.phpipam_scan_agent.agent_receive
### Variables ### 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. Ansbible variable name is enclused in `[]` 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 Scan Agent Settings
SCANNER_TOKEN= # Mandatory, String client api token to connect to phpIPAM API [client_token] nofusscomputing_phpipam_scan_server:
SCANNER_NAME= # Mandatory, String. The scanner name as set in phpIPAM interface [client_name]
SCANNER_CODE= # Mandatory, String. Scan Agent Code as set in phpIPAM interface [scanagent_code]
# phpIPAM MariaDB/MySQL Variables # phpIPAM MariaDB/MySQL Variables
MYSQL_HOST= # Mandatory, String. IP/DNS of host to connect. [nfc_c_mysql_host] 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_port] mysql_port: 3306 # Optional, Integer. port to use for connection. [nfc_c_]
MYSQL_USER= # Mandatory, String. User to authenticate with. [nfc_c_mysql_user] mysql_user: # Mandatory, String. User to authenticate with. [nfc_c_]
MYSQL_PASSWORD= # Mandatory, String. Password for the user to connect with. [nfc_c_mysql_password] mysql_password: # Mandatory, String. Password for the user to connect with. [nfc_c_]
# Server Component Variables # Server Component Variables
HTTP_PORT=5000 # Optional, Integer. The port for the Server component to listen for connections. http_port: 5000 # Optional, Integer. The port for the Server component to listen for connections.
``` ```
#### phpIPAM Interface variable Mapping ## Workflow
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
# Workflow
The Server componet has the following workflow: The Server componet has the following workflow:

View File

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

View File

@ -0,0 +1,18 @@
---
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]

View File

@ -0,0 +1,13 @@
---
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.

View File

@ -1,7 +1,7 @@
[program:rulebook] [program:rulebook]
startsecs=0 startsecs=0
stopwaitsecs=55 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 autorestart=true
autostart=true autostart=true
stdout_logfile=/dev/fd/1 stdout_logfile=/dev/fd/1

View File

@ -5,64 +5,48 @@
tasks: 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: - name: Load Config File
client_token: "{{ lookup('ansible.builtin.env', 'SCANNER_TOKEN') | default('') }}" ansible.builtin.include_vars:
client_name: "{{ lookup('ansible.builtin.env', 'SCANNER_NAME') }}" file: /etc/phpipam/scan_agent.yaml
scanagent_code: "{{ lookup('ansible.builtin.env', 'SCANNER_CODE') | default('') }}"
api_url: "{{ lookup('ansible.builtin.env', 'API_URL') | default('') }}"
no_log: true
when: > when: >
client_token is not defined config_file_check.stat.exists
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('') != ''
- name: Confirm 'api_url' is Set - name: Confirm 'api_url' is Set
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- api_url is defined - nofusscomputing_phpipam_scan_agent.api_url is defined
- api_url != '' - nofusscomputing_phpipam_scan_agent.api_url != ''
msg: "missing Required Variables" msg: "missing Required Variables"
- name: Confirm 'client_token' is Set - name: Confirm 'client_token' is Set
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- client_token is defined - nofusscomputing_phpipam_scan_agent.client_token is defined
- nofusscomputing_phpipam_scan_agent.client_token != ''
msg: "missing Required Variables" msg: "missing Required Variables"
- name: Confirm 'client_name' is Set - name: Confirm 'client_name' is Set
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- client_name is defined - nofusscomputing_phpipam_scan_agent.client_name is defined
- nofusscomputing_phpipam_scan_agent.client_name != ''
msg: "missing Required Variables" msg: "missing Required Variables"
- name: Confirm 'scanagent_code' is Set - name: Confirm 'scanagent_code' is Set
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- scanagent_code is defined - nofusscomputing_phpipam_scan_agent.scanagent_code is defined
- nofusscomputing_phpipam_scan_agent.scanagent_code != ''
msg: "missing Required Variables" msg: "missing Required Variables"
@ -89,12 +73,12 @@
loop_var: subnet 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_port: 5000
nfc_c_http_server: http://127.0.0.1 nfc_c_http_server: http://127.0.0.1
nfc_c_path_cache: "{{ playbook_dir }}/../cache"
api_address: addresses api_address: addresses
api_subnets: subnets api_subnets: subnets
api_scanagents: tools/scanagents api_scanagents: tools/scanagents
nfc_c_path_cache: "{{ playbook_dir }}/../cache"
nfc_c_cache_expire_time: 1800

View File

@ -7,26 +7,29 @@
tasks: 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 - name: TRACE Inbound data Received
ansible.builtin.debug: ansible.builtin.debug:
msg: "{{ inbound_data }}" 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 - name: Fetch Agent Details
community.mysql.mysql_query: community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}" login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}" login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}" login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}" login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam' login_db: 'phpipam'
query: > query: >
@ -37,10 +40,10 @@
- name: Confirm Subnet Assignment - name: Confirm Subnet Assignment
community.mysql.mysql_query: community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}" login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}" login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}" login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}" login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam' login_db: 'phpipam'
query: > query: >

View File

@ -4,10 +4,10 @@
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: tasks/api_call.yaml file: tasks/api_call.yaml
vars: vars:
api_client_name: "{{ client_name }}" api_client_name: "{{ nofusscomputing_phpipam_scan_agent.client_name }}"
api_token: "{{ client_token }}" api_token: "{{ nofusscomputing_phpipam_scan_agent.client_token }}"
api_path: "{{ api_scanagents }}" 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 - name: My ScanAgent ID

View File

@ -3,15 +3,6 @@
block: 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 - name: API Facts
ansible.builtin.set_fact: 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 }}" epoch: "{{ ((('%Y-%m-%d %H:%M:%S' | strftime) | string | to_datetime) - ('1970-01-01 00:00:00' | to_datetime)).total_seconds() | int }}"
@ -31,7 +22,8 @@
- name: Expire - name: Expire
ansible.builtin.set_fact: ansible.builtin.set_fact:
expired: "{{ ((epoch | int + (nfc_c_epoch_time_offset | default(0)) | int) >= ((cached_file.stat.mtime | int) + nfc_c_cache_expire_time | int) | int ) | bool }}" 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 when: cached_file.stat.exists
@ -40,8 +32,9 @@
msg: msg:
- "exists: {{ cached_file.stat.exists | default('') }}" - "exists: {{ cached_file.stat.exists | default('') }}"
- "mtime: {{ cached_file.stat.mtime | default(0) | int }}" - "mtime: {{ cached_file.stat.mtime | default(0) | int }}"
- "expire: {{ (cached_file.stat.mtime | int) + nfc_c_cache_expire_time | 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 }} [{{ nfc_c_cache_expire_time }}]" - "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 }}" - "epoch: {{ epoch }}"
- "expired: {{ expired }}" - "expired: {{ expired }}"
when: cached_file.stat.exists when: cached_file.stat.exists
@ -62,7 +55,7 @@
{%- endif %} {%- endif %}
ansible.builtin.uri: ansible.builtin.uri:
url: >- 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 -%} {%- if api_query_string is defined -%}
/?{{ api_query_string }} /?{{ api_query_string }}
{%- endif %} {%- endif %}

View File

@ -5,12 +5,14 @@
cmd: nmap -sn "{{ subnet.address }}" -oX - cmd: nmap -sn "{{ subnet.address }}" -oX -
become: true become: true
register: nmap_scan register: nmap_scan
- name: Get subnets Address' - name: Get subnets Address'
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: tasks/api_call.yaml file: tasks/api_call.yaml
vars: vars:
api_client_name: "{{ client_name }}" api_client_name: "{{ nofusscomputing_phpipam_scan_agent.client_name }}"
api_token: "{{ client_token }}" api_token: "{{ nofusscomputing_phpipam_scan_agent.client_token }}"
api_path: "{{ api_address }}" api_path: "{{ api_address }}"
api_query_string: "filter_by=subnetId&filter_value={{ subnet.id }}" api_query_string: "filter_by=subnetId&filter_value={{ subnet.id }}"
@ -65,11 +67,13 @@
- name: Upload Scan Results - {{ subnet.address }} - name: Upload Scan Results - {{ subnet.address }}
ansible.builtin.uri: ansible.builtin.uri:
url: "{{ nfc_c_http_server }}:{{ nfc_c_http_port }}/" 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 method: POST
body_format: json body_format: json
body: { body: {
"code": "{{ scanagent_code }}", "code": "{{ nofusscomputing_phpipam_scan_agent.scanagent_code }}",
"scan": { "scan": {
"subnet": "{{ subnet.address }}", "subnet": "{{ subnet.address }}",
"results": "{{ subnet_scan_results }}" "results": "{{ subnet_scan_results }}"

View File

@ -3,10 +3,10 @@
- name: "Update IP Address' found - {{ scan_address.ipaddress.ip }}" - name: "Update IP Address' found - {{ scan_address.ipaddress.ip }}"
community.mysql.mysql_query: community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}" login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}" login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}" login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}" login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam' login_db: 'phpipam'
query: |- query: |-

View File

@ -3,10 +3,10 @@
- name: Match Scan Addresses to DB Details - name: Match Scan Addresses to DB Details
community.mysql.mysql_query: community.mysql.mysql_query:
login_host: "{{ nfc_c_mysql_host }}" login_host: "{{ nofusscomputing_phpipam_scan_server.mysql_host }}"
login_port: "{{ nfc_c_mysql_port | default(3306) | int }}" login_port: "{{ nofusscomputing_phpipam_scan_server.mysql_port | default(3306) | int }}"
login_user: "{{ nfc_c_mysql_user }}" login_user: "{{ nofusscomputing_phpipam_scan_server.mysql_user }}"
login_password: "{{ nfc_c_mysql_password }}" login_password: "{{ nofusscomputing_phpipam_scan_server.mysql_password }}"
login_db: 'phpipam' login_db: 'phpipam'
query: |- query: |-
@ -26,6 +26,24 @@
loop_var: ipaddress 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 - name: Update IP Addresses
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: tasks/server/ipaddress.yaml file: tasks/server/ipaddress.yaml

View File

@ -9,8 +9,8 @@
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: tasks/api_call.yaml file: tasks/api_call.yaml
vars: vars:
api_client_name: "{{ client_name }}" api_client_name: "{{ nofusscomputing_phpipam_scan_agent.client_name }}"
api_token: "{{ client_token }}" api_token: "{{ nofusscomputing_phpipam_scan_agent.client_token }}"
api_path: "{{ api_subnets }}" api_path: "{{ api_subnets }}"
api_query_string: "filter_by=scanAgent&filter_value={{ nfc_c_scan_agent_id }}" api_query_string: "filter_by=scanAgent&filter_value={{ nfc_c_scan_agent_id }}"