Blob


1 #!/usr/bin/env awk
3 # expects action to be defined, like -v action=aliases
5 /^[[:space:]]*$/ { next }
6 /^[[:space:]]*#/ { next }
8 /:$/ {
9 # drop the :
10 gsub(":", "", $1);
11 domain = $1;
12 domains[domainslen++] = domain;
13 next;
14 }
16 $1 == "user" {
17 user = sprintf("%s@%s", $2, domain);
18 users[user] = $3
20 # change “vmail” to match the local user that
21 # delivers the mail
22 aliases[user] = "vmail";
23 next;
24 }
26 $1 == "alias" {
27 if ($3 != "") {
28 target = $3;
29 } else {
30 target = user;
31 }
33 if (domain != "") {
34 alias = sprintf("%s@%s", $2, domain);
35 } else {
36 alias = $2;
37 }
38 aliases[alias] = target;
39 }
41 # output in the correct format
42 END {
43 if (action == "aliases") {
44 for (alias in aliases) {
45 if (match(alias, "@"))
46 continue;
47 printf("%s: %s\n", alias, aliases[alias]);
48 }
49 } else if (action == "virtuals") {
50 for (alias in aliases) {
51 if (!match(alias, "@"))
52 continue;
53 printf("%s %s\n", alias, aliases[alias]);
54 }
55 } else if (action == "domains") {
56 for (domain in domains) {
57 printf("%s\n", domains[domain]);
58 }
59 } else if (action == "users") {
60 for (user in users) {
61 printf("%s %s\n", user, users[user]);
62 }
63 } else if (action == "users.passwd") {
64 for (user in users) {
65 # user@doma.in:hash::::::
66 # user@doma.in:hash::::::userdb_quota_rule=*:storage=1G
67 printf("%s:%s::::::\n", user, users[user]);
68 }
69 } else if (action == "users.mdirs") {
70 for (user in users) {
71 split(user, m, "@");
72 # adjust the maildir path
73 printf("/var/vmail/%s/%s/Maildir\n", m[2], m[1]);
74 }
75 } else {
76 print "unknown action!\n" > "/dev/stderr"
77 exit 1
78 }
79 }