ActiveSync (Z-push) and Qmail-greyd: Difference between pages

From QmailToaster
(Difference between pages)
Jump to navigation Jump to search
(Created page with "ActiveSync Z-push install # printf '%s\n' \ '[z-push]' \ 'name=Z-Push noarch Enterprise Linux 7 - \$basearch' \ 'baseurl=http://repo.z-hub.io/z-push:/final/RHEL_7' \ 'failovermethod=priority' \ 'enabled=1' \ 'gpgcheck=0' \ > /etc/yum.repos.d/z-push.repo # yum install z-push-common z-push-config-apache z-push-backend-imap z-push-ipc-sharedmemory # perl -pi -e 's#'\''IMAP_FOLDER_CONFIGURED'\'', false#'\''IMAP_FOLDER_CONFIGURED'\'', true#g' /usr/sh...")
 
No edit summary
 
Line 1: Line 1:
ActiveSync Z-push install
[[Adding_greylisting_to_QMT]]


# printf '%s\n' \
<pre>
  '[z-push]' \
#!/usr/bin/python
  'name=Z-Push noarch Enterprise Linux 7 - \$basearch' \
  'baseurl=http://repo.z-hub.io/z-push:/final/RHEL_7' \
  'failovermethod=priority' \
  'enabled=1' \
  'gpgcheck=0' \
  > /etc/yum.repos.d/z-push.repo


# yum install z-push-common z-push-config-apache z-push-backend-imap z-push-ipc-sharedmemory
# Before running this script make sure to have done :
# perl -pi -e 's#'\''IMAP_FOLDER_CONFIGURED'\'', false#'\''IMAP_FOLDER_CONFIGURED'\'', true#g' /usr/share/z-push/backend/imap/config.php
# mkdir /var/qmail/grey
# perl -pi -e 's#'\''TIMEZONE'\'', '\'''\''#'\''TIMEZONE'\'', '\''America/Denver'\''#g' /usr/share/z-push/config.php
# chown qmaild.nofiles /var/qmail/grey
# perl -pi -e 's#'\''BACKEND_PROVIDER'\'', '\'''\''#'\''BACKEND_PROVIDER'\'', '\''BackendIMAP'\''#g' /usr/share/z-push/config.php
# test with env TCPREMOTEIP="127.0.0.1" GREY="" ./greyd /bin/bash -c env | grep RB
# and do not forget to delete the folder and file created before going in production
# Design similar to http://www.jonatkins.com/page/software/qgreylist


import os
import sys
import time


  Configure Outlook email client on tablet or phone (Tested: Samsung Galaxy Tab S2, and Samsung S7 Edge, iPhone X)
minute = 60
On tablet or smart phone open Outlook
hour = 60*60
Go to 'Add Accout'
day = 60*60*24
Go to 'Add an email account'
 
Enter email address
# Configuration start
Go to 'Manual setup'
 
Select 'Exchange'
config = {}
  Go to 'Advanced Setup'
config['WAITING'] = 1*minute # How long should a sender wait before being allowed
Enter email account (client@domain.com) -> Next
config['LAST_SEEN'] = 32*day # How long before we clean IP which have sent several time
Enter mail server -> (mail.domain.com) -> Next
config['FIRST_SEEN'] = 5*day # How long before we clean IP which have seen one time only
Enter domain\username (client@domain.com) -> Next
config['CLEANUP'] = 20*minute # How often we cleanup the IPS
Enter password (password) -> Next -> Done
config['BASE'] = os.path.join('/','var','qmail','grey')
Connect (on mine its a check mark, select it)
 
Outlook (Exchange) should sync now
log_per_ip = True # Log per IP (true) or per Class C (false)
 
# Configuration end
 
def log (*param):
sys.stderr.write('greyd: ')
sys.stderr.write(*param)
sys.stderr.write('\n')
sys.stderr.flush()
 
def out (code,*param):
log(*param)
sys.exit(code)
 
