最近、組織が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}')
不要なテキストを削除するために、もっと多くの手順を実行できると思いましたが、機能しませんでした。
何か助けはありますか?
このソリューションは長く見えるかもしれませんが、実際にはコードがはるかに少なく、簡単にテストできます。問題の一部は、質の悪いスクリプトから始めたようです。通常、複数の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
とdfstatus
とtest_boothow
とdeepfreeze_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
$
砥石にもう少し鼻を突っ込んだ後、うまくいくものを思いついた。
#!/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
より良い/よりエレガントな方法があるかもしれませんが、私は私が望むものを手に入れたと思います。