aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@cepl.eu>2019-09-30 10:37:52 +0200
committerMatěj Cepl <mcepl@cepl.eu>2019-09-30 10:37:52 +0200
commitc60e11ceba4fc9ac017e8b1c6a2f1eab810f2dc7 (patch)
tree10ba0f4b0e1b63844ccb470a07b07331af580268
parent0efae60c88d21bcdca66d904cbc842b2e64ecfac (diff)
downloadpygn-c60e11ceba4fc9ac017e8b1c6a2f1eab810f2dc7.tar.gz
Basic restructuring of the code to use setuptools’ entry_points.
-rw-r--r--mail2news.py84
-rw-r--r--news2mail.py107
-rwxr-xr-xpygm2n99
-rwxr-xr-xpygn2m126
-rw-r--r--setup.py6
5 files changed, 190 insertions, 232 deletions
diff --git a/mail2news.py b/mail2news.py
index d6d8658..386305b 100644
--- a/mail2news.py
+++ b/mail2news.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
"""Mail to news gateway script. Copyright 2000 Cosimo Alfarano
Author: Cosimo Alfarano
@@ -98,7 +99,7 @@ class mail2news(object):
# In rfc822 References: is considered, but many MUA doen't put it.
if ('References' not in self.message) and \
('In-Reply-To' in self.message):
- print self.message['In-Reply-To']
+ print(self.message['In-Reply-To'])
# some MUA uses msgid without '<' '>'
# ref = findall('([^\s<>\']+@[^\s<>;:\']+)', \
@@ -110,8 +111,8 @@ class mail2news(object):
if(ref and len(ref)):
self.message['References'] = '%s\n' % ref[0]
- except KeyError, message:
- print message
+ except KeyError as message:
+ print(message)
def removeheads(self, heads=None):
"""remove headers like Xref: Path: Lines:
@@ -137,8 +138,8 @@ class mail2news(object):
msgid = '<pyg.%d@tuchailepuppapera.org>\n' % (os.getpid())
self.message['Message-Id'] = msgid
- except KeyError, message:
- print message
+ except KeyError as message:
+ print(message)
def sortheads(self):
"""make list sorted by heads: From: To: Subject: first,
@@ -183,3 +184,76 @@ class mail2news(object):
server.post(StringIO(self.message.as_string()))
server.quit()
+
+def parse_cmdline():
+ parser = argparse.ArgumentParser(
+ description='%s version %s - Copyright 2000 Cosimo Alfarano\n%s' %
+ ('pyg', mail2news.VERSION, mail2news.DESC))
+
+ parser.add_argument('-s', '--newsserver', default='')
+ parser.add_argument('-a', '--approver', default='',
+ help="address of moderator/approver")
+ parser.add_argument('-n', '--newsgroup', default='',
+ help='newsgroup[s] (specified as comma separated ' +
+ 'without spaces list)', required=True)
+ parser.add_argument('-u', '--user', default='',
+ help='NNTP server user (for authentication)')
+ parser.add_argument('-p', '--password', default='',
+ help='NNTP server password (for authentication)')
+ parser.add_argument('-P', '--port', default='')
+ parser.add_argument('-e', '--envellope', default='')
+ parser.add_argument('-l', '--logfile')
+
+ parser.add_argument('-T', '--test', action='store_true',
+ help='test mode (not send article via NNTP)')
+ parser.add_argument('-v', '--verbose', action='store_true',
+ help='verbose output ' +
+ '(usefull with -T option for debugging)')
+
+ args = parser.parse_args()
+
+ if not args.newsgroup:
+ raise argparse.ArgumentError('Error: Missing Newsgroups\n')
+
+ return args
+
+
+def main():
+ """main is structured in 4 phases:
+ 1) check and set pyg's internal variables
+ 2) check whitelist for users' permission
+ 3) format rfc 822 headers from input article
+ 4) open smtp connection and send e-mail
+ """
+
+ try:
+ """phase 1:
+ check and set pyg's internal variables
+ """
+ opt = parse_cmdline()
+
+ m2n = mail2news.mail2news(opt)
+ owner = None
+
+ """phase 3:
+ format rfc 822 headers from input article
+ """
+ m2n.renameheads() # rename useless heads
+ m2n.removeheads() # remove other heads
+
+ m2n.sortheads() # sort remaining heads :)
+
+ if opt.verbose:
+ print(m2n.message.as_string())
+
+ logging.debug('m2n.payload = len %d', len(m2n.message.get_payload()))
+ if len(m2n.message.get_payload()) > 0:
+ # wl.logmsg(m2n.heads_dict,wl.ACCEPT,owner)
+ if not opt.test:
+ try:
+ resp = m2n.sendemail()
+ except nntplib.NNTPError as ex:
+ print(ex)
+ except KeyboardInterrupt:
+ print('Keyboard Interrupt')
+ sys.exit(0)
diff --git a/news2mail.py b/news2mail.py
index 78d0ae4..eecd701 100644
--- a/news2mail.py
+++ b/news2mail.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
"""News to mail gateway script. Copyright 2000 Cosimo Alfarano
Author: Cosimo Alfarano
@@ -121,8 +122,8 @@ class news2mail(object):
refs = self.message['References'].split()
self.message['In-Reply-To'] = refs[-1]
- except KeyError, message:
- print message
+ except KeyError as message:
+ print(message)
def __sortheads(self):
"""make list sorting heads, Received: From: To: Subject: first,
@@ -167,3 +168,105 @@ class news2mail(object):
s.sendmail(self.envelope, self.rcpt, self.message.as_string())
s.quit()
+
+def parse_cmdline():
+ """
+ set a dictionary with smtp new header in gw parameter (gw.smtpheads)
+ return (test,verbose) boolean tuple
+ """
+ parser = argparse.ArgumentParser(
+ description='pyg version %s - Copyright 2000 Cosimo Alfarano\n%s' %
+ (VERSION, DESC))
+
+ parser.add_argument('-H', '--smtpserver', default='')
+ parser.add_argument('-s', '--sender', required=True, default='')
+ parser.add_argument('-e', '--envelope', default='')
+ parser.add_argument('-t', '--to', dest='rcpt', required=True)
+ parser.add_argument('-w', '--wlfile')
+ parser.add_argument('-l', '--logfile')
+
+ parser.add_argument('-T', '--test',
+ help='test mode (not send article via SMTP)',
+ action='store_true')
+ parser.add_argument('-v', '--verbose', help='verbose output',
+ action='store_true')
+
+ opts = parser.parse_args()
+
+# By rfc822 [Resent-]Sender: should be ever set, unless == From:
+# (not this case). Should be a human, while [Resent-]From: may be a program.
+
+ if opts.rcpt == '' or opts.sender == '':
+ raise argparse.ArgumentError('missing command line option')
+
+ if opts.envelope == '' and opts.sender != '':
+ opts.envelope = opts.sender
+
+ return opts
+
+def main():
+ """main is structured in 4 phases:
+ 1) check and set pyg's internal variables
+ 2) check whitelist for users' permission
+ 3) format rfc 822 headers from input article
+ 4) open smtp connection and send e-mail
+ """
+
+ """phase 1:
+ check and set pyg's internal variables
+ """
+
+ # it returns only test, other parms are set directly in the actual
+ # parameter
+ args = parse_cmdline()
+
+ n2m = news2mail.news2mail(verbose=args.verbose)
+ owner = None
+
+ # check if n2m has some file prefercences set on commandline
+ if args.wlfile is None:
+ wl = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'pyg.whitelist'))
+ else:
+ wl = args.wlfile
+
+ if args.logfile is None:
+ log = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'pyg.log'))
+ else:
+ log = args.logfile
+
+ wl = whitelist.whitelist(wl, log)
+
+ """phase 2:
+ check whitelist for user's permission
+ """
+
+ # make a first check of From: address
+ owner = wl.checkfrom(n2m.message['From'])
+ if owner is None:
+ if sys.stdin.isatty() == 1 or args.test:
+ print ('"%s" is not in whitelist!' % (n2m.message['From'][:-1]))
+ else:
+ wl.logmsg(n2m.nntpheads, wl.DENY)
+
+ # if verbose, I want to print out headers, so I can't
+ # exit now.
+ if not args.verbose:
+ sys.exit(1)
+
+ # Reformat the message
+ n2m.process_message()
+
+ # prints formatted email message only (without send) if user wants
+ if args.verbose:
+ print(n2m.message.as_string())
+
+ if owner is None:
+ sys.exit(1)
+
+ """phase 4:
+ open smtp connection and send e-mail
+ """
+
+ wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner)
+ if not args.test:
+ n2m.sendarticle()
diff --git a/pygm2n b/pygm2n
deleted file mode 100755
index 3629857..0000000
--- a/pygm2n
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""News to mail gateway script. Copyright 2000 Cosimo Alfarano
-
-Author: Cosimo Alfarano
-Date: June 11 2000
-
-pygs - Copyright 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It>
-You can use this software under the terms of the GPL. If we meet some day,
-and you think this stuff is worth it, you can buy me a beer in return.
-
-Thanks to md for this useful formula. Beer is beer.
-
-Gets news article and sends it via SMTP.
-"""
-from __future__ import print_function
-
-import argparse
-import logging
-import mail2news
-import nntplib
-import sys
-
-# logging.basicConfig(level=logging.DEBUG)
-
-def parse_cmdline():
- parser = argparse.ArgumentParser(
- description='%s version %s - Copyright 2000 Cosimo Alfarano\n%s' %
- ('pyg', mail2news.VERSION, mail2news.DESC))
-
- parser.add_argument('-s', '--newsserver', default='')
- parser.add_argument('-a', '--approver', default='',
- help="address of moderator/approver")
- parser.add_argument('-n', '--newsgroup', default='',
- help='newsgroup[s] (specified as comma separated ' +
- 'without spaces list)', required=True)
- parser.add_argument('-u', '--user', default='',
- help='NNTP server user (for authentication)')
- parser.add_argument('-p', '--password', default='',
- help='NNTP server password (for authentication)')
- parser.add_argument('-P', '--port', default='')
- parser.add_argument('-e', '--envellope', default='')
- parser.add_argument('-l', '--logfile')
-
- parser.add_argument('-T', '--test', action='store_true',
- help='test mode (not send article via NNTP)')
- parser.add_argument('-v', '--verbose', action='store_true',
- help='verbose output ' +
- '(usefull with -T option for debugging)')
-
- args = parser.parse_args()
-
- if not args.newsgroup:
- raise argparse.ArgumentError('Error: Missing Newsgroups\n')
-
- return args
-
-
-"""main is structured in 4 phases:
- 1) check and set pyg's internal variables
- 2) check whitelist for users' permission
- 3) format rfc 822 headers from input article
- 4) open smtp connection and send e-mail
-"""
-
-
-try:
-
- """phase 1:
- check and set pyg's internal variables
- """
- opt = parse_cmdline()
-
- m2n = mail2news.mail2news(opt)
- owner = None
-
- """phase 3:
- format rfc 822 headers from input article
- """
- m2n.renameheads() # rename useless heads
- m2n.removeheads() # remove other heads
-
- m2n.sortheads() # sort remaining heads :)
-
- if opt.verbose:
- print(m2n.message.as_string())
-
- logging.debug('m2n.payload = len %d', len(m2n.message.get_payload()))
- if len(m2n.message.get_payload()) > 0:
-# wl.logmsg(m2n.heads_dict,wl.ACCEPT,owner)
- if not opt.test:
- try:
- resp = m2n.sendemail()
- except nntplib.NNTPError as ex:
- print(ex)
-
-except KeyboardInterrupt:
- print('Keyboard Interrupt')
- sys.exit(0)
diff --git a/pygn2m b/pygn2m
deleted file mode 100755
index a2c07cb..0000000
--- a/pygn2m
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""News to mail gateway script. Copyright 2000 Cosimo Alfarano
-
-Author: Cosimo Alfarano
-Date: June 11 2000
-
-pygs - Copyright 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It>
-You can use this software under the terms of the GPL. If we meet some day,
-and you think this stuff is worth it, you can buy me a beer in return.
-
-Thanks to md for this useful formula. Beer is beer.
-
-Gets news article from stdin and sends it via SMTP.
-"""
-from __future__ import print_function
-
-import argparse
-from mail2news import VERSION, DESC
-import news2mail
-import os
-import sys
-import whitelist
-
-
-def parse_cmdline():
- """
- set a dictionary with smtp new header in gw parameter (gw.smtpheads)
- return (test,verbose) boolean tuple
- """
- parser = argparse.ArgumentParser(
- description='pyg version %s - Copyright 2000 Cosimo Alfarano\n%s' %
- (VERSION, DESC))
-
- parser.add_argument('-H', '--smtpserver', default='')
- parser.add_argument('-s', '--sender', required=True, default='')
- parser.add_argument('-e', '--envelope', default='')
- parser.add_argument('-t', '--to', dest='rcpt', required=True)
- parser.add_argument('-w', '--wlfile')
- parser.add_argument('-l', '--logfile')
-
- parser.add_argument('-T', '--test',
- help='test mode (not send article via SMTP)',
- action='store_true')
- parser.add_argument('-v', '--verbose', help='verbose output',
- action='store_true')
-
- opts = parser.parse_args()
-
-# By rfc822 [Resent-]Sender: should be ever set, unless == From:
-# (not this case). Should be a human, while [Resent-]From: may be a program.
-
- if opts.rcpt == '' or opts.sender == '':
- raise argparse.ArgumentError('missing command line option')
-
- if opts.envelope == '' and opts.sender != '':
- opts.envelope = opts.sender
-
- return opts
-
-
-"""main is structured in 4 phases:
- 1) check and set pyg's internal variables
- 2) check whitelist for users' permission
- 3) format rfc 822 headers from input article
- 4) open smtp connection and send e-mail
-"""
-
-"""phase 1:
-check and set pyg's internal variables
-"""
-
-# it returns only test, other parms are set directly in the actual
-# parameter
-args = parse_cmdline()
-
-n2m = news2mail.news2mail(verbose=args.verbose)
-owner = None
-
-# check if n2m has some file prefercences set on commandline
-if args.wlfile is None:
- wl = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'pyg.whitelist'))
-else:
- wl = args.wlfile
-
-if args.logfile is None:
- log = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'pyg.log'))
-else:
- log = args.logfile
-
-wl = whitelist.whitelist(wl, log)
-
-"""phase 2:
-check whitelist for user's permission
-"""
-
-# make a first check of From: address
-owner = wl.checkfrom(n2m.message['From'])
-if owner is None:
- if sys.stdin.isatty() == 1 or args.test:
- print ('"%s" is not in whitelist!' % (n2m.message['From'][:-1]))
- else:
- wl.logmsg(n2m.nntpheads, wl.DENY)
-
- # if verbose, I want to print out headers, so I can't
- # exit now.
- if not args.verbose:
- sys.exit(1)
-
-# Reformat the message
-n2m.process_message()
-
-# prints formatted email message only (without send) if user wants
-if args.verbose:
- print(n2m.message.as_string())
-
-if owner is None:
- sys.exit(1)
-
-"""phase 4:
-open smtp connection and send e-mail
-"""
-
-wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner)
-if not args.test:
- n2m.sendarticle()
diff --git a/setup.py b/setup.py
index 6184381..67e2574 100644
--- a/setup.py
+++ b/setup.py
@@ -22,6 +22,12 @@ setup(name='pygn',
'whitelist', 'wlp', 'wlp_parser'],
test_suite="test",
scripts=['pygm2n', 'pygn2m'],
+ entry_points={
+ "console_scripts": [
+ "pygm2n = mail2news:main",
+ "pygn2m = news2mail:main"
+ ]
+ },
requires=['rply'],
license="GPLv3",
keywords=["nntp", "email", "gateway"],