From: Stuart Henderson Subject: Re: switch tacacs+ to python3 To: Daniel Dickman Cc: Jan Vlach , ports@openbsd.org Date: Mon, 19 Feb 2024 15:25:47 +0000 On 2024/02/19 10:21, Daniel Dickman wrote: > > > On Mon, 19 Feb 2024, Jeremie Courreges-Anglas wrote: > > > On Sat, Feb 17 2024, Daniel Dickman wrote: > > > Hello Jan, ports@, > > > > > > Please see below for a small update so tacacs+ doesn't need python2. > > > > > > It also looks like python2 is not needed at build time, but only at run > > > time. > > > > > > ok to commit the diff below? > > > > do_auth.py isn't ready for python3, if you really want to move this to > > python3 I would suggest using 2to3 -w in eg post-extract (and thus keep > > current MODPY_BUILDDEP). > > > > Indeed I botched the diff I sent out. I had run do_auth.py through 2to3 > and made a patch that should have been part of the original diff. > > The reason I made a patch instead of running 2to3 dynamically is because > it is only 1 file and more changes might be needed in do_auth.py to adapt > to future python updates in the future. However, the diff for any future patches needed will be shorter if it's made on top of 2to3's output (as would be the case with 2to3 run in post-extract). > ok on this revised version? I'd slightly prefer 2to3 in do-extract (plus drop MODPY_BUILDDEP=No), but I'm ok with either. > Index: Makefile > =================================================================== > RCS file: /cvs/ports/net/tacacs+/Makefile,v > diff -u -p -u -r1.25 Makefile > --- Makefile 27 Sep 2023 14:18:34 -0000 1.25 > +++ Makefile 19 Feb 2024 15:14:54 -0000 > @@ -4,7 +4,7 @@ V = 4.0.4.28 > DISTNAME = tacacs-F${V} > PKGNAME = tacacs+-${V} > EPOCH = 0 > -REVISION = 1 > +REVISION = 2 > > SHARED_LIBS += tacacs 1.0 > > @@ -20,7 +20,9 @@ WANTLIB += c pthread > SITES = ftp://ftp.shrubbery.net/pub/tac_plus/ > > MODULES = lang/python > -MODPY_VERSION = ${MODPY_DEFAULT_VERSION_2} > + > +MODPY_BUILDDEP = No > + > MODPY_ADJ_FILES = do_auth.py > > BUILD_DEPENDS = devel/bison > Index: patches/patch-do_auth_py > =================================================================== > RCS file: patches/patch-do_auth_py > diff -N patches/patch-do_auth_py > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-do_auth_py 19 Feb 2024 15:14:54 -0000 > @@ -0,0 +1,101 @@ > +converted to python3 via 2to3 > + > +Index: do_auth.py > +--- do_auth.py.orig > ++++ do_auth.py > +@@ -211,7 +211,7 @@ General Public License for more details. > + Written by Dan Schmidt - Please visit tacacs.org to check for updates. > + ''' > + > +-import sys,re,getopt,ConfigParser > ++import sys,re,getopt,configparser > + from time import strftime > + > + # I really don't want to deal with these exceptions more than once > +@@ -230,23 +230,23 @@ def get_attribute(config, the_section, the_option, log > + #Should not have any exceptions - BUT, just in case > + try: > + attributes = config.get(the_section, the_option) > +- except ConfigParser.NoSectionError: > ++ except configparser.NoSectionError: > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "Error: Section '%s' Doesn't Exist!\n" > + % (the_section)) > + sys.exit(1) > +- except ConfigParser.DuplicateSectionError: > ++ except configparser.DuplicateSectionError: > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "Error: Duplicate section '%s'\n" > + % (the_section)) > + sys.exit(1) > +- except ConfigParser.NoOptionError: > ++ except configparser.NoOptionError: > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "Error: '%s' not found in section '%s\n'" > + % (the_option, the_section)) > + sys.exit(1) > + #To do: finish exceptions. > +- except ConfigParser.ParsingError: > ++ except configparser.ParsingError: > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "Error: Can't parse file '%s'! (You got me)\n" > + % (filename)) > +@@ -298,9 +298,9 @@ def main(): > + argv = sys.argv > + try: > + optlist, args = getopt.getopt(sys.argv[1:], 'i:u:f:l:d:?:D', ['fix_crs_bug','?', '-?', 'help', 'Help']) > +- except getopt.GetoptError, err: > +- print str(err) > +- print __doc__ > ++ except getopt.GetoptError as err: > ++ print(str(err)) > ++ print(__doc__) > + sys.exit(1) > + for (i, j) in optlist: > + if i == '-i': > +@@ -314,15 +314,15 @@ def main(): > + elif i == '-d': > + device = j > + elif i in ('?', '-?', 'help', 'Help'): > +- print __doc__ > ++ print(__doc__) > + sys.exit(1) > + elif i == '-D': > + is_debug = True > + else: > +- print 'Unknown option:', i > ++ print('Unknown option:', i) > + sys.exit(1) > + if len(argv) < 7: > +- print __doc__ > ++ print(__doc__) > + sys.exit(1) > + log_file = open (log_name, "a") > + #DEBUG! We at least got CALLED > +@@ -384,7 +384,7 @@ def main(): > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "Error: No username entered!\n") > + sys.exit(1) > +- config = ConfigParser.SafeConfigParser() > ++ config = configparser.SafeConfigParser() > + if not (filename in config.read(filename)): > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "Error: Can't open/parse '%s'\n" > +@@ -491,7 +491,7 @@ def main(): > + for item in return_pairs: > + #DEBUG > + # log_file.write("Returning:%s\n" % item.strip()) > +- print item.strip('\n') > ++ print(item.strip('\n')) > + if want_tac_pairs: > + #DEBUG > + # log_file.write("Exiting status 2\n") > +@@ -507,7 +507,7 @@ def main(): > + for item in return_pairs: > + #DEBUG > + # log_file.write("Returning:%s\n" % item.strip()) > +- print item.strip('\n') > ++ print(item.strip('\n')) > + log_file.write(strftime("%Y-%m-%d %H:%M:%S: ") > + + "User '%s' granted access to device '%s' in group '%s' from '%s'\n" > + % (user_name, device, this_group, ip_addr)) > Index: pkg/PLIST > =================================================================== > RCS file: /cvs/ports/net/tacacs+/pkg/PLIST,v > diff -u -p -u -r1.12 PLIST > --- pkg/PLIST 8 Nov 2022 11:17:02 -0000 1.12 > +++ pkg/PLIST 19 Feb 2024 15:14:54 -0000 > @@ -3,7 +3,7 @@ > @extraunexec rm -f /var/log/tac_plus/* > @rcscript ${RCDIR}/tac_plus > include/tacacs.h > -lib/libtacacs.a > +@static-lib lib/libtacacs.a > lib/libtacacs.la > @lib lib/libtacacs.so.${LIBtacacs_VERSION} > @man man/man5/tac_plus.conf.5 >