mirror of https://github.com/SUNET/invent.git
parent
4548e50e98
commit
afc135647e
@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Source env vars
|
||||||
|
source /etc/default/invent-client
|
||||||
|
|
||||||
|
datadir="${INVENT_DIR}/data"
|
||||||
|
export_endpoint="${INVENT_EXPORT_ENDPOINT}"
|
||||||
|
fact_dir="/var/lib/puppet/facts.d"
|
||||||
|
filename="${datadir}/data-$(date +%Y%m%dT%H%M%S).json"
|
||||||
|
host_os="${INVENT_HOST_OS}"
|
||||||
|
latest="${datadir}/latest.json"
|
||||||
|
retention_days="${INVENT_RETENTION_DAYS}"
|
||||||
|
|
||||||
|
# Gather packages
|
||||||
|
parse_command="awk -v q='\"' '{print \"{\"q\"name\"q\": \"q\$1q\",\"q\"version\"q\": \"q\$2q\"}\"}' | jq -s ."
|
||||||
|
|
||||||
|
case "${host_os}" in
|
||||||
|
alpine)
|
||||||
|
query_command="apk list -q"
|
||||||
|
parse_command="awk '{print \$1}' | sed 's/\-\\([0-9]\\)/ \1/' | ${parse_command}"
|
||||||
|
;;
|
||||||
|
centos | fedora | redhat)
|
||||||
|
query_command="rpm -qa"
|
||||||
|
parse_command="sed 's/\-\\([0-9]\\)/ \1/' |${parse_command}"
|
||||||
|
;;
|
||||||
|
debian | ubuntu)
|
||||||
|
query_command="dpkg-query -W"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
query_command='echo {\"unknown\": \"none\"}'
|
||||||
|
parse_command='cat -'
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Gather structured data kernel fact
|
||||||
|
kernel_fact="${fact_dir}/kernel.json"
|
||||||
|
uname -rvmo | sed -e 's/ #/;#/' -e 's/ \([^ ]\+\) \([^ ]\+\)$/;\1;\2/'| \
|
||||||
|
awk -F ';' '{print "{ \"running-kernel\": { \"kernel-release\": \""$1"\",\"kernel-version\": \""$2"\", \"machine\": \""$3"\", \"operating-system\": \""$4"\" }}"}' | \
|
||||||
|
jq . > ${kernel_fact}
|
||||||
|
# Gather structured data package fact
|
||||||
|
package_fact="${fact_dir}/packages.json"
|
||||||
|
echo "{
|
||||||
|
\"packages\": $(eval ${query_command} | eval ${parse_command} 2> /dev/null | jq -s .)
|
||||||
|
}" \
|
||||||
|
| jq . > ${package_fact}
|
||||||
|
|
||||||
|
# Only run if we have docker
|
||||||
|
if [ $(which docker) ]; then
|
||||||
|
# Gather structured data docker fact
|
||||||
|
docker_fact="${fact_dir}/docker_ps.json"
|
||||||
|
for container in $(docker ps -q); do
|
||||||
|
docker ps --format '{{json . }}' --filter "id=${container}" | jq '. |= . + '{"ImageId":$(docker inspect --format '{{json .Image }}' ${container})'}';
|
||||||
|
done | jq -s |jq -s '{docker_ps: add}' > ${docker_fact}
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Export facts
|
||||||
|
mkdir -p ${datadir}
|
||||||
|
puppet facts --render-as json 2>/dev/null | jq . > ${filename}
|
||||||
|
ln -f -s "${filename}" "${latest}"
|
||||||
|
|
||||||
|
# Clean out old facts
|
||||||
|
find ${datadir} -type f -mtime +${retention_days} -delete
|
||||||
|
|
||||||
|
# Send data to inventory receiver
|
||||||
|
if [[ -x /usr/bin/curl ]] && [[ -n ${export_endpoint} ]]; then
|
||||||
|
username=$(hostname -f)
|
||||||
|
pwfile="/opt/invent/passwd"
|
||||||
|
if [[ -f ${pwfile} ]]; then
|
||||||
|
password=$(cat ${pwfile})
|
||||||
|
else
|
||||||
|
mkdir -p $(basename ${pwfile})
|
||||||
|
password=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 256 | head -n 1)
|
||||||
|
echo ${password} > ${pwfile}
|
||||||
|
fi
|
||||||
|
curl -X POST -H 'accept: application/json' \
|
||||||
|
-F "file=@${filename}" \
|
||||||
|
--user ${username}:${password} \
|
||||||
|
${export_endpoint}/host/${username}
|
||||||
|
fi
|
Loading…
Reference in new issue