Update 2013-03-20: hcgrep has been merged into CFEngine design center
Because cf-promises -v displays hard classes as a single line, it requires a thorough read to determine if a specific hard class is defined, and grep did not help much because they are returned as a single line:
(wrapped for lisibility)
# cf-promises -v|grep freebsd
cf3> Operating System Type is freebsd
cf3> Using internal soft-class freebsd for host bsd82.local
cf3> Additional hard class defined as: freebsd_8_2_RELEASE_p4
cf3> Additional hard class defined as: freebsd_amd64
cf3> Additional hard class defined as: freebsd_amd64_8_2_RELEASE_p4
cf3> GNU autoconf class from compile time: compiled_on_freebsd8_2
cf3> -> Hard classes = { 172_16_100_1 172_16_2_1 192_168_2_14 1_cpu 64_bit Afternoon Day17 GMT_Hr12 Hr13 Hr13_Q1 Lcycle_0 March Min00
Min00_05 PK_MD5_e964d2ce7a4dd7887a7374142cff1fb7 Q1 Sunday Yr2013 amd64 any bsd82 bsd82_local cfengine cfengine_3 cfengine_3_5
cfengine_3_5_0a2 common community_edition compiled_on_freebsd8_2 freebsd freebsd_8_2 freebsd_8_2_RELEASE_p4 freebsd_amd64
freebsd_amd64_8_2_RELEASE_p4 ipv4_172 ipv4_172_16 ipv4_172_16_100 ipv4_172_16_100_1 ipv4_172_16_2 ipv4_172_16_2_1 ipv4_192
ipv4_192_168 ipv4_192_168_2 ipv4_192_168_2_14 local mac_unknown net_iface_em0 net_iface_gif0 net_iface_le0 verbose_mode }
Awk can help to split each hard class over separate lines, to render them prettier:
# cf-promises -v|awk '/Hard classes/ {for (i=7;i<=NF-1;i++) {print $i}}'|grep freebsd
compiled_on_freebsd8_2
freebsd
freebsd_8_2
freebsd_8_2_RELEASE_p4
freebsd_amd64
freebsd_amd64_8_2_RELEASE_p4
freebsd_amd64_8_2_RELEASE_p4_FreeBSD_8_2_RELEASE_p4__1__Sat_Nov_26_18_29_54_CET_2011_____root_bsd82_local__usr_obj_usr_src_sys_LP
- i=7: skip over “cf3> -> Hard classes = {”
- NF-1: skip terminating “}”
The next step is to create a shell alias for more convenience (I use Bash, and a function is required to use a parameter)
Add the following code to your ~/.bashrc or ~/.bash_profile, then to use it immediately source it with source ~/.bashrc
myhcgrep() {
awk '/Hard classes/ {for (i=7;i<=NF-1;i++) {print $i}}' | grep $1
}
alias hcgrep=myhcgrep
It is now easy to grep for specified hard classes patterns:
# cf-promises -v| hcgrep net_iface
net_iface_em0
net_iface_gif0
net_iface_le0
# cf-promises -v| hcgrep freebsd
compiled_on_freebsd8_2
freebsd
freebsd_8_2
freebsd_8_2_RELEASE_p4
freebsd_amd64
freebsd_amd64_8_2_RELEASE_p4
freebsd_amd64_8_2_RELEASE_p4_FreeBSD_8_2_RELEASE_p4__1__Sat_Nov_26_18_29_54_CET_2011_____root_bsd82_local__usr_obj_usr_src_sys_LP
# cf-promises -v| hcgrep cfengine
cfengine
cfengine_3
cfengine_3_5
cfengine_3_5_0a2
The alias can be prefixed with “cf-promises -v” to shorten the command, but you will miss the ability to use a specific cf-promises binary.
myhcgrep() {
cf-promises -v | awk '/Hard classes/ {for (i=7;i<=NF-1;i++) {print $i}}' | grep $1
}
alias hcgrep=myhcgrep
# hcgrep net_iface
net_iface_em0
net_iface_gif0
net_iface_le0