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.
183 lines
4.3 KiB
Python
183 lines
4.3 KiB
Python
20 years ago
|
#!/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)
|
||
|
|