git: b08c440c2118 - 2023Q2 - mail/queue-repair: fix with Python 3

From: Robert Clausecker <fuz_at_FreeBSD.org>
Date: Mon, 08 May 2023 08:27:44 UTC
The branch 2023Q2 has been updated by fuz:

URL: https://cgit.FreeBSD.org/ports/commit/?id=b08c440c2118564c2b1acfb7dc5bf5d41e8c3f17

commit b08c440c2118564c2b1acfb7dc5bf5d41e8c3f17
Author:     Jeff Schmidt <jeff.jschmidt@gmail.com>
AuthorDate: 2023-05-07 10:46:56 +0000
Commit:     Robert Clausecker <fuz@FreeBSD.org>
CommitDate: 2023-05-08 08:27:29 +0000

    mail/queue-repair: fix with Python 3
    
    Submitter becomes maintainer.
    
    Obtained from:  https://notes.sagredo.eu/en/qmail-notes-185/queue-repair-21.html
    PR:             271273
    MFH:            2023Q2
    
    (cherry picked from commit 809ff8bfc9d4b3221ed5c5329d70d40ba3c8e900)
---
 mail/queue-repair/Makefile                     |   4 +-
 mail/queue-repair/files/patch-queue__repair.py | 250 +++++++++++++++++++++++++
 2 files changed, 252 insertions(+), 2 deletions(-)

diff --git a/mail/queue-repair/Makefile b/mail/queue-repair/Makefile
index d1f87269d25c..451c4b9f79fe 100644
--- a/mail/queue-repair/Makefile
+++ b/mail/queue-repair/Makefile
@@ -1,10 +1,10 @@
 PORTNAME=	queue-repair
 PORTVERSION=	0.9.0
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	mail python
 MASTER_SITES=	http://pyropus.ca/software/${PORTNAME}/
 
-MAINTAINER=	ports@FreeBSD.org
+MAINTAINER=	jeff.jschmidt@gmail.com
 COMMENT=	Qmail queue diagnostic and repair tool
 WWW=		http://pyropus.ca/software/queue-repair/
 
