Hello everyone,
i’m looking into adding more attributes to the mender client inventory, to keep an eye that the necessary devices are connected.
i’m encountering that i am unable to use a bash inside a bash to generate my attributes, let me give an example
last line will ask bash to execute another script ‘keyboardconnect’
#!/bin/bash
set -ue
LC_ALL=C
export LC_ALL
grep ‘model name’ /proc/cpuinfo | uniq | awk -F’: ’ ’
// { printf(“cpu_model=%s\n”, $2);}
’
echo “kernel=$(cat /proc/version)”
cat /proc/meminfo | awk ’
/MemTotal/ {printf(“mem_total_kB=%d\n”, $2)}
’
echo “hostname=$(cat /etc/hostname)”
echo “keyboard-connected=$(./keyboardconnect)”
content keyboardconnect
#!/bin/bash
if [[ $(lsusb | grep 03f0:034a) ]]; then
echo “connected”
else
echo “not connected”
fi
this generates:
root@localhost:/usr/share/mender/inventory# ./mender-inventory-hostinfo
cpu_model=ARMv7 Processor rev 3 (v7l)
kernel=Linux version 4.19.75-v7l+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g84
60611)) #1270 SMP Tue Sep 24 18:51:41 BST 2019
mem_total_kB=3999784
hostname=localhost
keyboard-connected=connected
yet the attribute on mender stays empty
but when keeping the keyboard script locally
#!/bin/bash
set -ue
keyboard1=“error”
if [[ $(lsusb|grep 03f0:034a) ]]; then
keyboard1=“connected”
else
keyboard1=“not connected”
fi
LC_ALL=C
export LC_ALL
grep ‘model name’ /proc/cpuinfo | uniq | awk -F’: ’ ’
// { printf(“cpu_model=%s\n”, $2);}
’
echo “kernel=$(cat /proc/version)”
cat /proc/meminfo | awk ’
/MemTotal/ {printf(“mem_total_kB=%d\n”, $2)}
’
echo “hostname=$(cat /etc/hostname)”
echo “keyboard-connected=${keyboard1}”
is giving the same output in terminal, but this one does work, could someone explain why this is the case?
Greets and thanks, Gene
Hi Gene,
I’m not certain but I have 2 suggestions.
- Your “cat /etc/hostname” bit is missing a “$”. It may work like this but I’m not sure what the side effects are.
- Just on a hunch, can you change the key value to be “keyboard_connected”? I’m not sure if I’ve ever tried an inventory key with a ‘-’ in the name.
Drew
hello @drewmoseley thank you for the reply
i tried the “-” and this worked without a problem.
my scripts by this time changed quite a with more succes, but i still could use you advice on this.
mender-inventory-cardreader which is a simple grep on lsusb of an device ID
#!/bin/bash
if [[ $(lsusb | grep 03f0:034a) ]]; then
echo "cardreader=connected"
else
echo "cardreader=not-connected"
fi
and this works fine, now i made another script where, only the ID of the device has been detected once, it wil give it status in the future (to prevent of giving an inventory of devices not meant for that mender client)
mender-inventory-printer ↓
#!/bin/bash
source mender-inventory-variables
echo "mender-inventory-variables=$active_printerM2"
#to test if importing variable works
if [[ "$active_printer" = "0" ]];then
if [[ $(lsusb | grep 04b8:0e15) ]]; then
new_active_printer="1"
sed -r -i.bak "s/active_printer=([[:graph:]]+)/active_printer=$new_active_printer/" mender-inventory-variables
#set variable active_keyboard to 1 in mender-inventory-variables
source mender-inventory-variables
#reload the variables from mender-inventory-variables
fi
fi
if [[ "$active_printerM2" = "1" ]]; then
if [[ $(lsusb | grep 04b8:0e15) ]]; then
echo "Printer=connected"
else
echo "Printer=not_connected"
fi
fi
when running this script manually it gives an normal output
(mender-inventory-variables=1 is just to test the IF)
but this script does not work/ give feedback to mender inventory, and is actually the original problem.
root@localhost:/usr/share/mender/inventory# ./mender-inventory-printer
mender-inventory-variables=1
Printer=connected
both scripts give the ‘attribute=value’ as described in the doc’s
Thanks for the help, Gene
I can’t answer why it works when you run it manually but I think the culprit is the line:
if [[ $(lsusb | grep 04b8:0e15) ]]; then
That seems like it should be
if lsusb | grep -q 04b8:0e15; then
or
if [[ -z "$(lsusb | grep 04b8:0e15)" ]]; then
Drew
The problem is using of relative path names to invoke the scripts from within the script. Try using the full path name for the script instead. For example:
echo “keyboard-connected=$(./keyboardconnect)”
should be
echo “keyboard-connected=$(/full/path/to/location/of/keyboardconnect)”
hello @madisox @drewmoseley,
it seemed that the use of ‘source’ the use of AND (&&) operant made the right ‘output’ terminal wise, but not for mender. the workaround i ended doing is
if [[ $(lsusb | grep 04b8:0e28 && grep active_printer_model3=1 mender-inventory-variables) ]]; then
echo "Printer=connected"
else
echo "Printer=not_connected"
fi
if [[ $(lsusb | grep 04b8:0e28 && grep active_printer_model3=0 mender-inventory-variables) ]]; then
active_printer_model3="1"
sed -r -i.bak "s/active_printer_model3=([[:graph:]]+)/active_printer_model3=$new_active_printer_model3/" /usr/share/mender/inventory/mender-inventory-variables
fi
the use off full path (to change a variable) was also a solution
Thanks Gene