web-dev-qa-db-ja.com

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

最近、組織がMacを管理するためのJAMF JSSを入手しました。私は、拡張属性(基本的にはカスタムインベントリレコードフィールド)と呼ばれるスクリプトを作成しようとしています。私が欲しいのは、DeepFreezeのステータスが何であるかを示す各Macのフィールドです。

Deep Freezeステータスの既存のテンプレートはありますが、古く、機能しません。

新しいスクリプトを見つけましたが、いわばそのままでは機能しなかったので、構文を編集しましたが、「解凍」されたマシンでも「Frozen」が返されることに気付きました。

#!/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-pstatus」の直後に-xを追加すると、XMLが出力されることがわかりました。その出力には次のものがあります。

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

ここで、xは0、1、または2です。0= 凍結、1 = 次のx回の再起動のためにブートが解凍されました、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
Justin_T

このソリューションは長く見えるかもしれませんが、実際にはコードがはるかに少なく、簡単にテストできます。問題の一部は、質の悪いスクリプトから始めたようです。通常、複数の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

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

$ 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
$
0
RobertL

砥石にもう少し鼻を突っ込んだ後、うまくいくものを思いついた。

#!/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

より良い/よりエレガントな方法があるかもしれませんが、私は私が望むものを手に入れたと思います。

0
Justin_T