6 use POSIX
":sys_wait_h";
15 my ($database, $host, $port) = @_;
17 $port = 5432 if !$port;
19 $database = "Proxmox_ruledb" if !$database;
23 my $dsn = "dbi:Pg:dbname=$database;host=$host;port=$port;";
26 # only low level alarm interface works for DBI->connect
27 my $mask = POSIX
::SigSet-
>new(SIGALRM
);
28 my $action = POSIX
::SigAction-
>new(sub { die "connect timeout\n" }, $mask);
29 my $oldaction = POSIX
::SigAction-
>new();
30 sigaction
(SIGALRM
, $action, $oldaction);
36 $rdb = DBI-
>connect($dsn, "postgres", undef,
37 { PrintError
=> 0, RaiseError
=> 1 });
41 sigaction
(SIGALRM
, $oldaction); # restore original handler
47 my $dsn = "DBI:Pg:dbname=$database";
49 my $dbh = DBI-
>connect($dsn, "postgres", undef,
50 { PrintError
=> 0, RaiseError
=> 1 });
59 PVE
::Tools
::run_command
(['dropdb', '-U', 'postgres', $dbname]);
64 my $database_list = {};
69 my ($name, $owner) = map { PVE
::Tools
::trim
($_) } split(/\|/, $line);
70 return if !$name || !$owner;
72 $database_list->{$name} = { owner
=> $owner };
75 my $cmd = ['psql', '-U', 'postgres', '--list', '--quiet', '--tuples-only'];
77 PVE
::Tools
::run_command
($cmd, outfunc
=> $parser);
79 return $database_list;
82 my $dbfunction_maxint = <<__EOD;
83 CREATE OR REPLACE FUNCTION maxint (INTEGER, INTEGER) RETURNS INTEGER AS
84 'BEGIN IF \$1 > \$2 THEN RETURN \$1; ELSE RETURN \$2; END IF; END;' LANGUAGE plpgsql;
87 my $dbfunction_minint = <<__EOD;
88 CREATE OR REPLACE FUNCTION minint (INTEGER, INTEGER) RETURNS INTEGER AS
89 'BEGIN IF \$1 < \$2 THEN RETURN \$1; ELSE RETURN \$2; END IF; END;' LANGUAGE plpgsql;
92 # merge function to avoid update/insert race condition
93 # see: http://www.postgresql.org/docs/9.1/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
94 my $dbfunction_merge_greylist = <<__EOD;
95 CREATE OR REPLACE FUNCTION merge_greylist (in_ipnet VARCHAR, in_host INTEGER, in_sender VARCHAR,
96 in_receiver VARCHAR, in_instance VARCHAR,
97 in_rctime INTEGER, in_extime INTEGER, in_delay INTEGER,
98 in_blocked INTEGER, in_passed INTEGER, in_mtime INTEGER,
99 in_cid INTEGER) RETURNS INTEGER AS
102 UPDATE CGreylist SET Host = CASE WHEN MTime >= in_mtime THEN Host ELSE in_host END,
103 CID = maxint (CID, in_cid), RCTime = minint (rctime, in_rctime),
104 ExTime = maxint (extime, in_extime),
105 Delay = maxint (delay, in_delay),
106 Blocked = maxint (blocked, in_blocked),
107 Passed = maxint (passed, in_passed)
108 WHERE IPNet = in_ipnet AND Sender = in_sender AND Receiver = in_receiver;
115 INSERT INTO CGREYLIST (IPNet, Host, Sender, Receiver, Instance, RCTime, ExTime, Delay, Blocked, Passed, MTime, CID)
116 VALUES (in_ipnet, in_host, in_sender, in_receiver, in_instance, in_rctime, in_extime,
117 in_delay, in_blocked, in_passed, in_mtime, in_cid);
119 EXCEPTION WHEN unique_violation THEN
120 -- do nothing - continue loop
123 END;' LANGUAGE plpgsql;
126 my $cgreylist_ctablecmd = <<__EOD;
127 CREATE TABLE CGreylist
128 (IPNet VARCHAR(16) NOT NULL,
129 Host INTEGER NOT NULL,
130 Sender VARCHAR(255) NOT NULL,
131 Receiver VARCHAR(255) NOT NULL,
132 Instance VARCHAR(255),
133 RCTime INTEGER NOT NULL,
134 ExTime INTEGER NOT NULL,
135 Delay INTEGER NOT NULL DEFAULT 0,
136 Blocked INTEGER NOT NULL,
137 Passed INTEGER NOT NULL,
138 CID INTEGER NOT NULL,
139 MTime INTEGER NOT NULL,
140 PRIMARY KEY (IPNet, Sender, Receiver));
142 CREATE INDEX CGreylist_Instance_Sender_Index ON CGreylist (Instance, Sender);
144 CREATE INDEX CGreylist_ExTime_Index ON CGreylist (ExTime);
146 CREATE INDEX CGreylist_MTime_Index ON CGreylist (MTime);
149 my $clusterinfo_ctablecmd = <<__EOD;
150 CREATE TABLE ClusterInfo
151 (CID INTEGER NOT NULL,
152 Name VARCHAR NOT NULL,
155 PRIMARY KEY (CID, Name))
158 my $daily_stat_ctablecmd = <<__EOD;
159 CREATE TABLE DailyStat
160 (Time INTEGER NOT NULL UNIQUE,
161 CountIn INTEGER NOT NULL,
162 CountOut INTEGER NOT NULL,
163 BytesIn REAL NOT NULL,
164 BytesOut REAL NOT NULL,
165 VirusIn INTEGER NOT NULL,
166 VirusOut INTEGER NOT NULL,
167 SpamIn INTEGER NOT NULL,
168 SpamOut INTEGER NOT NULL,
169 BouncesIn INTEGER NOT NULL,
170 BouncesOut INTEGER NOT NULL,
171 GreylistCount INTEGER NOT NULL,
172 SPFCount INTEGER NOT NULL,
173 PTimeSum REAL NOT NULL,
174 MTime INTEGER NOT NULL,
175 RBLCount INTEGER DEFAULT 0 NOT NULL,
178 CREATE INDEX DailyStat_MTime_Index ON DailyStat (MTime);
182 my $domain_stat_ctablecmd = <<__EOD;
183 CREATE TABLE DomainStat
184 (Time INTEGER NOT NULL,
185 Domain VARCHAR(255) NOT NULL,
186 CountIn INTEGER NOT NULL,
187 CountOut INTEGER NOT NULL,
188 BytesIn REAL NOT NULL,
189 BytesOut REAL NOT NULL,
190 VirusIn INTEGER NOT NULL,
191 VirusOut INTEGER NOT NULL,
192 SpamIn INTEGER NOT NULL,
193 SpamOut INTEGER NOT NULL,
194 BouncesIn INTEGER NOT NULL,
195 BouncesOut INTEGER NOT NULL,
196 PTimeSum REAL NOT NULL,
197 MTime INTEGER NOT NULL,
198 PRIMARY KEY (Time, Domain));
200 CREATE INDEX DomainStat_MTime_Index ON DomainStat (MTime);
203 my $statinfo_ctablecmd = <<__EOD;
204 CREATE TABLE StatInfo
205 (Name VARCHAR(255) NOT NULL UNIQUE,
211 my $virusinfo_stat_ctablecmd = <<__EOD;
212 CREATE TABLE VirusInfo
213 (Time INTEGER NOT NULL,
214 Name VARCHAR NOT NULL,
215 Count INTEGER NOT NULL,
216 MTime INTEGER NOT NULL,
217 PRIMARY KEY (Time, Name));
219 CREATE INDEX VirusInfo_MTime_Index ON VirusInfo (MTime);
223 # mail storage stable
225 # V - Virus quarantine
226 # S - Spam quarantine
227 # D - Delayed Mails - not implemented
228 # A - Held for Audit - not implemented
233 my $cmailstore_ctablecmd = <<__EOD;
234 CREATE TABLE CMailStore
235 (CID INTEGER DEFAULT 0 NOT NULL,
236 RID INTEGER NOT NULL,
238 Time INTEGER NOT NULL,
239 QType "char" NOT NULL,
240 Bytes INTEGER NOT NULL,
241 Spamlevel INTEGER NOT NULL,
243 Sender VARCHAR(255) NOT NULL,
244 Header VARCHAR NOT NULL,
245 File VARCHAR(255) NOT NULL,
246 PRIMARY KEY (CID, RID));
247 CREATE INDEX CMailStore_Time_Index ON CMailStore (Time);
249 CREATE TABLE CMSReceivers
250 (CMailStore_CID INTEGER NOT NULL,
251 CMailStore_RID INTEGER NOT NULL,
252 PMail VARCHAR(255) NOT NULL,
253 Receiver VARCHAR(255),
254 TicketID INTEGER NOT NULL,
255 Status "char" NOT NULL,
256 MTime INTEGER NOT NULL);
258 CREATE INDEX CMailStore_ID_Index ON CMSReceivers (CMailStore_CID, CMailStore_RID);
260 CREATE INDEX CMSReceivers_MTime_Index ON CMSReceivers (MTime);
264 my $cstatistic_ctablecmd = <<__EOD;
265 CREATE TABLE CStatistic
266 (CID INTEGER DEFAULT 0 NOT NULL,
267 RID INTEGER NOT NULL,
269 Time INTEGER NOT NULL,
270 Bytes INTEGER NOT NULL,
271 Direction Boolean NOT NULL,
272 Spamlevel INTEGER NOT NULL,
273 VirusInfo VARCHAR(255) NULL,
274 PTime INTEGER NOT NULL,
275 Sender VARCHAR(255) NOT NULL,
276 PRIMARY KEY (CID, RID));
278 CREATE INDEX CStatistic_Time_Index ON CStatistic (Time);
280 CREATE TABLE CReceivers
281 (CStatistic_CID INTEGER NOT NULL,
282 CStatistic_RID INTEGER NOT NULL,
283 Receiver VARCHAR(255) NOT NULL,
284 Blocked Boolean NOT NULL);
286 CREATE INDEX CStatistic_ID_Index ON CReceivers (CStatistic_CID, CStatistic_RID);
289 # user preferences (black an whitelists, ...)
290 # Name: perference name ('BL' -> blacklist, 'WL' -> whitelist)
291 # Data: arbitrary data
292 my $userprefs_ctablecmd = <<__EOD;
293 CREATE TABLE UserPrefs
297 MTime INTEGER NOT NULL,
298 PRIMARY KEY (PMail, Name));
300 CREATE INDEX UserPrefs_MTime_Index ON UserPrefs (MTime);
304 sub cond_create_dbtable
{
305 my ($dbh, $name, $ctablecmd) = @_;
310 my $cmd = "SELECT tablename FROM pg_tables " .
311 "WHERE tablename = lower ('$name')";
313 my $sth = $dbh->prepare ($cmd);
317 if (!(my $ref = $sth->fetchrow_hashref())) {
318 $dbh->do ($ctablecmd);
334 $dbname = "Proxmox_ruledb" if !$dbname;
336 # use sql_ascii to avoid any character set conversions, and be compatible with
337 # older postgres versions (update from 8.1 must be possible)
338 my $cmd = [ 'createdb', '-U', 'postgres', '-E', 'sql_ascii',
339 '-T', 'template0', '--lc-collate=C', '--lc-ctype=C', $dbname ];
341 PVE
::Tools
::run_command
($cmd);
343 my $dbh = open_ruledb
($dbname);
345 #$dbh->do ($dbloaddrivers_sql);
346 #$dbh->do ($dbfunction_update_modtime);
348 $dbh->do ($dbfunction_minint);
350 $dbh->do ($dbfunction_maxint);
352 $dbh->do ($dbfunction_merge_greylist);
356 CREATE TABLE Attribut
357 (Object_ID INTEGER NOT NULL,
358 Name VARCHAR(20) NOT NULL,
360 PRIMARY KEY (Object_ID, Name));
362 CREATE INDEX Attribut_Object_ID_Index ON Attribut(Object_ID);
366 ObjectType INTEGER NOT NULL,
367 Objectgroup_ID INTEGER NOT NULL,
371 CREATE TABLE Objectgroup
373 Name VARCHAR(255) NOT NULL,
374 Info VARCHAR(255) NULL,
375 Class VARCHAR(10) NOT NULL,
380 Name VARCHAR(255) NULL,
381 Priority INTEGER NOT NULL,
382 Active INTEGER NOT NULL DEFAULT 0,
383 Direction INTEGER NOT NULL DEFAULT 2,
384 Count INTEGER NOT NULL DEFAULT 0,
387 CREATE TABLE RuleGroup
388 (Objectgroup_ID INTEGER NOT NULL,
389 Rule_ID INTEGER NOT NULL,
390 Grouptype INTEGER NOT NULL,
391 PRIMARY KEY (Objectgroup_ID, Rule_ID, Grouptype));
393 $cgreylist_ctablecmd;
395 $clusterinfo_ctablecmd;
397 $daily_stat_ctablecmd;
399 $domain_stat_ctablecmd;
403 $cmailstore_ctablecmd;
405 $cstatistic_ctablecmd;
407 $userprefs_ctablecmd;
409 $virusinfo_stat_ctablecmd;
416 sub cond_create_action_quarantine
{
419 my $dbh = $ruledb->{dbh
};
422 my $sth = $dbh->prepare(
423 "SELECT * FROM Objectgroup, Object " .
424 "WHERE Object.ObjectType = ? AND Objectgroup.Class = ? " .
425 "AND Object.objectgroup_id = Objectgroup.id");
427 my $otype = PMG
::RuleDB
::Quarantine
::otype
();
428 if ($sth->execute($otype, 'action') <= 0) {
429 my $obj = PMG
::RuleDB
::Quarantine-
>new ();
430 my $txt = decode_entities
(PMG
::RuleDB
::Quarantine-
>otype_text);
431 my $quarantine = $ruledb->create_group_with_obj
432 ($obj, $txt, PMG
::RuleDB
::Quarantine-
>oinfo);
437 sub cond_create_std_actions
{
440 cond_create_action_quarantine
($ruledb);
442 #cond_create_action_report_spam($ruledb);
446 sub upgrade_mailstore_db
{
452 my $cmd = "SELECT tablename FROM pg_tables WHERE tablename = lower ('MailStore')";
454 my $sth = $dbh->prepare($cmd);
456 my $ref = $sth->fetchrow_hashref();
459 if ($ref) { # table exists
461 $cmd = "INSERT INTO CMailStore " .
462 "(CID, RID, ID, Time, QType, Bytes, Spamlevel, Info, Header, Sender, File) " .
463 "SELECT 0, ID, ID, Time, QType, Bytes, Spamlevel, Info, Header, Sender, File FROM MailStore";
467 $cmd = "INSERT INTO CMSReceivers " .
468 "(CMailStore_CID, CMailStore_RID, PMail, Receiver, TicketID, Status, MTime) " .
469 "SELECT 0, MailStore_ID, PMail, Receiver, TicketID, Status, 0 FROM MSReceivers";
473 $dbh->do("SELECT setval ('cmailstore_id_seq', nextval ('mailstore_id_seq'))");
475 $dbh->do("DROP TABLE MailStore");
476 $dbh->do("DROP TABLE MSReceivers");
487 sub upgrade_dailystat_db
{
490 eval { # make sure we have MTime
491 $dbh->do("ALTER TABLE DailyStat ADD COLUMN MTime INTEGER;" .
492 "UPDATE DailyStat SET MTime = EXTRACT (EPOCH FROM now());");
495 eval { # make sure we have correct constraints for MTime
496 $dbh->do ("ALTER TABLE DailyStat ALTER COLUMN MTime SET NOT NULL;");
499 eval { # make sure we have RBLCount
500 $dbh->do ("ALTER TABLE DailyStat ADD COLUMN RBLCount INTEGER;" .
501 "UPDATE DailyStat SET RBLCount = 0;");
504 eval { # make sure we have correct constraints for RBLCount
505 $dbh->do ("ALTER TABLE DailyStat ALTER COLUMN RBLCount SET DEFAULT 0;" .
506 "ALTER TABLE DailyStat ALTER COLUMN RBLCount SET NOT NULL;");
512 my $cmd = "SELECT indexname FROM pg_indexes WHERE indexname = lower ('DailyStat_MTime_Index')";
514 my $sth = $dbh->prepare($cmd);
516 my $ref = $sth->fetchrow_hashref();
519 if (!$ref) { # index does not exist
520 $dbh->do ("CREATE INDEX DailyStat_MTime_Index ON DailyStat (MTime)");
531 sub upgrade_domainstat_db
{
534 eval { # make sure we have MTime
535 $dbh->do("ALTER TABLE DomainStat ADD COLUMN MTime INTEGER;" .
536 "UPDATE DomainStat SET MTime = EXTRACT (EPOCH FROM now());" .
537 "ALTER TABLE DomainStat ALTER COLUMN MTime SET NOT NULL;");
543 my $cmd = "SELECT indexname FROM pg_indexes WHERE indexname = lower ('DomainStat_MTime_Index')";
545 my $sth = $dbh->prepare($cmd);
547 my $ref = $sth->fetchrow_hashref();
550 if (!$ref) { # index does not exist
551 $dbh->do ("CREATE INDEX DomainStat_MTime_Index ON DomainStat (MTime)");
562 sub upgrade_statistic_db
{
568 my $cmd = "SELECT tablename FROM pg_tables WHERE tablename = lower ('Statistic')";
570 my $sth = $dbh->prepare($cmd);
572 my $ref = $sth->fetchrow_hashref();
575 if ($ref) { # old table exists
577 my $timezone = tz_local_offset
();;
579 $dbh->do("INSERT INTO VirusInfo (Time, Name, Count, MTime) " .
580 "SELECT ((time + $timezone) / 86400) * 86400 as day, virusinfo, " .
581 "count (virusinfo), max (Time) FROM Statistic " .
582 "WHERE virusinfo IS NOT NULL GROUP BY day, virusinfo");
584 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (time());
585 my $end = timelocal
(0, 0, 0, $mday, $mon, $year);
586 my $start = $end - 3600*24*7; # / days
588 $cmd = "INSERT INTO CStatistic " .
589 "(CID, RID, ID, Time, Bytes, Direction, Spamlevel, VirusInfo, PTime, Sender) " .
590 "SELECT 0, ID, ID, Time, Bytes, Direction, Spamlevel, VirusInfo, PTime, Sender FROM Statistic " .
591 "WHERE time >= $start";
595 $dbh->do("SELECT setval ('cstatistic_id_seq', nextval ('statistic_id_seq'))");
597 $dbh->do("INSERT INTO StatInfo (name, ivalue) VALUES ('virusinfo_index', " .
598 "nextval ('statistic_id_seq'))");
600 $cmd = "INSERT INTO CReceivers (CStatistic_CID, CStatistic_RID, Receiver, Blocked) " .
601 "SELECT 0, Mail_ID, Receiver, Blocked FROM Receivers " .
602 "WHERE EXISTS (SELECT * FROM CStatistic WHERE CID = 0 AND RID = Mail_ID)";
606 $dbh->do("DROP TABLE Statistic");
607 $dbh->do("DROP TABLE Receivers");
618 sub upgrade_greylist_db
{
624 my $cmd = "SELECT tablename FROM pg_tables WHERE tablename = lower ('Greylist')";
626 my $sth = $dbh->prepare($cmd);
628 my $ref = $sth->fetchrow_hashref();
631 if ($ref) { # table exists
633 $cmd = "INSERT INTO CGreylist " .
634 "(IPNet, Host, Sender, Receiver, Instance, RCTime, ExTime, Delay, Blocked, Passed, MTime, CID) " .
635 "SELECT IPNet, Host, Sender, Receiver, Instance, RCTime, ExTime, Delay, Blocked, Passed, RCTime, 0 FROM Greylist";
639 $dbh->do("DROP TABLE Greylist");
650 sub upgrade_userprefs_db
{
654 $dbh->do("ALTER TABLE UserPrefs ADD COLUMN MTime INTEGER;" .
655 "UPDATE UserPrefs SET MTime = EXTRACT (EPOCH FROM now());" .
656 "ALTER TABLE UserPrefs ALTER COLUMN MTime SET NOT NULL;");
663 my $cmd = "SELECT indexname FROM pg_indexes WHERE indexname = lower ('UserPrefs_MTime_Index')";
665 my $sth = $dbh->prepare($cmd);
667 my $ref = $sth->fetchrow_hashref();
670 if (!$ref) { # index does not exist
671 $dbh->do("CREATE INDEX UserPrefs_MTime_Index ON UserPrefs (MTime)");
685 my $dbh = $ruledb->{dbh
};
687 $dbh->do($dbfunction_minint);
689 $dbh->do($dbfunction_maxint);
691 $dbh->do($dbfunction_merge_greylist);
693 # make sure we do not use slow sequential scans when upgraing
694 # database (before analyze can gather statistics)
695 $dbh->do("set enable_seqscan = false");
697 cond_create_dbtable
($dbh, 'DailyStat', $daily_stat_ctablecmd);
698 cond_create_dbtable
($dbh, 'DomainStat', $domain_stat_ctablecmd);
699 cond_create_dbtable
($dbh, 'StatInfo', $statinfo_ctablecmd);
700 cond_create_dbtable
($dbh, 'CMailStore', $cmailstore_ctablecmd);
701 cond_create_dbtable
($dbh, 'UserPrefs', $userprefs_ctablecmd);
702 cond_create_dbtable
($dbh, 'CGreylist', $cgreylist_ctablecmd);
703 cond_create_dbtable
($dbh, 'CStatistic', $cstatistic_ctablecmd);
704 cond_create_dbtable
($dbh, 'ClusterInfo', $clusterinfo_ctablecmd);
705 cond_create_dbtable
($dbh, 'VirusInfo', $virusinfo_stat_ctablecmd);
707 cond_create_std_actions
($ruledb);
709 upgrade_mailstore_db
($dbh);
711 upgrade_statistic_db
($dbh);
713 upgrade_userprefs_db
($dbh);
715 upgrade_greylist_db
($dbh);
717 upgrade_dailystat_db
($dbh);
719 upgrade_domainstat_db
($dbh);
721 # update obsolete content type names
723 $dbh->do("UPDATE Object " .
724 "SET value = 'content-type:application/java-vm' ".
725 "WHERE objecttype = 3003 " .
726 "AND value = 'content-type:application/x-java-vm';");
730 $dbh->do ("ANALYZE");
735 my ($ruledb, $reset, $testmode) = @_;
737 my $dbh = $ruledb->{dbh
};
740 # Greylist Objectgroup
741 my $greylistgroup = PMG
::RuleDB
::Group-
>new
742 ("GreyExclusion", "-", "greylist");
743 $ruledb->save_group ($greylistgroup);
746 # we do not touch greylist objects
747 my $glids = "SELECT object.ID FROM Object, Objectgroup WHERE " .
748 "objectgroup_id = objectgroup.id and class = 'greylist'";
750 $dbh->do ("DELETE FROM Rule; " .
751 "DELETE FROM RuleGroup; " .
752 "DELETE FROM Attribut WHERE Object_ID NOT IN ($glids); " .
753 "DELETE FROM Object WHERE ID NOT IN ($glids); " .
754 "DELETE FROM Objectgroup WHERE class != 'greylist';");
760 my $obj = PMG
::RuleDB
::EMail-
>new ('nomail@fromthisdomain.com');
761 my $blacklist = $ruledb->create_group_with_obj(
762 $obj, 'Blacklist', 'Global blacklist');
765 $obj = PMG
::RuleDB
::EMail-
>new('mail@fromthisdomain.com');
766 my $whitelist = $ruledb->create_group_with_obj(
767 $obj, 'Whitelist', 'Global whitelist');
772 $obj = PMG
::RuleDB
::TimeFrame-
>new(8*60, 16*60);
773 my $working_hours =$ruledb->create_group_with_obj($obj, 'Office Hours' ,
774 'Usual office hours');
779 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('image/.*');
780 my $img_content = $ruledb->create_group_with_obj(
781 $obj, 'Images', 'All kinds of graphic files');
784 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('audio/.*');
785 my $mm_content = $ruledb->create_group_with_obj(
786 $obj, 'Multimedia', 'Audio and Video');
788 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('video/.*');
789 $ruledb->group_add_object($mm_content, $obj);
792 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('application/vnd\.ms-excel');
793 my $office_content = $ruledb->create_group_with_obj(
794 $obj, 'Office Files', 'Common Office Files');
796 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new(
797 'application/vnd\.ms-powerpoint');
799 $ruledb->group_add_object($office_content, $obj);
801 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('application/msword');
802 $ruledb->group_add_object ($office_content, $obj);
804 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new(
805 'application/vnd\.openxmlformats-officedocument\..*');
806 $ruledb->group_add_object($office_content, $obj);
808 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new(
809 'application/vnd\.oasis\.opendocument\..*');
810 $ruledb->group_add_object($office_content, $obj);
812 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new(
813 'application/vnd\.stardivision\..*');
814 $ruledb->group_add_object($office_content, $obj);
816 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new(
817 'application/vnd\.sun\.xml\..*');
818 $ruledb->group_add_object($office_content, $obj);
821 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new(
822 'application/x-ms-dos-executable');
823 my $exe_content = $ruledb->create_group_with_obj(
824 $obj, 'Dangerous Content', 'executable files and partial messages');
826 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('application/x-java');
827 $ruledb->group_add_object($exe_content, $obj);
828 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('application/javascript');
829 $ruledb->group_add_object($exe_content, $obj);
830 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('application/x-executable');
831 $ruledb->group_add_object($exe_content, $obj);
832 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('application/x-ms-dos-executable');
833 $ruledb->group_add_object($exe_content, $obj);
834 $obj = PMG
::RuleDB
::ContentTypeFilter-
>new('message/partial');
835 $ruledb->group_add_object($exe_content, $obj);
836 $obj = PMG
::RuleDB
::MatchFilename-
>new('.*\.(vbs|pif|lnk|shs|shb)');
837 $ruledb->group_add_object($exe_content, $obj);
838 $obj = PMG
::RuleDB
::MatchFilename-
>new('.*\.\{.+\}');
839 $ruledb->group_add_object($exe_content, $obj);
842 $obj = PMG
::RuleDB
::Virus-
>new();
843 my $virus = $ruledb->create_group_with_obj(
844 $obj, 'Virus', 'Matches virus infected mail');
849 $obj = PMG
::RuleDB
::Spam-
>new(3);
850 my $spam3 = $ruledb->create_group_with_obj(
851 $obj, 'Spam (Level 3)', 'Matches possible spam mail');
853 $obj = PMG
::RuleDB
::Spam-
>new(5);
854 my $spam5 = $ruledb->create_group_with_obj(
855 $obj, 'Spam (Level 5)', 'Matches possible spam mail');
857 $obj = PMG
::RuleDB
::Spam-
>new(10);
858 my $spam10 = $ruledb->create_group_with_obj(
859 $obj, 'Spam (Level 10)', 'Matches possible spam mail');
864 $obj = PMG
::RuleDB
::ModField-
>new('X-SPAM-LEVEL', '__SPAM_INFO__');
865 my $mod_spam_level = $ruledb->create_group_with_obj(
866 $obj, 'Modify Spam Level',
867 'Mark mail as spam by adding a header tag.');
870 $obj = PMG
::RuleDB
::ModField-
>new('subject', 'SPAM: __SUBJECT__');
871 my $mod_spam_subject = $ruledb->create_group_with_obj(
872 $obj, 'Modify Spam Subject',
873 'Mark mail as spam by modifying the subject.');
875 # Remove matching attachments
876 $obj = PMG
::RuleDB
::Remove-
>new(0);
877 my $remove = $ruledb->create_group_with_obj(
878 $obj, 'Remove attachments', 'Remove matching attachments');
880 # Remove all attachments
881 $obj = PMG
::RuleDB
::Remove-
>new(1);
882 my $remove_all = $ruledb->create_group_with_obj(
883 $obj, 'Remove all attachments', 'Remove all attachments');
886 $obj = PMG
::RuleDB
::Accept-
>new();
887 my $accept = $ruledb->create_group_with_obj(
888 $obj, 'Accept', 'Accept mail for Delivery');
891 $obj = PMG
::RuleDB
::Block-
>new ();
892 my $block = $ruledb->create_group_with_obj($obj, 'Block', 'Block mail');
895 $obj = PMG
::RuleDB
::Quarantine-
>new();
896 my $quarantine = $ruledb->create_group_with_obj(
897 $obj, 'Quarantine', 'Move mail to quarantine');
900 $obj = PMG
::RuleDB
::Notify-
>new('__ADMIN__');
901 my $notify_admin = $ruledb->create_group_with_obj(
902 $obj, 'Notify Admin', 'Send notification');
905 $obj = PMG
::RuleDB
::Notify-
>new('__SENDER__');
906 my $notify_sender = $ruledb->create_group_with_obj(
907 $obj, 'Notify Sender', 'Send notification');
910 $obj = PMG
::RuleDB
::Disclaimer-
>new ();
911 my $add_discl = $ruledb->create_group_with_obj(
912 $obj, 'Disclaimer', 'Add Disclaimer');
914 # Attach original mail
915 #$obj = Proxmox::RuleDB::Attach->new ();
916 #my $attach_orig = $ruledb->create_group_with_obj ($obj, 'Attach Original Mail',
917 # 'Attach Original Mail');
919 ####################### RULES ##################################
921 ## Block Dangerous Files
922 my $rule = PMG
::RuleDB
::Rule-
>new ('Block Dangerous Files', 93, 1, 0);
923 $ruledb->save_rule ($rule);
925 $ruledb->rule_add_what_group ($rule, $exe_content);
926 $ruledb->rule_add_action ($rule, $remove);
929 $rule = PMG
::RuleDB
::Rule-
>new ('Block Viruses', 96, 1, 0);
930 $ruledb->save_rule ($rule);
932 $ruledb->rule_add_what_group ($rule, $virus);
933 $ruledb->rule_add_action ($rule, $notify_admin);
936 $ruledb->rule_add_action ($rule, $block);
938 $ruledb->rule_add_action ($rule, $quarantine);
942 $rule = PMG
::RuleDB
::Rule-
>new ('Virus Alert', 96, 1, 1);
943 $ruledb->save_rule ($rule);
945 $ruledb->rule_add_what_group ($rule, $virus);
946 $ruledb->rule_add_action ($rule, $notify_sender);
947 $ruledb->rule_add_action ($rule, $notify_admin);
948 $ruledb->rule_add_action ($rule, $block);
951 $rule = PMG
::RuleDB
::Rule-
>new ('Blacklist', 98, 1, 0);
952 $ruledb->save_rule ($rule);
954 $ruledb->rule_add_from_group ($rule, $blacklist);
955 $ruledb->rule_add_action ($rule, $block);
959 $rule = PMG
::RuleDB
::Rule-
>new ('Modify Header', 90, 1, 0);
960 $ruledb->save_rule ($rule);
961 $ruledb->rule_add_action ($rule, $mod_spam_level);
965 $rule = PMG
::RuleDB
::Rule-
>new ('Whitelist', 85, 1, 0);
966 $ruledb->save_rule ($rule);
968 $ruledb->rule_add_from_group ($rule, $whitelist);
969 $ruledb->rule_add_action ($rule, $accept);
972 $rule = PMG
::RuleDB
::Rule-
>new ('Mark Spam', 80, 1, 0);
973 $ruledb->save_rule ($rule);
975 $ruledb->rule_add_what_group ($rule, $spam10);
976 $ruledb->rule_add_action ($rule, $mod_spam_level);
977 $ruledb->rule_add_action ($rule, $mod_spam_subject);
979 # Quarantine/Mark Spam (Level 3)
980 $rule = PMG
::RuleDB
::Rule-
>new ('Quarantine/Mark Spam (Level 3)', 80, 1, 0);
981 $ruledb->save_rule ($rule);
983 $ruledb->rule_add_what_group ($rule, $spam3);
984 $ruledb->rule_add_action ($rule, $mod_spam_subject);
985 $ruledb->rule_add_action ($rule, $quarantine);
986 #$ruledb->rule_add_action ($rule, $count_spam);
989 # Quarantine/Mark Spam (Level 5)
990 $rule = PMG
::RuleDB
::Rule-
>new ('Quarantine/Mark Spam (Level 5)', 79, 0, 0);
991 $ruledb->save_rule ($rule);
993 $ruledb->rule_add_what_group ($rule, $spam5);
994 $ruledb->rule_add_action ($rule, $mod_spam_subject);
995 $ruledb->rule_add_action ($rule, $quarantine);
997 ## Block Spam Level 10
998 $rule = PMG
::RuleDB
::Rule-
>new ('Block Spam (Level 10)', 78, 0, 0);
999 $ruledb->save_rule ($rule);
1001 $ruledb->rule_add_what_group ($rule, $spam10);
1002 $ruledb->rule_add_action ($rule, $block);
1004 ## Block Outgoing Spam
1005 $rule = PMG
::RuleDB
::Rule-
>new ('Block outgoing Spam', 70, 0, 1);
1006 $ruledb->save_rule ($rule);
1008 $ruledb->rule_add_what_group ($rule, $spam3);
1009 $ruledb->rule_add_action ($rule, $notify_admin);
1010 $ruledb->rule_add_action ($rule, $notify_sender);
1011 $ruledb->rule_add_action ($rule, $block);
1014 $rule = PMG
::RuleDB
::Rule-
>new ('Add Disclaimer', 60, 0, 1);
1015 $ruledb->save_rule ($rule);
1016 $ruledb->rule_add_action ($rule, $add_discl);
1018 # Block Multimedia Files
1019 $rule = PMG
::RuleDB
::Rule-
>new ('Block Multimedia Files', 87, 0, 2);
1020 $ruledb->save_rule ($rule);
1022 $ruledb->rule_add_what_group ($rule, $mm_content);
1023 $ruledb->rule_add_action ($rule, $remove);
1025 #$ruledb->rule_add_from_group ($rule, $anybody);
1026 #$ruledb->rule_add_from_group ($rule, $trusted);
1027 #$ruledb->rule_add_to_group ($rule, $anybody);
1028 #$ruledb->rule_add_what_group ($rule, $ct_filter);
1029 #$ruledb->rule_add_action ($rule, $add_discl);
1030 #$ruledb->rule_add_action ($rule, $remove);
1031 #$ruledb->rule_add_action ($rule, $bcc);
1032 #$ruledb->rule_add_action ($rule, $storeq);
1033 #$ruledb->rule_add_action ($rule, $accept);
1035 cond_create_std_actions
($ruledb);