私たちは最近、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
コマンドを使用できるようになりました。テストコマンド: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
$
答え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
おそらくより良い/よりエレガントな方法があります。しかし、私が欲しいものを手に入れたようです。