modemmanager: move generally applicable functions to modemmanager.common
[feed/packages.git] / net / modemmanager / files / modemmanager.common
index 2ba2036ce9281b61364ebbff598e1fb5fa11b0a3..4daffb2c1820187e35890b6d3d99672a6a21bf6f 100644 (file)
@@ -6,7 +6,6 @@
 
 . /lib/functions.sh
 . /lib/netifd/netifd-proto.sh
-INCLUDE_ONLY=1 . /lib/netifd/proto/modemmanager.sh
 
 ################################################################################
 # Runtime state
@@ -351,3 +350,69 @@ mm_report_events_from_cache() {
                mm_report_event_from_cache_line "${event_line}"
        done < ${MODEMMANAGER_EVENTS_CACHE}
 }
+
+# This method expects as first argument a list of key-value pairs, as returned by mmcli --output-keyvalue
+# The second argument must be exactly the name of the field to read
+#
+# Sample output:
+#     $ mmcli -m 0 -K
+#     modem.dbus-path                                 : /org/freedesktop/ModemManager1/Modem/0
+#     modem.generic.device-identifier                 : ed6eff2e3e0f90463da1c2a755b2acacd1335752
+#     modem.generic.manufacturer                      : Dell Inc.
+#     modem.generic.model                             : DW5821e Snapdragon X20 LTE
+#     modem.generic.revision                          : T77W968.F1.0.0.4.0.GC.009\n026
+#     modem.generic.carrier-configuration             : GCF
+#     modem.generic.carrier-configuration-revision    : 08E00009
+#     modem.generic.hardware-revision                 : DW5821e Snapdragon X20 LTE
+#     ....
+modemmanager_get_field() {
+       local list=$1
+       local field=$2
+       local value=""
+
+       [ -z "${list}" ] || [ -z "${field}" ] && return
+
+       # there is always at least a whitespace after each key, and we use that as part of the
+       # key matching we do (e.g. to avoid getting 'modem.generic.state-failed-reason' as a result
+       # when grepping for 'modem.generic.state'.
+       line=$(echo "${list}" | grep "${field} ")
+       value=$(echo ${line#*:})
+
+       # not found?
+       [ -n "${value}" ] || return 2
+
+       # only print value if set
+       [ "${value}" != "--" ] && echo "${value}"
+       return 0
+}
+
+# build a comma-separated list of values from the list
+modemmanager_get_multivalue_field() {
+       local list=$1
+       local field=$2
+       local value=""
+       local length idx item
+
+       [ -z "${list}" ] || [ -z "${field}" ] && return
+
+       length=$(modemmanager_get_field "${list}" "${field}.length")
+       [ -n "${length}" ] || return 0
+       [ "$length" -ge 1 ] || return 0
+
+       idx=1
+       while [ $idx -le "$length" ]; do
+               item=$(modemmanager_get_field "${list}" "${field}.value\[$idx\]")
+               [ -n "${item}" ] && [ "${item}" != "--" ] && {
+                       [ -n "${value}" ] && value="${value}, "
+                       value="${value}${item}"
+               }
+               idx=$((idx + 1))
+       done
+
+       # nothing built?
+       [ -n "${value}" ] || return 2
+
+       # only print value if set
+       echo "${value}"
+       return 0
+}