3 # Create a new digest list
5 require './majordomo-lib.pl';
7 %access = &get_module_acl();
8 $access{'create'} || &error($text{'digest_ecannot'});
10 $conf = &get_config();
11 $ldir = &perl_var_replace(&find_value("listdir", $conf), $conf);
12 $program_dir = $config{'smrsh_program_dir'} ? $config{'smrsh_program_dir'}
13 : $config{'program_dir'};
14 $wrapper_path = $config{'wrapper_path'} ? $config{'wrapper_path'}
15 : "$program_dir/wrapper";
16 &error_setup($text{'digest_err'});
19 $in{'name'} =~ /^\S+$/ || &error($text{'create_ename'});
20 $in{'name'} = lc($in{'name'});
21 if (&get_list($in{'name'}, $conf)) {
22 &error(&text('create_eexists', $in{'name'}));
24 $aliases_files = &get_aliases_file();
25 @aliases = &foreign_call($aliases_module, "list_aliases", $aliases_files);
26 foreach $a (@aliases) {
27 if ($a->{'enabled'} && lc($a->{'name'}) eq lc($in{'name'})) {
28 &error(&text('create_ealias', $in{'name'}));
31 $in{'owner'} =~ /^\S+$/ ||
32 &error($text{'create_eowner'});
33 $in{'password'} =~ /^\S+$/ ||
34 &error($text{'create_epassword'});
35 $in{'mode'} != 0 || $in{'days'} =~ /^\d+$/ ||
36 &error("Invalid or missing number of days");
37 $in{'mode'} != 1 || $in{'lines'} =~ /^\d+$/ ||
38 &error("Invalid or missing number of lines");
39 $in{'info'} =~ s/\r//g;
40 $in{'footer'} =~ s/\r//g;
42 # Create list members file
43 &lock_file("$ldir/$in{'name'}");
44 &open_tempfile(MEMS, ">$ldir/$in{'name'}");
45 &close_tempfile(MEMS);
46 &set_permissions("$ldir/$in{'name'}");
47 &unlock_file("$ldir/$in{'name'}");
49 # Have majordomo create the new config file, by fooling the wrapper
50 # into thinking it has received an email with a config command
51 $lfile = "$ldir/$in{'name'}.config";
53 open(WRAPPER, "|$wrapper_path majordomo >/dev/null 2>&1");
54 print WRAPPER "From: root\n\n";
55 print WRAPPER "config $in{'name'} $in{'password'}\n\n";
59 # create the .info file
60 $list = &get_list_config($lfile);
61 chop($ctime = ctime(time()));
62 $updated = "[Last updated on: $ctime]\n";
63 &lock_file("$ldir/$in{'name'}.info");
64 &open_tempfile(INFO, ">$ldir/$in{'name'}.info");
65 if (&find_value("date_info", $list) eq "yes") {
66 &print_tempfile(INFO, $updated);
68 &print_tempfile(INFO, $in{'info'});
69 &close_tempfile(INFO);
70 &set_permissions("$ldir/$in{'name'}.info");
71 &unlock_file("$ldir/$in{'name'}.info");
73 # create the archive directory
74 $adir = &perl_var_replace(&find_value("filedir", $conf), $conf);
75 $aext = &perl_var_replace(&find_value("filedir_suffix", $conf), $conf);
77 &lock_file("$adir/$in{'name'}$aext");
78 mkdir("$adir/$in{'name'}$aext", 0755);
79 &set_permissions("$adir/$in{'name'}$aext");
80 &unlock_file("$adir/$in{'name'}$aext");
83 # Create the digest directories if needed
84 $ddir = &perl_var_replace(&find_value("digest_work_dir", $conf), $conf);
85 $fdir = &perl_var_replace(&find_value("filedir", $conf), $conf);
86 $fpfx = &perl_var_replace(&find_value("filedir_suffix", $conf), $conf);
87 &mkdir_heir("$ddir/$in{'name'}");
88 &mkdir_heir("$fdir/$in{'name'}$fpfx");
90 # Create aliases for the new list
91 &foreign_call($aliases_module, "lock_alias_files", $aliases_files);
92 &newlist_alias($in{'list'}."-digestify", "|$wrapper_path digest -r -C -l $in{'name'} $in{'name'}-outgoing");
93 &newlist_alias($in{'name'}, $in{'list'});
94 &newlist_alias($in{'name'}."-outgoing", ":include:$ldir/$in{'name'}");
95 &newlist_alias("owner-".$in{'name'}, $in{'owner'});
96 &newlist_alias("owner-".$in{'name'}."-outgoing", $in{'owner'});
97 &newlist_alias($in{'name'}."-owner", $in{'owner'});
98 &newlist_alias($in{'name'}."-approval", $in{'owner'});
99 &newlist_alias($in{'name'}."-request", "|$wrapper_path ".
100 "majordomo -l $in{'name'}", 1);
102 # Add the digestify alias for the source list
103 foreach $a (&foreign_call($aliases_module, "list_aliases", $aliases_files)) {
104 if ($a->{'name'} eq "$in{'list'}-list") {
105 push(@{$a->{'values'}}, $in{'list'}."-digestify");
106 &foreign_call($aliases_module, "modify_alias", $a, $a);
109 &foreign_call($aliases_module, "unlock_alias_files", $aliases_files);
111 # Update the new config file
112 &save_list_directive($list, $lfile, "description", $in{'desc'});
113 &save_list_directive($list, $lfile, "digest_name", $in{'desc'});
114 &save_list_directive($list, $lfile, "digest_issue", 1);
115 &save_list_directive($list, $lfile, "digest_volume", 1);
116 &save_list_directive($list, $lfile, "admin_passwd", $in{'password'});
117 &save_list_directive($list, $lfile, "approve_passwd", $in{'password'});
118 &save_list_directive($list, $lfile, "message_footer", $in{'footer'}, 1)
120 if ($in{'mode'} == 0) {
121 &save_list_directive($list, $lfile, "digest_maxdays", $in{'days'});
122 &save_list_directive($list, $lfile, "digest_maxlines", "");
125 &save_list_directive($list, $lfile, "digest_maxdays", "");
126 &save_list_directive($list, $lfile, "digest_maxlines", $in{'lines'});
129 &unlock_file($lfile);
130 &webmin_log("create", "digest", $in{'name'}, \%in);
132 # add to this user's ACL
133 if ($access{'lists'} ne '*') {
134 $access{'lists'} .= " $in{'name'}";
135 &save_module_acl(\%access);
137 &redirect("edit_list.cgi?name=$in{'name'}");
139 # newlist_alias(name, value, last)
142 local $al = { 'name' => $_[0],
143 'values' => [ $_[1] ],
145 &foreign_call($aliases_module, "create_alias", $al, $aliases_files, !$_[2]);
156 &set_permissions($_[0]);