You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bforce/contrib/u-srif/u-srif.py

183 lines
4.3 KiB
Python

#!/usr/local/bin/python
import string
import sys
import os
# Our own libraries
sys.path.append('./lib')
import uconfig
import udbase
import ufido
import utmpl
import unodestat
from uutil import *
USRIF_CONFIG = '/usr/local/etc/u-srif/u-srif.conf'
class freq_report(ufido.message):
def write_packet(self, pktname):
self.packet.addr_orig = self.addr_orig
self.packet.addr_dest = self.addr_dest
self.packet.write(pktname)
def add_file(self, name, size, desc):
text = format_file_info(name, size, desc)
self.append_text(text)
def __init__(self):
ufido.message.__init__(self)
self.packet = ufido.packet()
self.packet.add_message(self)
class srif_file:
def read_req_list(self):
yield = []
fp = open(self.requestlist, 'r')
line = fp.readline()
while line:
line = string.strip(line)
yield.append(line)
line = fp.readline()
fp.close()
return yield
def write_resp_list(self, list):
fp = open(self.responselist, 'w')
for file in list:
fp.write('+' + file + '\n')
fp.close()
def read(self, name):
fp = open(name, 'r')
line = fp.readline()
while line:
line = string.strip(line)
args = string.split(line, None, 1)
if len(args) == 2:
if string.lower(args[0]) == 'sysop':
self.sysop = args[1]
if string.lower(args[0]) == 'aka':
self.aka.parse(args[1])
elif string.lower(args[0]) == 'baud':
self.baud = args[1]
elif string.lower(args[0]) == 'requestlist':
self.requestlist = args[1]
elif string.lower(args[0]) == 'responselist':
self.responselist = args[1]
elif string.lower(args[0]) == 'remotestatus':
self.remotestatus = args[1]
elif string.lower(args[0]) == 'systemstatus':
self.systemstatus = args[1]
elif string.lower(args[0]) == 'site':
self.site = args[1]
elif string.lower(args[0]) == 'callerid':
self.callerid = args[1]
elif string.lower(args[0]) == 'password':
self.password = args[1]
else:
print "skipping keyword", args[0], "in SRIF"
line = fp.readline()
fp.close()
def __init__(self, name):
self.sysop = ''
self.aka = ufido.address()
self.baud = 0
self.requestlist = ''
self.responselist = ''
self.remotestatus = ''
self.systemstatus = ''
self.site = ''
self.callerid = ''
self.password = ''
self.read(name)
def remote_addr(self):
return self.aka
def isprotected(self):
if string.lower(self.remotestatus) == 'protected':
return 1
return 0
def islisted(self):
if string.lower(self.systemstatus) == 'listed':
return 1
return 0
def append_new_file(fileslist, file):
TotalFiles = TotalFiles + 1
TotalSize = TotalSize + file.size
fileslist.append(file.fullname)
##############################
# The main program starts here
# Global variables
yield_list = []
if len(sys.argv) <> 2:
print 'usage: u-srif <srif file name>'
sys.exit(1)
# Read configuration
conf = uconfig.Config(USRIF_CONFIG)
# Read SRIF files
srif = srif_file(sys.argv[1])
# Read node's statistic
nodestat = unodestat.nodestat(conf.stat_dbase, srif.aka)
nodestat.get_stat()
# Lookup requested files in the our database
FBase = udbase.filebase(conf.spool_dir)
FBase.open('r')
yield = FBase.get_all(srif.read_req_list())
FBase.close()
# Prepare found files for sending
for file in yield:
if not file.fake:
file.stat()
nodestat.upd_stat(1, file.size)
yield_list.append(file.fullname)
# Store node's statistic
nodestat.put_stat()
# Send FREQ report?
if conf.send_report:
# Prepare templates object
tmpl = utmpl.template()
tmpl.set(srif=srif, conf=conf, nodestat=nodestat)
# Setup report object
report = freq_report()
report.newmsg(conf.local_address, conf.report_from, \
srif.aka, srif.sysop, conf.report_subj)
report.append_line('')
# Append header
tmpl.readfile(conf.report_header)
text = tmpl.process()
if text:
report.append_text(text)
# Append per files statistic
for file in yield:
report.add_file(file.name, file.size, file.desc)
# Append footer
tmpl.readfile(conf.report_footer)
text = tmpl.process()
if text:
report.append_text(text)
# Add empty line to the report
report.append_line('')
# Create netmail packet with the FREQ report
pktname = '/var/tmp/12345678.pkt' # XXX
report.write_packet(pktname)
# Add packet file to the response files list
yield_list.append(pktname)
# Dump reponse list
srif.write_resp_list(yield_list)
sys.exit(0)