def run_next ():
if len(sys.argv) > 1:
try:
prog = sys.argv[1]
param = sys.argv[1:]
os.execve(prog,param,os.environ)
except:
out(1,"issue whish trying to exec %s" % prog)
else:
out(1,"can not execute the smtp application")
 
def cleanup ():
global config
try:
filename = os.path.join(config['BASE'],'clean')
last_clean = os.path.getmtime(filename)
except:
try:
open(filename,'w').close()
except:
log('can not create the timestamp file (%s) used for cleanup' % filename)
return
 
try:
now = time.time()
if now - last_clean > config['CLEANUP']:
log('running cleanup')
open(filename,'w').close()
for root, dirs, files in os.walk(config['BASE'], topdown=False):
if not dirs:
for file in files:
filename = os.path.join(root,file)
#log('checking %s' % filename)
try:
ctime = os.path.getctime(filename)
mtime = os.path.getmtime(filename)
 
deltac = now - ctime
deltam = now - mtime
except:
log('%s must have been deleted by another process' % filename)
continue
try:
# You sent us one mail 5 days ago, bye, bye
if ctime == mtime :
if deltac > config['FIRST_SEEN']:
os.unlink(filename)
log('removed inactive one off sender %s' % filename)
# You sent us several mails 32 days ago, bye, bye
else:
if deltam > config['LAST_SEEN']:
os.unlink(filename)
log('removed inactive sender %s' % filename)
except:
log('could not cleanup %s' % filename)
continue
except:
log('problem with cleanup')
 
# Main
 
# Get all environment variable
 
remote_ip = os.environ.get('TCPREMOTEIP')
if remote_ip == None:
# should never happen
out(1,"Can not get TCPREMOTEIP from environment")
 
if os.environ.get('GREY') == None:
run_next()
 
if os.environ.get('RELAYCLIENT') != None:
sys.stderr.write('Both GREY and RELAYCLIENT set for the same IP : %s' % remote_ip)
os.environ['RBLSMTPD'] = ''
run_next()
 
# Build the name of the file to check
 
ips = remote_ip.split('.')
foldername = config['BASE']
 
foldername = os.path.join(foldername,ips[0],ips[1])
filename = os.path.join(foldername,ips[2])
 
if log_per_ip:
filename += "-" + ips[3]
 
# Check time and perform according action
 
try:
now = time.time()
 
last_seen = os.path.getmtime(filename)
first_seen = os.path.getctime(filename)
delta_last = now - last_seen
delta_first = now - first_seen
except:
try:
os.makedirs(foldername,0700)
except:
# The folder most likely already exist
pass
try:
open(filename,'w').close()
os.environ['RBLSMTPD'] = 'greylisting, IP %s time -' % remote_ip
except:
log('issue trying the initial touching of the file %s (or creating the folder)' % filename)
cleanup()
run_next()
 
# if you never waited two minutes without sending
if delta_first < config['WAITING']:
try:
os.unlink(filename)
open(filename,'w').close()
os.environ['RBLSMTPD'] = 'greylisting, IP %s time %d' % (remote_ip,int(delta_last))
except:
log('issue with touching file %s' % filename)
cleanup()
run_next()
# deliver valid email
run_next()
</pre>

Revision as of 11:01, 30 March 2024

Adding_greylisting_to_QMT

#!/usr/bin/python

# Before running this script make sure to have done :
# mkdir /var/qmail/grey
# chown qmaild.nofiles /var/qmail/grey
# test with env TCPREMOTEIP="127.0.0.1" GREY="" ./greyd /bin/bash -c env | grep RB
# and do not forget to delete the folder and file created before going in production
# Design similar to http://www.jonatkins.com/page/software/qgreylist

import os
import sys
import time

minute = 60
hour = 60*60
day = 60*60*24

# Configuration start

