golden hour
/opt/osquery/share/osquery/lenses
⬆️ Go Up
Upload
File/Folder
Size
Actions
COPYING
25.91 KB
Del
OK
access.aug
3.58 KB
Del
OK
activemq_conf.aug
1.47 KB
Del
OK
activemq_xml.aug
864 B
Del
OK
afs_cellalias.aug
1.56 KB
Del
OK
aliases.aug
2.18 KB
Del
OK
anaconda.aug
775 B
Del
OK
anacron.aug
2.49 KB
Del
OK
approx.aug
1.26 KB
Del
OK
apt_update_manager.aug
1.11 KB
Del
OK
aptcacherngsecurity.aug
726 B
Del
OK
aptconf.aug
3.9 KB
Del
OK
aptpreferences.aug
1.79 KB
Del
OK
aptsources.aug
1.98 KB
Del
OK
authorized_keys.aug
1.84 KB
Del
OK
automaster.aug
3.31 KB
Del
OK
automounter.aug
4.05 KB
Del
OK
avahi.aug
1.38 KB
Del
OK
backuppchosts.aug
1014 B
Del
OK
bbhosts.aug
4.24 KB
Del
OK
bootconf.aug
3.65 KB
Del
OK
build.aug
16.65 KB
Del
OK
cachefilesd.aug
2 KB
Del
OK
carbon.aug
1.54 KB
Del
OK
ceph.aug
719 B
Del
OK
cgconfig.aug
3.37 KB
Del
OK
cgrules.aug
2.38 KB
Del
OK
channels.aug
3.84 KB
Del
OK
chrony.aug
12.87 KB
Del
OK
clamav.aug
1.53 KB
Del
OK
cobblermodules.aug
398 B
Del
OK
cobblersettings.aug
2.24 KB
Del
OK
collectd.aug
869 B
Del
OK
cpanel.aug
824 B
Del
OK
cron.aug
4.05 KB
Del
OK
cron_user.aug
1.26 KB
Del
OK
crypttab.aug
3.01 KB
Del
OK
csv.aug
1.18 KB
Del
OK
cups.aug
459 B
Del
OK
cyrus_imapd.aug
1.51 KB
Del
OK
darkice.aug
773 B
Del
OK
debctrl.aug
3.61 KB
Del
OK
desktop.aug
1.39 KB
Del
OK
devfsrules.aug
619 B
Del
OK
device_map.aug
620 B
Del
OK
dhclient.aug
6.69 KB
Del
OK
dhcpd.aug
20.88 KB
Del
OK
dns_zone.aug
2.89 KB
Del
OK
dnsmasq.aug
2.16 KB
Del
OK
dovecot.aug
3.98 KB
Del
OK
dpkg.aug
2.78 KB
Del
OK
dput.aug
2.16 KB
Del
OK
erlang.aug
4.33 KB
Del
OK
ethers.aug
663 B
Del
OK
exports.aug
2.37 KB
Del
OK
fai_diskconfig.aug
9.28 KB
Del
OK
fonts.aug
819 B
Del
OK
fstab.aug
1.23 KB
Del
OK
fuse.aug
871 B
Del
OK
gdm.aug
1.8 KB
Del
OK
getcap.aug
1.57 KB
Del
OK
group.aug
1.66 KB
Del
OK
grub.aug
11.04 KB
Del
OK
grubenv.aug
508 B
Del
OK
gshadow.aug
2.19 KB
Del
OK
gtkbookmarks.aug
855 B
Del
OK
host_conf.aug
1.9 KB
Del
OK
hostname.aug
435 B
Del
OK
hosts.aug
485 B
Del
OK
hosts_access.aug
4.32 KB
Del
OK
htpasswd.aug
1.02 KB
Del
OK
httpd.aug
7.35 KB
Del
OK
inetd.aug
6.22 KB
Del
OK
inifile.aug
15.49 KB
Del
OK
inittab.aug
780 B
Del
OK
inputrc.aug
1.62 KB
Del
OK
interfaces.aug
4.62 KB
Del
OK
iproute2.aug
323 B
Del
OK
iptables.aug
2.64 KB
Del
OK
iscsid.aug
684 B
Del
OK
jaas.aug
1.57 KB
Del
OK
jettyrealm.aug
1.52 KB
Del
OK
jmxaccess.aug
1.35 KB
Del
OK
jmxpassword.aug
1.34 KB
Del
OK
json.aug
2.15 KB
Del
OK
kdump.aug
2.91 KB
Del
OK
keepalived.aug
10.7 KB
Del
OK
known_hosts.aug
1.93 KB
Del
OK
koji.aug
898 B
Del
OK
krb5.aug
6.16 KB
Del
OK
ldif.aug
7.65 KB
Del
OK
ldso.aug
1.06 KB
Del
OK
lightdm.aug
1.75 KB
Del
OK
limits.aug
2.02 KB
Del
OK
login_defs.aug
615 B
Del
OK
logrotate.aug
4.22 KB
Del
OK
logwatch.aug
1.44 KB
Del
OK
lokkit.aug
2.16 KB
Del
OK
lvm.aug
2.03 KB
Del
OK
mailscanner.aug
1.66 KB
Del
OK
mailscanner_rules.aug
2.84 KB
Del
OK
masterpasswd.aug
4.36 KB
Del
OK
mcollective.aug
1.09 KB
Del
OK
mdadm_conf.aug
10.05 KB
Del
OK
memcached.aug
1.24 KB
Del
OK
mke2fs.aug
4.67 KB
Del
OK
modprobe.aug
3.34 KB
Del
OK
modules.aug
741 B
Del
OK
modules_conf.aug
1.04 KB
Del
OK
mongodbserver.aug
1.17 KB
Del
OK
monit.aug
2.13 KB
Del
OK
multipath.aug
4.21 KB
Del
OK
mysql.aug
1.95 KB
Del
OK
nagioscfg.aug
2.09 KB
Del
OK
nagiosobjects.aug
1.57 KB
Del
OK
netmasks.aug
1.69 KB
Del
OK
networkmanager.aug
2 KB
Del
OK
networks.aug
1.09 KB
Del
OK
nginx.aug
3.65 KB
Del
OK
nrpe.aug
1.75 KB
Del
OK
nslcd.aug
9.87 KB
Del
OK
nsswitch.aug
2.33 KB
Del
OK
ntp.aug
5.29 KB
Del
OK
ntpd.aug
4.75 KB
Del
OK
odbc.aug
1.42 KB
Del
OK
opendkim.aug
3.08 KB
Del
OK
openshift_config.aug
2.46 KB
Del
OK
openshift_http.aug
1.03 KB
Del
OK
openshift_quickstarts.aug
1.02 KB
Del
OK
openvpn.aug
22.28 KB
Del
OK
oz.aug
1.35 KB
Del
OK
pagekite.aug
2.6 KB
Del
OK
pam.aug
2.58 KB
Del
OK
pamconf.aug
1.23 KB
Del
OK
passwd.aug
3.52 KB
Del
OK
pbuilder.aug
638 B
Del
OK
pg_hba.aug
2.97 KB
Del
OK
pgbouncer.aug
1.43 KB
Del
OK
php.aug
2.34 KB
Del
OK
phpvars.aug
3.85 KB
Del
OK
postfix_access.aug
771 B
Del
OK
postfix_main.aug
1.52 KB
Del
OK
postfix_master.aug
1.9 KB
Del
OK
postfix_passwordmap.aug
1.28 KB
Del
OK
postfix_sasl_smtpd.aug
697 B
Del
OK
postfix_transport.aug
1.48 KB
Del
OK
postfix_virtual.aug
1.32 KB
Del
OK
postgresql.aug
2.1 KB
Del
OK
properties.aug
2.3 KB
Del
OK
protocols.aug
1.05 KB
Del
OK
puppet.aug
1.52 KB
Del
OK
puppet_auth.aug
1.95 KB
Del
OK
puppetfile.aug
2.27 KB
Del
OK
puppetfileserver.aug
3.12 KB
Del
OK
pylonspaste.aug
2.3 KB
Del
OK
pythonpaste.aug
1.99 KB
Del
OK
qpid.aug
670 B
Del
OK
quote.aug
6.71 KB
Del
OK
rabbitmq.aug
4.69 KB
Del
OK
radicale.aug
1.48 KB
Del
OK
rancid.aug
927 B
Del
OK
redis.aug
4.96 KB
Del
OK
reprepro_uploaders.aug
5.47 KB
Del
OK
resolv.aug
3.87 KB
Del
OK
rhsm.aug
1.1 KB
Del
OK
rmt.aug
788 B
Del
OK
rsyncd.aug
1.97 KB
Del
OK
rsyslog.aug
3.17 KB
Del
OK
rtadvd.aug
854 B
Del
OK
rx.aug
4.06 KB
Del
OK
samba.aug
1.71 KB
Del
OK
schroot.aug
1.79 KB
Del
OK
securetty.aug
450 B
Del
OK
semanage.aug
859 B
Del
OK
sep.aug
1.28 KB
Del
OK
services.aug
2.82 KB
Del
OK
shadow.aug
2.35 KB
Del
OK
shells.aug
745 B
Del
OK
shellvars.aug
11.97 KB
Del
OK
shellvars_list.aug
1.74 KB
Del
OK
simplelines.aug
1.13 KB
Del
OK
simplevars.aug
1.34 KB
Del
OK
sip_conf.aug
1.61 KB
Del
OK
slapd.aug
5.2 KB
Del
OK
smbusers.aug
781 B
Del
OK
solaris_system.aug
3.15 KB
Del
OK
soma.aug
1.14 KB
Del
OK
spacevars.aug
1.42 KB
Del
OK
splunk.aug
1.64 KB
Del
OK
squid.aug
15.95 KB
Del
OK
ssh.aug
3.91 KB
Del
OK
sshd.aug
4.01 KB
Del
OK
sssd.aug
861 B
Del
OK
star.aug
941 B
Del
OK
strongswan.aug
1.63 KB
Del
OK
stunnel.aug
2.21 KB
Del
OK
subversion.aug
2.75 KB
Del
OK
sudoers.aug
20.03 KB
Del
OK
sysconfig.aug
2.49 KB
Del
OK
sysconfig_route.aug
2.55 KB
Del
OK
sysctl.aug
923 B
Del
OK
syslog.aug
7.33 KB
Del
OK
systemd.aug
5.88 KB
Del
OK
termcap.aug
1.03 KB
Del
OK
thttpd.aug
1.31 KB
Del
OK
tmpfiles.aug
3.03 KB
Del
OK
toml.aug
4.06 KB
Del
OK
trapperkeeper.aug
4.01 KB
Del
OK
tuned.aug
387 B
Del
OK
up2date.aug
2.21 KB
Del
OK
updatedb.aug
1.13 KB
Del
OK
util.aug
4.85 KB
Del
OK
vfstab.aug
1.71 KB
Del
OK
vmware_config.aug
702 B
Del
OK
vsftpd.aug
2.72 KB
Del
OK
webmin.aug
1.23 KB
Del
OK
wine.aug
1.92 KB
Del
OK
xendconfsxp.aug
1.07 KB
Del
OK
xinetd.aug
4.02 KB
Del
OK
xml.aug
6.33 KB
Del
OK
xorg.aug
10.43 KB
Del
OK
xymon.aug
2.26 KB
Del
OK
xymon_alerting.aug
6.11 KB
Del
OK
yaml.aug
1.54 KB
Del
OK
yum.aug
2.19 KB
Del
OK
Edit: dhcpd.aug
(* Module: Dhcpd BIND dhcp 3 server configuration module for Augeas Author: Francis Giraldeau <francis.giraldeau@usherbrooke.ca> About: Reference Reference: manual of dhcpd.conf and dhcp-eval Follow dhclient module for tree structure About: License This file is licensed under the GPL. About: Lens Usage Sample usage of this lens in augtool Directive without argument. Set this dhcpd server authoritative on the domain. > clear /files/etc/dhcp3/dhcpd.conf/authoritative Directives with integer or string argument. Set max-lease-time to one hour: > set /files/etc/dhcp3/dhcpd.conf/max-lease-time 3600 Options are declared as a list, even for single values. Set the domain of the network: > set /files/etc/dhcp3/dhcpd.conf/option/domain-name/arg example.org Set two name server: > set /files/etc/dhcp3/dhcpd.conf/option/domain-name-servers/arg[1] foo.example.org > set /files/etc/dhcp3/dhcpd.conf/option/domain-name-servers/arg[2] bar.example.org Create the subnet 172.16.0.1 with 10 addresses: > clear /files/etc/dhcp3/dhcpd.conf/subnet[last() + 1] > set /files/etc/dhcp3/dhcpd.conf/subnet[last()]/network 172.16.0.0 > set /files/etc/dhcp3/dhcpd.conf/subnet[last()]/netmask 255.255.255.0 > set /files/etc/dhcp3/dhcpd.conf/subnet[last()]/range/from 172.16.0.10 > set /files/etc/dhcp3/dhcpd.conf/subnet[last()]/range/to 172.16.0.20 Create a new group "foo" with one static host. Nodes type and address are ordered. > ins group after /files/etc/dhcp3/dhcpd.conf/subnet[network='172.16.0.0']/*[last()] > set /files/etc/dhcp3/dhcpd.conf/subnet[network='172.16.0.0']/group[last()]/host foo > set /files/etc/dhcp3/dhcpd.conf/subnet[network='172.16.0.0']/group[host='foo']/host/hardware/type "ethernet" > set /files/etc/dhcp3/dhcpd.conf/subnet[network='172.16.0.0']/group[host='foo']/host/hardware/address "00:00:00:aa:bb:cc" > set /files/etc/dhcp3/dhcpd.conf/subnet[network='172.16.0.0']/group[host='foo']/host/fixed-address 172.16.0.100 About: Configuration files This lens applies to /etc/dhcpd3/dhcpd.conf. See <filter>. *) module Dhcpd = autoload xfm (************************************************************************ * USEFUL PRIMITIVES *************************************************************************) let dels (s:string) = del s s let eol = Util.eol let comment = Util.comment let empty = Util.empty let indent = Util.indent let eos = comment? (* Define separators *) let sep_spc = del /[ \t]+/ " " let sep_osp = del /[ \t]*/ "" let sep_scl = del /[ \t]*;([ \t]*\n)*/ ";\n" let sep_obr = del /[ \t\n]*\{([ \t]*\n)*/ " {\n" let sep_cbr = del /[ \t]*\}([ \t]*\n)*/ "}\n" let sep_com = del /[ \t\n]*,[ \t\n]*/ ", " let sep_slh = del "\/" "/" let sep_col = del ":" ":" let sep_eq = del /[ \t\n]*=[ \t\n]*/ "=" let scl = del ";" ";" (* Define basic types *) let word = /[A-Za-z0-9_.-]+(\[[0-9]+\])?/ let ip = Rx.ipv4 (* Define fields *) (* adapted from sysconfig.aug *) (* Chars allowed in a bare string *) let bchar = /[^ \t\n"'\\{}#,()\/]|\\\\./ let qchar = /["']/ (* " *) (* We split the handling of right hand sides into a few cases: * bare - strings that contain no spaces, optionally enclosed in * single or double quotes * dquot - strings that contain at least one space, apostrophe or slash * which must be enclosed in double quotes * squot - strings that contain an unescaped double quote *) let bare = del qchar? "" . store (bchar+) . del qchar? "" let quote = Quote.do_quote (store (bchar* . /[ \t'\/]/ . bchar*)+) let dquote = Quote.do_dquote (store (bchar+)) (* these two are for special cases. bare_to_scl is for any bareword that is * space or semicolon terminated. dquote_any allows almost any character in * between the quotes. *) let bare_to_scl = Quote.do_dquote_opt (store /[^" \t\n;]+/) let dquote_any = Quote.do_dquote (store /[^"\n]*[ \t]+[^"\n]*/) let sto_to_spc = store /[^\\#,;\{\}" \t\n]+|"[^\\#"\n]+"/ let sto_to_scl = store /[^ \t;][^;\n=]+[^ \t;]|[^ \t;=]+/ let sto_number = store /[0-9][0-9]*/ (************************************************************************ * NO ARG STATEMENTS *************************************************************************) let stmt_noarg_re = "authoritative" | "primary" | "secondary" let stmt_noarg = [ indent . key stmt_noarg_re . sep_scl . eos ] (************************************************************************ * INT ARG STATEMENTS *************************************************************************) let stmt_integer_re = "default-lease-time" | "max-lease-time" | "min-lease-time" | /lease[ ]+limit/ | "port" | /peer[ ]+port/ | "max-response-delay" | "max-unacked-updates" | "mclt" | "split" | /load[ ]+balance[ ]+max[ ]+seconds/ | "max-lease-misbalance" | "max-lease-ownership" | "min-balance" | "max-balance" | "adaptive-lease-time-threshold" | "dynamic-bootp-lease-length" | "local-port" | "min-sec" | "omapi-port" | "ping-timeout" | "remote-port" let stmt_integer = [ indent . key stmt_integer_re . sep_spc . sto_number . sep_scl . eos ] (************************************************************************ * STRING ARG STATEMENTS *************************************************************************) let stmt_string_re = "ddns-update-style" | "ddns-updates" | "ddns-hostname" | "ddns-domainname" | "ddns-rev-domainname" | "log-facility" | "server-name" | "fixed-address" | /failover[ ]+peer/ | "use-host-decl-names" | "next-server" | "address" | /peer[ ]+address/ | "type" | "file" | "algorithm" | "secret" | "key" | "include" | "hba" | "boot-unknown-clients" | "db-time-format" | "do-forward-updates" | "dynamic-bootp-lease-cutoff" | "get-lease-hostnames" | "infinite-is-reserved" | "lease-file-name" | "local-address" | "one-lease-per-client" | "pid-file-name" | "ping-check" | "server-identifier" | "site-option-space" | "stash-agent-options" | "update-conflict-detection" | "update-optimization" | "update-static-leases" | "use-host-decl-names" | "use-lease-addr-for-default-route" | "vendor-option-space" | "primary" | "omapi-key" let stmt_string_tpl (kw:regexp) (l:lens) = [ indent . key kw . sep_spc . l . sep_scl . eos ] let stmt_string = stmt_string_tpl stmt_string_re bare | stmt_string_tpl stmt_string_re quote | stmt_string_tpl "filename" dquote (************************************************************************ * RANGE STATEMENTS *************************************************************************) let stmt_range = [ indent . key "range" . sep_spc . [ label "flag" . store /dynamic-bootp/ . sep_spc ]? . [ label "from" . store ip . sep_spc ]? . [ label "to" . store ip ] . sep_scl . eos ] (************************************************************************ * HARDWARE STATEMENTS *************************************************************************) let stmt_hardware = [ indent . key "hardware" . sep_spc . [ label "type" . store /ethernet|tokenring|fddi/ ] . sep_spc . [ label "address" . store /[a-fA-F0-9:-]+/ ] . sep_scl . eos ] (************************************************************************ * SET STATEMENTS *************************************************************************) let stmt_set = [ indent . key "set" . sep_spc . store word . sep_spc . Sep.equal . sep_spc . [ label "value" . sto_to_scl ] . sep_scl . eos ] (************************************************************************ * OPTION STATEMENTS *************************************************************************) (* The general case is considering options as a list *) let stmt_option_value = /((array of[ \t]+)?(((un)?signed[ \t]+)?integer (8|16|32)|string|ip6?-address|boolean|domain-list|text)|encapsulate [A-Za-z0-9_.-]+)/ let stmt_option_list = ([ label "arg" . bare ] | [ label "arg" . quote ]) . ( sep_com . ([ label "arg" . bare ] | [ label "arg" . quote ]))* let del_trail_spc = del /[ \t\n]*/ "" let stmt_record = counter "record" . Util.del_str "{" . sep_spc . ([seq "record" . store stmt_option_value . sep_com]* . [seq "record" . store stmt_option_value . del_trail_spc])? . Util.del_str "}" let stmt_option_code = [ label "label" . store word . sep_spc ] . [ key "code" . sep_spc . store word ] . sep_eq . ([ label "type" . store stmt_option_value ] |[ label "record" . stmt_record ]) let stmt_option_basic = [ key word . sep_spc . stmt_option_list ] let stmt_option_extra = [ key word . sep_spc . store /true|false/ . sep_spc . stmt_option_list ] let stmt_option_body = stmt_option_basic | stmt_option_extra let stmt_option1 = [ indent . key "option" . sep_spc . stmt_option_body . sep_scl . eos ] let stmt_option2 = [ indent . dels "option" . label "rfc-code" . sep_spc . stmt_option_code . sep_scl . eos ] let stmt_option = stmt_option1 | stmt_option2 (************************************************************************ * SUBCLASS STATEMENTS *************************************************************************) (* this statement is not well documented in the manual dhcpd.conf we support basic use case *) let stmt_subclass = [ indent . key "subclass" . sep_spc . ( [ label "name" . bare_to_scl ]|[ label "name" . dquote_any ] ) . sep_spc . ( [ label "value" . bare_to_scl ]|[ label "value" . dquote_any ] ) . sep_scl . eos ] (************************************************************************ * ALLOW/DENY STATEMENTS *************************************************************************) (* We have to use special key for allow/deny members of to avoid ambiguity in the put direction *) let allow_deny_re = /unknown(-|[ ]+)clients/ | /known(-|[ ]+)clients/ | /all[ ]+clients/ | /dynamic[ ]+bootp[ ]+clients/ | /authenticated[ ]+clients/ | /unauthenticated[ ]+clients/ | "bootp" | "booting" | "duplicates" | "declines" | "client-updates" | "leasequery" let stmt_secu_re = "allow" | "deny" let del_allow = del /allow[ ]+members[ ]+of/ "allow members of" let del_deny = del /deny[ \t]+members[ \t]+of/ "deny members of" (* bare is anything but whitespace, quote marks or semicolon. * technically this should be locked down to mostly alphanumerics, but the * idea right now is just to make things work. Also ideally I would use * dquote_space but I had a whale of a time with it. It doesn't like * semicolon termination and my attempts to fix that led me to 3 hours of * frustration and back to this :) *) let stmt_secu_tpl (l:lens) (s:string) = [ indent . l . sep_spc . label s . bare_to_scl . sep_scl . eos ] | [ indent . l . sep_spc . label s . dquote_any . sep_scl . eos ] let stmt_secu = [ indent . key stmt_secu_re . sep_spc . store allow_deny_re . sep_scl . eos ] | stmt_secu_tpl del_allow "allow-members-of" | stmt_secu_tpl del_deny "deny-members-of" (************************************************************************ * MATCH STATEMENTS *************************************************************************) let sto_com = /[^ \t\n,\(\)][^,\(\)]*[^ \t\n,\(\)]|[^ \t\n,\(\)]+/ | word . /[ \t]*\([^)]*\)/ (* this is already the most complicated part of this module and it's about to * get worse. match statements can be way more complicated than this * * examples: * using or: * match if ((option vendor-class-identifier="Banana Bready") or (option vendor-class-identifier="Cherry Sunfire")); * unneeded parenthesis: * match if (option vendor-class-identifier="Hello"); * * and of course the fact that the above two rules used one of infinately * many potential options instead of a builtin function. *) (* sto_com doesn't support quoted strings as arguments. It also doesn't support single arguments (needs to match a comma) It will need to be updated for lcase, ucase and log to be workable. it also doesn't support no arguments, so gethostbyname() doesn't work. option and config-option are considered operators. They should be matched in stmt_entry but also available under "match if" and "if" conditionals leased-address, host-decl-name, both take no args and return a value. We might need to treat them as variable names in the parser. things like this may be near-impossible to parse even with recursion because we have no way of knowing when or if a subfunction takes arguments set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)); even if we could parse it, they could get arbitrarily complicated like: binary-to-ascii(16, 8, ":", substring(hardware, 1, 6) and substring(hardware, 2, 3)); so at some point we may need to programmatically knock it off and tell people to put weird stuff in an include file that augeas doesn't parse. the other option is to change the API to not parse the if statement at all, just pull in the conditional as a string. *) let fct_re = "substring" | "binary-to-ascii" | "suffix" | "lcase" | "ucase" | "gethostbyname" | "packet" | "concat" | "reverse" | "encode-int" | "extract-int" | "lease-time" | "client-state" | "exists" | "known" | "static" | "pick-first-value" | "log" | "execute" (* not needs to be different because it's a negation of whatever happens next *) let op_re = "~="|"="|"~~"|"and"|"or" let fct_args = [ label "args" . dels "(" . sep_osp . ([ label "arg" . store sto_com ] . [ label "arg" . sep_com . store sto_com ]+) . sep_osp . dels ")" ] let stmt_match_ifopt = [ dels "if" . sep_spc . key "option" . sep_spc . store word . sep_eq . ([ label "value" . bare_to_scl ]|[ label "value" . dquote_any ]) ] let stmt_match_func = [ store fct_re . sep_osp . label "function" . fct_args ] . sep_eq . ([ label "value" . bare_to_scl ]|[ label "value" . dquote_any ]) let stmt_match_pfv = [ label "function" . store "pick-first-value" . sep_spc . dels "(" . sep_osp . [ label "args" . [ label "arg" . store sto_com ] . [ sep_com . label "arg" . store sto_com ]+ ] . dels ")" ] let stmt_match_tpl (l:lens) = [ indent . key "match" . sep_spc . l . sep_scl . eos ] let stmt_match = stmt_match_tpl (dels "if" . sep_spc . stmt_match_func | stmt_match_pfv | stmt_match_ifopt) (************************************************************************ * BLOCK STATEMENTS *************************************************************************) (* Blocks doesn't support comments at the end of the closing bracket *) let stmt_entry = stmt_secu | stmt_option | stmt_hardware | stmt_range | stmt_string | stmt_integer | stmt_noarg | stmt_match | stmt_subclass | stmt_set | empty | comment let stmt_block_noarg_re = "pool" | "group" let stmt_block_noarg (body:lens) = [ indent . key stmt_block_noarg_re . sep_obr . body* . sep_cbr ] let stmt_block_arg_re = "host" | "class" | "shared-network" | /failover[ ]+peer/ | "zone" | "group" | "on" let stmt_block_arg (body:lens) = ([ indent . key stmt_block_arg_re . sep_spc . dquote_any . sep_obr . body* . sep_cbr ] |[ indent . key stmt_block_arg_re . sep_spc . bare_to_scl . sep_obr . body* . sep_cbr ] |[ indent . del /key/ "key" . label "key_block" . sep_spc . dquote_any . sep_obr . body* . sep_cbr . del /(;([ \t]*\n)*)?/ "" ] |[ indent . del /key/ "key" . label "key_block" . sep_spc . bare_to_scl . sep_obr . body* . sep_cbr . del /(;([ \t]*\n)*)?/ "" ]) let stmt_block_subnet (body:lens) = [ indent . key "subnet" . sep_spc . [ label "network" . store ip ] . sep_spc . [ key "netmask" . sep_spc . store ip ] . sep_obr . body* . sep_cbr ] let conditional (body:lens) = let condition = /[^{ \r\t\n][^{\n]*[^{ \r\t\n]|[^{ \t\n\r]/ in let elsif = [ indent . Build.xchgs "elsif" "@elsif" . sep_spc . store condition . sep_obr . body* . sep_cbr ] in let else = [ indent . Build.xchgs "else" "@else" . sep_obr . body* . sep_cbr ] in [ indent . Build.xchgs "if" "@if" . sep_spc . store condition . sep_obr . body* . sep_cbr . elsif* . else? ] let all_block (body:lens) = let lns1 = stmt_block_subnet body in let lns2 = stmt_block_arg body in let lns3 = stmt_block_noarg body in let lns4 = conditional body in (lns1 | lns2 | lns3 | lns4 | stmt_entry) let rec lns_staging = stmt_entry|all_block lns_staging let lns = (lns_staging)* let filter = incl "/etc/dhcp3/dhcpd.conf" . incl "/etc/dhcp/dhcpd.conf" . incl "/etc/dhcpd.conf" let xfm = transform lns filter
Save