1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-01-07 17:17:41 +03:00

B #4793: Read monitor address from monitord.conf

This commit is contained in:
Ruben S. Montero 2020-05-28 17:20:41 +02:00 committed by GitHub
commit b0f3c28ae3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 159 additions and 38 deletions

View File

@ -14,6 +14,11 @@
# limitations under the License. #
#--------------------------------------------------------------------------- #
require 'augeas'
require 'base64'
require 'zlib'
require 'socket'
module OpenNebula
# Generic log function
@ -92,4 +97,61 @@ module OpenNebula
log "Executed \"#{command}\"."
end
def self.send_to_monitor(msg_type, result, oid, data)
# Read monitord.conf
one_location = ENV['ONE_LOCATION']
if !one_location
file_dir = '/etc/one/'
else
file_dir = one_location + '/etc/'
end
file_name = 'monitord.conf'
aug = Augeas.create(:no_modl_autoload => true,
:no_load => true,
:root => file_dir,
:loadpath => file_name)
aug.clear_transforms
aug.transform(:lens => 'Oned.lns', :incl => file_name)
aug.context = "/files/#{file_name}"
aug.load
mon_address = aug.get('NETWORK/MONITOR_ADDRESS')
mon_port = aug.get('NETWORK/PORT')
mon_key = aug.get('NETWORK/PUBKEY').tr('"', '')
mon_address = "127.0.0.1" if mon_address.include? "auto"
# Encrypt
if mon_key && !mon_key.empty?
block_size = mon_key.n.num_bytes - 11
edata = ''
index = 0
loop do
break if index >= data.length
edata << mon_key.public_encrypt(data[index, block_size])
index += block_size
end
data = edata
end
# Send data
zdata = Zlib::Deflate.deflate(data, Zlib::BEST_COMPRESSION)
data64 = Base64.strict_encode64(zdata)
result = "SUCCESS" if result == "0" || result == 0
msg = "#{msg_type} #{result} #{oid} #{data64}"
socket_udp = UDPSocket.new()
socket_udp.send(msg, 0, mon_address, mon_port)
end
end

View File

@ -1039,3 +1039,50 @@ function get_nic_information {
OUTBOUND_PEAK_KB="${XPATH_ELEMENTS[j++]}"
ORDER="${XPATH_ELEMENTS[j++]}"
}
# Send message to monitor daemon
# This function reads monitor network and encryption settings from monitord.conf,
# packs and optionally encrypt the message and sends it to monitor daemon
# Parameters
# $1 Message type: MONITOR_VM, BEACON_HOST, MONITOR_HOST, SYSTEM_HOST, STATE_VM, LOG, ...
# $2 Result of the operation:
# 0 or "SUCCESS" means succesful monitoring
# everything else is failure
# $3 Object ID, use -1 if not relevant
# $4 Message payload (the monitoring data)
function send_to_monitor {
msg_type="$1"
msg_result="$2"
msg_oid="$3"
msg_payload="$4"
if [ "$msg_result" = "0" ]; then
msg_result=SUCCESS
fi
# Read monitord config
if [ -z "${ONE_LOCATION}" ]; then
mon_conf=/etc/one/monitord.conf
else
mon_conf=$ONE_LOCATION/etc/monitord.conf
fi
mon_config=$(augtool -L -l $mon_conf ls /files/$mon_conf/NETWORK)
mon_address=$(echo "$mon_config" | grep MONITOR_ADDRESS | awk '{print $3}')
mon_port=$(echo "$mon_config" | grep PORT | awk '{print $3}')
mon_key=$(echo "$mon_config" | grep PUBKEY | awk '{print $3}')
if [[ $mon_address == *"auto"* ]]; then
mon_address="127.0.0.1"
fi
# Send message
# todo if mon_key is not empty do message encryption
payload_b64="$(echo $msg_payload | \
ruby -e "require 'zlib'; puts Zlib::Deflate.deflate(STDIN.read)" | \
base64 -w 0)"
echo "$msg_type $msg_result $msg_oid $payload_b64" |
nc -u -w1 $mon_address $mon_port
}

View File

@ -155,7 +155,10 @@ void MonitorDriverProtocol::_beacon_host(message_t msg)
NebulaLog::warn("MDP", "Error condition detected on beacon for host "
+ to_string(msg->oid()) + ": " + msg->payload());
hm->error_monitor(msg->oid(), msg->payload());
if (msg->oid() >= 0)
{
hm->error_monitor(msg->oid(), msg->payload());
}
return;
}

View File

