特定の応答の出力を解析する方法(JAMF JSSの拡張属性の生成)

特定の応答の出力を解析する方法(JAMF JSSの拡張属性の生成)

私たちは最近、Macを管理するために組織にJAMF JSSを提供し、拡張属性(デフォルトではカスタムインベントリレコードフィールド)と呼ばれるスクリプトを作成しようとしています。私が望むのは、各MacにDeep Freezeステータスを示すフィールドがあることです。

ディープフリーズ状態のための既存のテンプレートがありますが、古いので動作しません。

私は最新のスクリプトを見つけましたが、私はすぐに機能しなかったので構文を編集しましたが、「解凍された」システムに対しても「凍結」を返すことがわかりました。

#!/bin/bash

DFStatus=$(DFXPSWD="password" /Library/Application\ Support/Faronics/Deep\ Freeze/deepfreeze -u "user" -p status | grep "Frozen" | awk '{ print $3 }' | awk -F: '{ print $2 }')

if [ ! -f /Library/Application\ Support/Faronics/Deep\ Freeze/deepfreeze ]; then
echo "<result>DeepFreeze not installed.</result>"
elif [ "$DFStatus" == "TRUE" ] ; then
        echo "<result>Frozen</result>"
else
        echo "<result>Thawed</result>"
fi
fi
exit

12行目の構文エラーが原因で失敗したため、編集する必要がありました。私は「elif」を「else if」に変更し、最後の「fi」をコメントアウトしました。前述の内容を除いては機能しているようです。

「deepfreeze -p status」の後に-xを追加するとXMLが出力されることがわかりました。出力には以下が含まれます。

<key>bootHow</key>
<integer>x</key>

ここで、xは0、1、または2です。 0 =を見つけました。冬の王国、1 =次の再起動のために起動が解除されました。,2=ブート解凍

私が望むのは、対応するキーと整数を探して、上記の応答の1つを返すスクリプトを作成することです。

しかし、私のawk/sed/etc。スキルがNULLです。これが私が思い出すことができる最善の方法です。次の手順を試してみると詰まります。

DFStatus=$(DFXPSWD=Password ./deepfreeze -u User -p status -x | grep -A1 "<key>bootHow</key>"| awk -F'<key>bootHow</key>' '{print $1}')

望ましくないテキストを削除するためにこれ以上の手順を実行できると思いましたが、うまくいきません。

助けが必要ですか?

答え1

このソリューションは長く見えるかもしれませんが、実際にはコードがはるかに少なく、テストするのが簡単です。問題の一部は、品質の低いスクリプトで始まるようです。awk複数のコマンドを含むパイプラインが改善されることがよくあります。次のことがあなたの状況に適しているかどうかはわかりませんが、この問題を解決する1つの方法についてより多くの洞察を得ることができることを願っています。

XMLストリームから整数値を取得するには、awk次のように使用できます。

awk '
    /<key>bootHow<\/key>/ {
        getline
        gsub("[^0-9]*integer[^0-9]*", "");
        print;
     }
'
  • /<key>bootHow<\/key>/中かっこ内の操作で修正される行を指定します{ ... }
  • getline次の入力行を$ 0として読みます。次の行には整数コードを含める必要があります。
  • gsub行から数字以外の数字をすべて削除します。
  • printワイヤー。awkデフォルトでは、行は印刷されません。

これを関数に結合し、整数値を文字列記述に変換する別の関数を書くことで、以下のテストされたコードのようなものを思い出すことができます。

このboothow関数は、awk前述のスクリプトをカプセル化します。

このdfstatus関数は標準入力から「bootHow」コードを読み取り、対応するdfステータス文字列を標準出力に出力します。

このスクリプトは現在テスト用に設定されています。これを実行すると、一部のテストデータがプロセスに保存されます。回線呼び出しはdeepfreezeコメントアウトされます。

#!/bin/sh

deepfreeze_status() {
    deepfreeze=/Library/Application\ Support/Faronics/Deep\ Freeze/deepfreeze
    if [ ! -x "$deepfreeze" ]
    then
        status="DeepFreeze not installed"
    else
        status=$(
            DFXPSWD=password "$deepfreeze" -u user -p status -x |
             boothow |
             dfstatus
        )
    fi
    echo "<result>$status</result>"
}

test_boothow() {
    # test boothow and dfstatus functions:
    dfdata='
        <integer>a</integer>
        <key>other1</key>
        <integer>b</integer>
        <key>bootHow</key>
        <integer>1</integer>
        <key>other2</key>
        <integer>c</integer>
    '
    echo "$dfdata" | boothow | dfstatus
}

boothow() {
    awk '
        /<key>bootHow<\/key>/ {
            getline
            gsub("[^0-9]*", "");
            print;
        }
    '
}

dfstatus() {
    while read bhow
    do
        case $bhow in
            0) echo "frozen" ;;
            1) echo "boot thawed for next x reboots" ;;
            2) echo "boot thawed" ;;
            *) echo "unknown status '$bhow'"; return 1 ;;
        esac
    done
}

test_boothow
#deepfreeze_status

次の録画では、上記のスクリプトが./myscript.sh

実行すると. ./myscript.sh(ローンを参照.)、インタラクティブシェルはスクリプトを読み取り、実行します。現在のシェルプロセスを入力してください。これらの機能は現在シェルに存在し、コマンドとして使用できます。

$ . ./myscript.sh
boot thawed for next x reboots

これで、現在のシェルでコマンドとboothowコマンドを使用できるようになりました。テストコマンド:dfstatustest_boothowdeepfreeze_statusboothow

$ boothow
<key>bootHow</key>
<integer>2</integer>
2
$ printf '<key>bootHow</key>\n<integer>2</integer>\n' | boothow
2

dfstatus終了ステータスコード()を含むテストコマンド$?

$ dfstatus
0
frozen
1
boot thawed for next x reboots
2
boot thawed
3
unknown status '3'
$ echo $?
1
$
$ echo 1 | dfstatus
boot thawed for next x reboots
$ echo $?
0
$ echo 1 1 | dfstatus
unknown status '1 1'
$ echo $?
1
$

答え2

少しの努力の終わりに、私は効果的ないくつかの方法を思い出しました。

#!/bin/bash

# Queries Deep Freeze status and returns either Frozen, Thawed, or Deep Freeze Not Installed
# Replace password and user below with your Deep Freeze user and password

DFStatus=$(DFXPSWD=password /Library/Application\ Support/Faronics/Deep\ Freeze/deepfreeze -u user -p status -x | grep -A1 "<key>bootHow</key>"| awk '{gsub("<key>bootHow</key>", "");print}'| awk '{gsub("<integer>", "");print}' | awk '{gsub("</integer>", "");print}')

if [ ! -f /Library/Application\ Support/Faronics/Deep\ Freeze/deepfreeze ]; then
echo "<result>DeepFreeze not installed.</result>"
fi

if [ "$DFStatus" -eq "0" ]; then
        echo "<result>Frozen</result>"
fi

if [ "$DFStatus" -eq "1" ] || [ "$DFStatus" -eq "2" ] ; then
        echo "<result>Thawed</result>"
fi

exit

おそらくより良い/よりエレガントな方法があります。しかし、私が欲しいものを手に入れたようです。

関連情報