config = {}
config['WAITING'] = 1*minute		# How long should a sender wait before being allowed
config['LAST_SEEN'] = 32*day		# How long before we clean IP which have sent several time
config['FIRST_SEEN'] = 5*day		# How long before we clean IP which have seen one time only
config['CLEANUP'] = 20*minute		# How often we cleanup the IPS
config['BASE'] = os.path.join('/','var','qmail','grey')

log_per_ip = True			# Log per IP (true) or per Class C (false)

# Configuration end

def log (*param):
	sys.stderr.write('greyd: ')
	sys.stderr.write(*param)
	sys.stderr.write('\n')
	sys.stderr.flush()

def out (code,*param):
	log(*param)
	sys.exit(code)

def run_next ():
	if len(sys.argv) > 1:
		try:
			prog = sys.argv[1]
			param = sys.argv[1:]
			os.execve(prog,param,os.environ)
		except:
			out(1,"issue whish trying to exec %s" % prog)
	else:
		out(1,"can not execute the smtp application")

def cleanup ():
	global config
	
	try:
		filename = os.path.join(config['BASE'],'clean')
		last_clean = os.path.getmtime(filename)
	except:
		try:
			open(filename,'w').close()
		except:
			log('can not create the timestamp file (%s) used for cleanup' % filename)
		return

	try:
		now = time.time()
		if now - last_clean > config['CLEANUP']:
			log('running cleanup')
			open(filename,'w').close()
			for root, dirs, files in os.walk(config['BASE'], topdown=False):
				if not dirs:
					for file in  files:
						filename = os.path.join(root,file)
						#log('checking %s' % filename)
						try:
							ctime = os.path.getctime(filename)
							mtime = os.path.getmtime(filename)

							deltac = now - ctime
							deltam = now - mtime
						except:
							log('%s must have been deleted by another process' % filename)
							continue
						try:
							# You sent us one mail 5 days ago, bye, bye
							if ctime == mtime :
								if deltac > config['FIRST_SEEN']:
									os.unlink(filename)
									log('removed inactive one off sender %s' % filename)
							# You sent us several mails 32 days ago, bye, bye
							else:
								if deltam > config['LAST_SEEN']:
									os.unlink(filename)
									log('removed inactive sender %s' % filename)
						except:
							log('could not cleanup %s' % filename)
							continue
	except:
		log('problem with cleanup')

# Main

# Get all environment variable

remote_ip = os.environ.get('TCPREMOTEIP')
if remote_ip == None:
	# should never happen
	out(1,"Can not get TCPREMOTEIP from environment")

if os.environ.get('GREY') == None:
	run_next()

if os.environ.get('RELAYCLIENT') != None:
	sys.stderr.write('Both GREY and RELAYCLIENT set for the same IP : %s' % remote_ip)
	os.environ['RBLSMTPD'] = ''
	run_next()

# Build the name of the file to check

ips = remote_ip.split('.')
foldername = config['BASE']

foldername = os.path.join(foldername,ips[0],ips[1])
filename = os.path.join(foldername,ips[2])

if log_per_ip:
	filename += "-" + ips[3]

# Check time and perform according action

try:
	now = time.time()

	last_seen = os.path.getmtime(filename)
	first_seen = os.path.getctime(filename)
	
	delta_last = now - last_seen
	delta_first = now - first_seen
except:
	try:
		os.makedirs(foldername,0700)
	except:
		# The folder most likely already exist
		pass
	try:
		open(filename,'w').close()
		os.environ['RBLSMTPD'] = 'greylisting, IP %s time -' % remote_ip
	except:
		log('issue trying the initial touching of the file %s (or creating the folder)' % filename)
	cleanup()
	run_next()

# if you never waited two minutes without sending
if delta_first < config['WAITING']:
	try:
		os.unlink(filename)
		open(filename,'w').close()
		os.environ['RBLSMTPD'] = 'greylisting, IP %s time %d' % (remote_ip,int(delta_last))
	except:
		log('issue with touching file %s' % filename)
	cleanup()
	run_next()
	
# deliver valid email
run_next()