@ -75,49 +75,48 @@ echo "USED_MB=\$USED_MB"
echo "FREE_MB=\$FREE_MB"
echo "TOTAL_MB=\$TOTAL_MB"
if [ $MONITOR_VM_DISKS -eq 1 ]; then
vms=\$(ls "$BASE_PATH" | grep '^[0-9]\+$')
EOF
)
monitor=""
MONITOR_VM_SCRIPT=$(cat <<EOF
for vm in \$vms; do
vmdir="${BASE_PATH}/\${vm}"
disks=\$(ls "\$vmdir" 2>/dev/null | grep '^disk\.[0-9]\+$')
vms=\$(ls "$BASE_PATH" | grep '^[0-9]\+$')
[ -z \$disks ] && continue
monitor=""
vm_monitor=""
for vm in \$vms; do
vmdir="${BASE_PATH}/\${vm}"
disks=\$(ls "\$vmdir" 2>/dev/null | grep '^disk\.[0-9]\+$')
for disk in \$disks; do
disk_id="\$(echo "\$disk" | cut -d. -f2)"
disk_size="\$(du -mL "\${vmdir}/\${disk}" 2>/dev/null | awk '{print \$1}')"
snap_dir="\${vmdir}/\${disk}.snap"
[ -z \$disks ] && continue
[ -z "\$disk_size" ] && continue
vm_monitor=""
vm_monitor="\${vm_monitor} DISK_SIZE = [ ID=\${disk_id}, SIZE=\${disk_size}]"
for disk in \$disks; do
disk_id="\$(echo "\$disk" | cut -d. -f2)"
disk_size="\$(du -mL "\${vmdir}/\${disk}" 2>/dev/null | awk '{print \$1}')"
snap_dir="\${vmdir}/\${disk}.snap"
if [ -e "\$snap_dir" ]; then
snaps="\$(ls "\$snap_dir" 2>/dev/null | grep '^[0-9]$')"
[ -z "\$disk_size" ] && continue
for snap in \$snaps; do
snap_size="\$(du -mL "\${snap_dir}/\${snap}" 2>/dev/null | awk '{print \$1}')"
[ -z "\$snap_size" ] && continue
vm_monitor="\${vm_monitor} DISK_SIZE = [ ID=\${disk_id}, SIZE=\${disk_size}]"
vm_monitor="\${vm_monitor}\nSNAPSHOT_SIZE = "\
"[ ID=\${snap}, DISK_ID=\${disk_id}, SIZE=\${snap_size}]"
done
fi
done
if [ -e "\$snap_dir" ]; then
snaps="\$(ls "\$snap_dir" 2>/dev/null | grep '^[0-9]$')"
vm_monitor_b64="\$(echo \$vm_monitor | base64 -w 0)"
monitor="\${monitor}VM=[ID=\$vm,MONITOR=\"\$vm_monitor_b64\"] "
for snap in \$snaps; do
snap_size="\$(du -mL "\${snap_dir}/\${snap}" 2>/dev/null | awk '{print \$1}')"
[ -z "\$snap_size" ] && continue
vm_monitor="\${vm_monitor}\nSNAPSHOT_SIZE = "\
"[ ID=\${snap}, DISK_ID=\${disk_id}, SIZE=\${snap_size}]"
done
fi
done
monitor_b64="\$(echo \$monitor | ruby -e "require 'zlib';\
puts Zlib::Deflate.deflate(STDIN.read)" | base64 -w 0)"
echo MONITOR_VM SUCCESS 0 \$monitor_b64 | nc -u -w0 127.0.0.1 4124
fi
vm_monitor_b64="\$(echo \$vm_monitor | base64 -w 0)"
echo "VM=[ID=\$vm, MONITOR=\"\$vm_monitor_b64\"] "
done
EOF
)
@ -125,16 +124,26 @@ EOF
if [ -n "$BRIDGE_LIST" ]; then
HOST=`get_destination_host`
MONITOR_DATA=$(ssh_monitor_and_log "$HOST" "$MONITOR_SCRIPT" "Remote monitor script" 2>&1)
MONITOR_STATUS=$?
if [ $MONITOR_VM_DISKS -eq 1 ]; then
MONITOR_DATA_VMS=$(ssh_monitor_and_log "$HOST" "$MONITOR_VM_SCRIPT" "Remote VM disks monitor script" 2>&1)
MONITOR_VMS_STATUS=$?
fi
else
MONITOR_DATA=$(monitor_and_log "$MONITOR_SCRIPT" "Monitor script" 2>&1)
MONITOR_STATUS=$?
if [ $MONITOR_VM_DISKS -eq 1 ]; then
MONITOR_DATA_VMS=$(monitor_and_log "$MONITOR_VM_SCRIPT" "VM disks monitor script" 2>&1)
MONITOR_VMS_STATUS=$?
fi
fi
MONITOR_STATUS=$?
echo $MONITOR_DATA
if [ "$MONITOR_STATUS" = "0" ]; then
echo "$MONITOR_DATA"
exit 0
else
echo "$MONITOR_DATA"
exit $MONITOR_STATUS
if [ $MONITOR_VM_DISKS -eq 1 ]; then
send_to_monitor MONITOR_VM $MONITOR_VMS_STATUS -1 "$MONITOR_DATA_VMS"
fi
exit $MONITOR_STATUS