diff --git a/mail/queue-repair/files/patch-queue__repair.py b/mail/queue-repair/files/patch-queue__repair.py
new file mode 100644
index 000000000000..e6bbfde3be65
--- /dev/null
+++ b/mail/queue-repair/files/patch-queue__repair.py
@@ -0,0 +1,250 @@
+https://bz-attachments.freebsd.org/attachment.cgi?id=242009
+
+--- queue_repair.py.orig	2003-10-22 15:54:13 UTC
++++ queue_repair.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/local/bin/python3.9
+ '''queue_repair.py - qmail tools in Python.
+ Copyright (C) 2001 Charles Cazabon <pqt @ discworld.dyndns.org>
+ 
+@@ -58,7 +58,7 @@ users = {
+ 
+ groups = {
+     'qmail' : None,
+-    'nofiles' : None,
++    'qnofiles' : None,
+ }
+ 
+ dirs = {
+@@ -66,24 +66,24 @@ dirs = {
+     #   key: pathname - all paths are relative to conf-qmail
+     #   data: (user, group, mode, split)
+     #       split is:  0 : no, 1 : yes, -1 : only with big-todo
+-    'queue' :           ('qmailq', 'qmail', 0750, 0),
+-    'queue/bounce' :    ('qmails', 'qmail', 0700, 0),
+-    'queue/info' :      ('qmails', 'qmail', 0700, 1),
+-    'queue/intd' :      ('qmailq', 'qmail', 0700, -1),
+-    'queue/local' :     ('qmails', 'qmail', 0700, 1),
+-    'queue/lock' :      ('qmailq', 'qmail', 0750, 0),
+-    'queue/mess' :      ('qmailq', 'qmail', 0750, 1),
+-    'queue/pid' :       ('qmailq', 'qmail', 0700, 0),
+-    'queue/remote' :    ('qmails', 'qmail', 0700, 1),
+-    'queue/todo' :      ('qmailq', 'qmail', 0750, -1),
++    'queue' :           ('qmailq', 'qmail', 0o750, 0),
++    'queue/bounce' :    ('qmails', 'qmail', 0o700, 0),
++    'queue/info' :      ('qmails', 'qmail', 0o700, 1),
++    'queue/intd' :      ('qmailq', 'qmail', 0o700, -1),
++    'queue/local' :     ('qmails', 'qmail', 0o700, 1),
++    'queue/lock' :      ('qmailq', 'qmail', 0o750, 0),
++    'queue/mess' :      ('qmailq', 'qmail', 0o750, 1),
++    'queue/pid' :       ('qmailq', 'qmail', 0o700, 0),
++    'queue/remote' :    ('qmails', 'qmail', 0o700, 1),
++    'queue/todo' :      ('qmailq', 'qmail', 0o750, -1),
+ }
+ 
+ nondirs = {
+     # Files to check; format is:
+     #   key: pathname - all paths are relative to conf-qmail
+     #   data: (user, group, mode)
+-    'queue/lock/sendmutex' :    ('qmails', 'qmail', 0600),
+-    'queue/lock/tcpto' :        ('qmailr', 'qmail', 0644),
++    'queue/lock/sendmutex' :    ('qmails', 'qmail', 0o600),
++    'queue/lock/tcpto' :        ('qmailr', 'qmail', 0o644),
+ }
+ 
+ 
+@@ -105,7 +105,7 @@ def primes(min, max):
+     while i <= max:
+         for p in primelist:
+             if (i % p == 0) or (p * p > i): break
+-        if (i % p <> 0):
++        if (i % p != 0):
+             primelist.append(i)
+             if i >= min:
+                 result.append(i)
+@@ -151,8 +151,8 @@ def determine_users():
+     '''
+     global users, groups
+     msg('finding qmail UIDs/GIDs...')
+-    us = users.keys()
+-    gs = groups.keys()
++    us = list(users.keys())
++    gs = list(groups.keys())
+     for u in us:
+         if users[u]:
+             # Handle case of someone else determining UIDs for us
+@@ -182,7 +182,7 @@ def check_dir(path, user, group, mode):
+     that it has octal mode mode.  If testmode is set, create path if it
+     doesn't exist.
+     '''
+-    if checked_dir.has_key(path):
++    if path in checked_dir:
+         return
+     msg('  checking directory %s...' % path)
+     if not os.path.exists(path):
+@@ -208,7 +208,7 @@ def chown(path, user, group):
+ 
+     Verify path is owned by user:group, and make it so if testmode is not set.
+     '''
+-    if checked_owner.has_key(path):
++    if path in checked_owner:
+         return
+     uid = users[user]
+     gid = groups[group]
+@@ -223,7 +223,7 @@ def chown(path, user, group):
+                 msg('  fixed, %s ownership %i:%i' % (path, s[ST_UID], s[ST_GID]))
+             else:
+                 msg('  testmode, not fixing')
+-    except OSError, o:
++    except OSError as o:
+         err(o or '[no error message]')
+     checked_owner[path] = None
+ 
+@@ -233,7 +233,7 @@ def chmod(path, mode):
+ 
+     Verify path has mode mode, and make it so if testmode is not set.
+     '''
+-    if checked_mode.has_key(path):
++    if path in checked_mode:
+         return
+     try:
+         s = os.stat(path)
+@@ -247,7 +247,7 @@ def chmod(path, mode):
+                 msg('  changed %s mode to %o' % (path, newmode))
+             else:
+                 msg('  testmode, not fixing')
+-    except OSError, o:
++    except OSError as o:
+         err(o or '[no error message]')
+     checked_mode[path] = None
+ 
+@@ -259,7 +259,7 @@ def determine_split():
+     '''
+     splits = []
+     msg('determining conf-split...')
+-    for (path, (user, group, mode, is_split)) in dirs.items():
++    for (path, (user, group, mode, is_split)) in list(dirs.items()):
+         if is_split != 1:
+             continue
+         highest = 0
+@@ -311,7 +311,7 @@ def determine_bigtodo(split):
+         else:
+             msg('  found unexpected direntry %s' % p)
+ 
+-    if splits == range(split):
++    if splits == list(range(split)):
+         # big-todo apparently in use
+         bigtodo = 1
+         msg('  big-todo found')
+@@ -330,14 +330,14 @@ def check_dirs(paths, split, bigtodo):
+     Verify ownership, mode, and contents of each queue directory in paths.
+     '''
+     msg('checking main queue directories...')
+-    _dirs = paths.keys()
++    _dirs = list(paths.keys())
+     _dirs.sort()
+     for path in _dirs:
+         (user, group, mode, is_split) = paths[path]
+         check_dir(path, user, group, mode)
+ 
+     msg('checking split sub-directories...')
+-    for (path, (user, group, mode, is_split)) in paths.items():
++    for (path, (user, group, mode, is_split)) in list(paths.items()):
+         if path in ('queue', 'queue/lock'):
+             # Nothing in these directories to check at this point
+             continue
+@@ -345,7 +345,7 @@ def check_dirs(paths, split, bigtodo):
+         if not this_split:
+             splits = []
+         else:
+-            splits = range(split)
++            splits = list(range(split))
+             for i in splits:
+                 splitpath = os.path.join(path, str(i))
+                 check_dir(splitpath, user, group, mode)
+@@ -428,7 +428,7 @@ def check_files(paths):
+     Verify ownership and mode of each queue file in paths.
+     '''
+     msg('checking files...')
+-    for (path, (user, group, mode)) in paths.items():
++    for (path, (user, group, mode)) in list(paths.items()):
+         if os.path.exists(path):
+             if not os.path.isfile(path):
+                 msg('  %s is not a file' % path)
+@@ -467,7 +467,7 @@ def check_trigger():
+     if not os.path.exists(path) and not testmode:
+         os.mkfifo(path)
+     chown(path, user, group)
+-    chmod(path, 0622)
++    chmod(path, 0o622)
+ 
+ #######################################
+ def check_messages(path, split):
+@@ -516,7 +516,7 @@ def fix_inode_names(paths, split, bigtodo, misnamed):
+     check_messages().  Correct split sub-directory location as well.
+     '''
+     msg('fixing misnamed messages...')
+-    for (path, (user, junk, junk, is_split)) in paths.items():
++    for (path, (user, junk, junk, is_split)) in list(paths.items()):
+         for (oldhash, oldno, newno) in misnamed:
+             if not is_splitdir(is_split, bigtodo):
+                 old_p = os.path.join(path, str(oldno))
+@@ -544,17 +544,17 @@ def check_hash_and_ownership(paths, split, bigtodo):
+     of all files found.
+     '''
+     msg('checking split locations...')
+-    for (path, (user, group, junk, is_split)) in paths.items():
++    for (path, (user, group, junk, is_split)) in list(paths.items()):
+         if path in ('queue', 'queue/lock'):
+             # Nothing in these directories to check at this point
+             continue
+         elif path in ('queue/mess', 'queue/todo'):
+-            mode = 0644
++            mode = 0o644
+         else:
+-            mode = 0600
++            mode = 0o600
+         this_split = is_splitdir(is_split, bigtodo)
+         if this_split:
+-            splits = range(split)
++            splits = list(range(split))
+         else:
+             splits = ['']
+         for splitval in splits:
+@@ -635,7 +635,7 @@ def check_queue(qmaildir=confqmail, test=1, force_spli
+     wd = os.getcwd()
+     try:
+         os.chdir(qmaildir)
+-    except StandardError:
++    except Exception:
+         err('failed to chdir to %s' % qmaildir)
+ 
+     if testmode:
+@@ -747,7 +747,7 @@ def main():
+                     if force_split < 1:
+                         raise ValueError
+                 except ValueError:
+-                    raise getopt.error, 'split value must be a positive integer (%s)' % value
++                    raise getopt.error('split value must be a positive integer (%s)' % value)
+             elif option in ('-n', '--no-bigtodo'):
+                 force_bigtodo = -1
+             elif option in ('-b', '--bigtodo'):
+@@ -765,10 +765,10 @@ def main():
+                 create = 1
+         if args:
+             if len(args) > 1:
+-                raise getopt.error, 'conf-qmail must be a single argument (%s)' % string.join(args)
++                raise getopt.error('conf-qmail must be a single argument (%s)' % string.join(args))
+             qmaildir = args[0]
+ 
+-    except getopt.error, o:
++    except getopt.error as o:
+         err('Error:  %s' % o, showhelp=1)
+ 
+     check_queue(qmaildir, test, force_split, force_bigtodo, create, mathishard)
+@@ -776,3 +776,4 @@ def main():
+ #######################################
+ if __name__ == '__main__':
+     main()
++