#!/usr/bin/env awk # expects action to be defined, like -v action=aliases /^[[:space:]]*$/ { next } /^[[:space:]]*#/ { next } /:$/ { # drop the : gsub(":", "", $1); domain = $1; domains[domainslen++] = domain; next; } $1 == "user" { user = sprintf("%s@%s", $2, domain); users[user] = $3 # change “vmail” to match the local user that # delivers the mail aliases[user] = "vmail"; next; } $1 == "alias" { if ($3 != "") { target = $3; } else { target = user; } if (domain != "") { alias = sprintf("%s@%s", $2, domain); } else { alias = $2; } aliases[alias] = target; } # output in the correct format END { if (action == "aliases") { for (alias in aliases) { if (match(alias, "@")) continue; printf("%s: %s\n", alias, aliases[alias]); } } else if (action == "virtuals") { for (alias in aliases) { if (!match(alias, "@")) continue; printf("%s %s\n", alias, aliases[alias]); } } else if (action == "domains") { for (domain in domains) { printf("%s\n", domains[domain]); } } else if (action == "users") { for (user in users) { printf("%s %s\n", user, users[user]); } } else if (action == "users.passwd") { for (user in users) { # user@doma.in:hash:::::: # user@doma.in:hash::::::userdb_quota_rule=*:storage=1G printf("%s:%s::::::\n", user, users[user]); } } else if (action == "users.mdirs") { for (user in users) { split(user, m, "@"); # adjust the maildir path printf("/var/vmail/%s/%s/Maildir\n", m[2], m[1]); } } else { print "unknown action!\n" > "/dev/stderr" exit 1 } }