#!/bin/bash ## author : Dryusdan ## date : 30/09/2019 ## description : A Nextcloud Update ## usage : ./nextcloud.sh ## Import require config ############################## source utils/config source utils/color source utils/logger ####################################################### FACTS_FOLDER="$(pwd)/facts" info "Get token for Proxmox" PROXMOX_TOKEN=$(curl -s --insecure -d "username=${PROXMOX_USER}@pam&password=${PROXMOX_PASSWORD}" "${PROXMOX_HOST}/api2/json/access/ticket" | jq --raw-output '.data.ticket') info "Get Proxmox node" for nodes in $(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes" | jq --raw-output '.data[] | @base64') do nodename=$(echo ${nodes} | base64 --decode | jq --raw-output '.node') clusterid=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/dcim/devices/?name=${nodename}" | jq --raw-output '.results[0].cluster.id') info "Get VM" for qemus in $(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes/${nodename}/qemu/" | jq --raw-output '.data[] | @base64') do vmname=$(echo ${qemus} | base64 --decode | jq --raw-output '.name') if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/?name=${vmname}" | jq --raw-output '.count') -eq 0 ] then curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${vmname}'", "cluster": '${clusterid}', "role": 2}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/" &> /dev/null fi done done info "Remove facts content" /bin/rm -rf "${FACTS_FOLDER}"/* info "Get facts" /usr/bin/ansible -i "${HOME}/Ansible/hosts" all -m gather_facts -u root --tree "${FACTS_FOLDER}" &> /dev/null || /bin/true info "Replace for Emeldiz" /bin/mv ${FACTS_FOLDER}/emeldiz ${FACTS_FOLDER}/Emeldiz info "Running read facts" for fact in $(ls ${FACTS_FOLDER}) do server_facts="${FACTS_FOLDER}/${fact}" device_name=$(cat "${server_facts}" | jq --raw-output ".ansible_facts.ansible_nodename") info "Get data if device exist" if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" ${NETBOX_URL}${NETBOX_API_PATH}/dcim/devices/?name=${device_name} | jq --raw-output ".count" ) -eq 1 ]; then info "${device_name} is a physical device" DEVICE_URI="/dcim/devices/" DEVICE_INT="/dcim/interfaces/" DEVICE_REQUEST="device_id" DATA_DEVICE="device" else info "${device_name} is a vm" DEVICE_URI="/virtualization/virtual-machines/" DEVICE_INT="/virtualization/interfaces/" DEVICE_REQUEST="virtual_machine_id" DATA_DEVICE="virtual_machine" fi device_id=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_URI}?name=${device_name}" | jq --raw-output ".results[0].id") if [ ${DATA_DEVICE} == "virtual_machine" ] then info "Get name and cluster id" vm_info=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/") cluster_id=$(echo ${vm_info} | jq --raw-output ".cluster.id" ) info "Get vCPU" vcpu_netbox=$(echo ${vm_info} | jq --raw-output ".vcpus") vcpu_facts=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_processor_vcpus"]') if [ ${vcpu_netbox} != ${vcpu_facts} ] then warning "vCPU is not the same, updating" curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "vcpus": '${vcpu_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null fi info "Get Memory" ram_netbox=$(echo ${vm_info} | jq --raw-output ".memory") ram_facts=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_memtotal_mb"]') ram_facts=$(echo "scale=4; ${ram_facts}/1000*1024" | bc -l | awk '{printf("%d\n",$1 + 0.5)}') if [ ${ram_netbox} != ${ram_facts} ] then warning "RAM is not the same, updating" curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "memory": '${ram_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null fi info "Get disk size" disk_netbox=$(echo ${vm_info} | jq --raw-output ".disk") disk_facts=0 for disk_mount in $(cat ${server_facts} | jq --raw-output ".ansible_facts.ansible_mounts[] | values | .size_total") do disk_facts=$(echo "${disk_facts}+${disk_mount}" | bc) done disk_facts=$(echo "scale=4; ${disk_facts}/1000*1024/1024/1024/1024" | bc -l | awk '{printf("%d\n",$1 + 0.5)}') if [ ${disk_netbox} != ${disk_facts} ] then warning "Disk is not the same, updating" curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "disk": '${disk_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null fi info "Get primary IPv4" idip_netbox=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" | jq --raw-output ".primary_ip4.id") idip_facts="0" ip_facts=$(cat ${server_facts} | jq --raw-output '.ansible_facts.ansible_default_ipv4.address') if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?address=${ip_facts}" | jq --raw-output ".count") -eq 1 ]; then info "Get IP ID" idip_facts=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?address=${ip_facts}" | jq --raw-output ".results[0].id") fi if [ ${idip_netbox} != ${idip_facts} ] then warning "IPv4 is not the same, updating" curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "primary_ip4": '${idip_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null fi fi for interface in $(cat ${server_facts} | jq --raw-output ".ansible_facts.ansible_interfaces | values | .[]") do if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}?name=${interface}&${DEVICE_REQUEST}=${device_id}" | jq --raw-output ".count") -eq 0 ]; then warning "Create new interface called ${interface}" curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"'${DATA_DEVICE}'": '${device_id}',"name": "'${interface}'"}' "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}" &> /dev/null else info "${interface} exist" fi interface_id=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}?name=${interface}&${DEVICE_REQUEST}=${device_id}" | jq --raw-output ".results[0].id" ) info "Check mac address" mac_address=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" | jq --raw-output ".mac_address") macaddress=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["macaddress"]') if [ "${mac_address^^}" != "${macaddress^^}" ]; then warning "Updating ${interface} MAC address to ${macaddress^^}" curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"'${DATA_DEVICE}'": '${device_id}',"name": "'${interface}'", "mac_address": "'${macaddress^^}'"}' "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" &> /dev/null fi info "Check MTU" mtu_netbox=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" | jq --raw-output ".mtu") mtu=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["mtu"]') if [ "${mtu_netbox}" != "${mtu}" ]; then warning "Change MTU to ${mtu}" curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"'${DATA_DEVICE}'": '${device_id}',"name": "'${interface}'", "mtu": '${mtu}'}' "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" &> /dev/null fi ipv4=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["address"]') broadcast=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["broadcast"]') netmask=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["netmask"]') network=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["network"]') if [ ${ipv4} != null ] then info "IPv4 exist" if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?interface_id=${interface_id}&?address=${ipv4}" | jq --raw-output ".count") -eq 0 ] then vrfidipv4=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/prefixes/?prefix=${ipv4}/${netmask}" | jq --raw-output '.results[0].vrf.id') echo "${NETBOX_URL}${NETBOX_API_PATH}/ipam/prefixes/?prefix=${ipv4}/${netmask}" echo '{"address": "'${ipv4}'/'${netmask}'","vrf": '${vrfidipv4}', "status": "active", "interface": '${interface_id}'}' curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"address": "'${ipv4}'/'${netmask}'","vrf": '${vrfidipv4}', "status": "active", "interface": '${interface_id}'}' "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/" &> /dev/null fi else error "${interface} haven't any IPv4" fi if [ "$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv6"]')" != null ] then for ipv6s in $(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv6"][] | @base64') do ipv6=$(echo ${ipv6s} | base64 --decode | jq --raw-output '.address') prefix=$(echo ${ipv6s} | base64 --decode | jq --raw-output '.prefix') if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?interface_id=${interface_id}&?address=${ipv6}" | jq --raw-output ".count") -eq 0 ] then warning "Adding ${ipv6}/${prefix}" vrfidipv6=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/prefixes/?prefix=${ipv6}/${prefix}" | jq --raw-output '.results[0].vrf.id') curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"address": "'${ipv6}'/'${prefix}'","vrf": '${vrfidipv6}', "status": "active", "interface": '${interface_id}'}' "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/" &> /dev/null fi done else error "${interface} haven't any IPv6" fi done done