def oblive(db, address): robot = ftnconfig.robotnames[address[0]] addr_id = ftnconfig.get_taddr_id(db, address) if addr_id is None: raise Exception("not found") msg_from = db.prepare("select count (*) from messages where source=$1").first(addr_id) msg_to = db.prepare("select count (*) from messages where destination=$1").first(addr_id) print (address, addr_id, "from:", msg_from, "to:", msg_to) if msg_from!=0 or msg_to!=0: print("messages exist") return # assert( input("enter 'yes' to confirm: ")=="yes" ) with ftnimport.session(db) as sess: for (link_addr,subs_id) in db.prepare("select a.text, s.id from addresses a, subscriptions s where a.id=s.subscriber and s.target=$1")(addr_id): print ("unsubscribing",link_addr) link_id = ftnconfig.find_link(db, link_addr) my_id, pw=ftnaccess.link_password(db, link_id, forrobots=True) sess.send_message(ftnconfig.get_taddr(db, my_id), ftnconfig.SYSOP, ("node", link_addr), robot, None, pw, "-"+address[1], sendmode="direct") db.prepare("delete from subscriptions where id=$1")(subs_id) sess.send_message(("node", ftnconfig.ADDRESS), ftnconfig.SYSOP, ("echo", "FLUID.LOCAL"), "All", None, "removal", address[0]+" "+address[1]+" removed from node") db.prepare("delete from deletedvitalsubscriptionwatermarks where target=$1")(addr_id) db.prepare("delete from addresses where id=$1")(addr_id)
def do(self): to_poll = set() for d in self.dests: to_poll.update( map(lambda x: x[0], ftnexport.get_subscribers(self.db, d))) self.dests = set() myzone = ftn.addr.str2addr(ftnconfig.ADDRESS)[0] #print (myzone) for a in to_poll: #print("poll", a) a = ftnconfig.get_addr(self.db, a)[1] #print (a) link_id = ftnconfig.find_link(self.db, a) if ftnconfig.get_link_polling(self.db, link_id): print("poll", a) else: #print ("not needed") continue addr = ftn.addr.str2addr(a) if addr[0] == myzone: zonepath = ftnconfig.BINKLEYSTYLE else: zonepath = ftnconfig.BINKLEYSTYLE + ".%d" % addr[0] if addr[3] == 0: pollfilename = "%04x%04x.dlo" % (addr[1], addr[2]) basepath = zonepath else: pollfilename = "0000%04x.dlo" % addr[3] basepath = os.path.join(zonepath, "%04x%04x.pnt" % (addr[1], addr[2])) try: os.makedirs(basepath, exist_ok=True) except FileExistsError: pass except: print("could not create outbound directory") return try: touch = open(os.path.join(basepath, pollfilename), "a") touch.close() except: print("could not poll", a) traceback.print_exc()
def do(self): to_poll = set() for d in self.dests: to_poll.update(map(lambda x: x[0], ftnexport.get_subscribers(self.db,d))) self.dests=set() myzone=ftn.addr.str2addr(ftnconfig.ADDRESS)[0] #print (myzone) for a in to_poll: #print("poll", a) a=ftnconfig.get_addr(self.db, a)[1] #print (a) link_id=ftnconfig.find_link(self.db, a) if ftnconfig.get_link_polling(self.db, link_id): print ("poll",a) else: #print ("not needed") continue addr=ftn.addr.str2addr(a) if addr[0]==myzone: zonepath=ftnconfig.BINKLEYSTYLE else: zonepath=ftnconfig.BINKLEYSTYLE+".%d"%addr[0] if addr[3]==0: pollfilename="%04x%04x.dlo"%(addr[1], addr[2]) basepath=zonepath else: pollfilename="0000%04x.dlo"%addr[3] basepath=os.path.join(zonepath, "%04x%04x.pnt"%(addr[1], addr[2])) try: os.makedirs(basepath, exist_ok=True) except FileExistsError: pass except: print ("could not create outbound directory") return try: touch=open(os.path.join(basepath,pollfilename),"a") touch.close() except: print ("could not poll", a) traceback.print_exc()
def oblive(db, address): robot = ftnconfig.robotnames[address[0]] addr_id = ftnconfig.get_taddr_id(db, address) if addr_id is None: raise Exception("not found") msg_from = db.prepare( "select count (*) from messages where source=$1").first(addr_id) msg_to = db.prepare( "select count (*) from messages where destination=$1").first(addr_id) print(address, addr_id, "from:", msg_from, "to:", msg_to) if msg_from != 0 or msg_to != 0: print("messages exist") return # assert( input("enter 'yes' to confirm: ")=="yes" ) with ftnimport.session(db) as sess: for (link_addr, subs_id) in db.prepare( "select a.text, s.id from addresses a, subscriptions s where a.id=s.subscriber and s.target=$1" )(addr_id): print("unsubscribing", link_addr) link_id = ftnconfig.find_link(db, link_addr) my_id, pw = ftnaccess.link_password(db, link_id, forrobots=True) sess.send_message(ftnconfig.get_taddr(db, my_id), ftnconfig.SYSOP, ("node", link_addr), robot, None, pw, "-" + address[1], sendmode="direct") db.prepare("delete from subscriptions where id=$1")(subs_id) sess.send_message(("node", ftnconfig.ADDRESS), ftnconfig.SYSOP, ("echo", "FLUID.LOCAL"), "All", None, "removal", address[0] + " " + address[1] + " removed from node") db.prepare( "delete from deletedvitalsubscriptionwatermarks where target=$1")( addr_id) db.prepare("delete from addresses where id=$1")(addr_id)
for x in ftnexport.get_subscribers(db, aid) ]: print(node) sess.send_message( ftnconfig.SYSOP, ("node", node), "Sysop", None, "Area Expunging notification", """Dear Sysop, %s %s is about to be deleted from node %s. Please find new uplink for the area or expunge it too. """ % (domain, area, ftnconfig.ADDRESS)) sess.remove_subscription(domain, area, node) if node != ftnconfig.ADDRESS: for link_id in ftnconfig.find_link(node): my, pw = ftnaccess.link_password(db, link_id, True) # FIX choose sender address (=my) sess.send_message(ftnconfig.SYSOP, ("node", node), robot, None, pw, "-" + area) sess.forget_address(domain, area) exit() exit() # ??? outp = [] pw = ftnconfig.get_link_password(db, link, True)
#for k, v in hubs.items(): # print ("%-17s: "%k, ", ".join(v)) #print () #exit() downlinks = ftnexport.get_subnodes(db, ADDRESS) #print (downlinks) #exit() selfsubscribers = set() selfsubscribers.add(ADDRESS) selfsubscribers.add(ADDRESS+".999") # filter links that are not password-protected for x in list(links) + downlinks: if not find_link(db, x, netmail=True): print ("skip", x) else: selfsubscribers.add(x) #print ("direct links =", ", ".join(selfsubscribers)) # add subscription for self for l in selfsubscribers: hubs.setdefault(l, set()).add(l) #print ("subscriptions") #for k, v in hubs.items(): # print ("subscribe %s to"%k, ", ".join(v)) #print () #exit()
try: cmd = sys.argv[1] domain = sys.argv[2] area = sys.argv[3] subscriber = sys.argv[4] except: print("usage: ./util_subscription.py add|addvital|remove echo|fileecho AREANAME 2:5020/9999") exit() try: robot = ftnconfig.robotnames[domain] except: raise Exception("cannot manage subscriptions in domain", domain) link_id = ftnconfig.find_link(db, subscriber) my_id, pw = ftnaccess.link_password(db, link_id, forrobots=True) my_addr = ftnconfig.get_taddr(db, my_id) with ftnimport.session(db) as sess: if cmd == "add": try: sess.add_subscription(None, domain, area, subscriber) except FTNAlreadySubscribed: print ("local subscription exists") if subscriber != ftnconfig.ADDRESS: sess.send_message(my_addr, ftnconfig.SYSOP, ("node", subscriber), robot, None, pw, "+"+area, sendmode="direct") else: print ("local subscription") elif cmd == "remove":
cmd = sys.argv[1] domain = sys.argv[2] area = sys.argv[3] subscriber = sys.argv[4] except: print( "usage: ./util_subscription.py add|addvital|remove echo|fileecho AREANAME 2:5020/9999" ) exit() try: robot = ftnconfig.robotnames[domain] except: raise Exception("cannot manage subscriptions in domain", domain) link_id = ftnconfig.find_link(db, subscriber) my_id, pw = ftnaccess.link_password(db, link_id, forrobots=True) my_addr = ftnconfig.get_taddr(db, my_id) with ftnimport.session(db) as sess: if cmd == "add": try: sess.add_subscription(None, domain, area, subscriber) except FTNAlreadySubscribed: print("local subscription exists") if subscriber != ftnconfig.ADDRESS: sess.send_message(my_addr, ftnconfig.SYSOP, ("node", subscriber), robot, None, pw,
def get_link(lid): pass def set_link(lid, data): pass cmd = sys.argv[1] if cmd == "list": for lid, addr in db.prepare("select l.id, a.text from links l, addresses a where a.id=l.address"): print(lid, addr) elif cmd == "add": addr = sys.argv[2] lid = ftnconfig.find_link(db, addr) if lid is not None: print("already exists") exit() pasw = sys.argv[3] input("confirm add " + addr + " pw " + pasw) with ftnimport.session(db) as sess: sess.import_link_auth(myaddr, addr, pasw, pasw) # authentication = <FTNAUTH><ConnectPassword>pwd</ConnectPassword><RobotsPassword>pwd</RobotsPassword></FTNAUTH> # my = 160 (myaddr_id) # lastsent = time.time()
import ftnimport db=ftnconfig.connectdb() def get_link(lid): pass def set_link(lid, data): pass cmd=sys.argv[1] myaddr=ftnconfig.ADDRESS if cmd=="list": for lid, addr in db.prepare("select l.id, a.text from links l, addresses a where a.id=l.address"): print (lid, addr) elif cmd=="add": addr = sys.argv[2] lid = ftnconfig.find_link(db, addr) if lid is not None: print("already exists") exit() pasw = sys.argv[3] input("confirm add "+addr+" pw "+pasw) with ftnimport.session(db) as sess: sess.import_link_auth(myaddr, addr, pasw, pasw) #authentication = <FTNAUTH><ConnectPassword>pwd</ConnectPassword><RobotsPassword>pwd</RobotsPassword></FTNAUTH> # my = 160 (myaddr_id) # lastsent = time.time()
input("enter to purge, Ctrl-C to abort") for node in [ftnconfig.get_addr(db, x[0])[1] for x in ftnexport.get_subscribers(db, aid)]: print (node) sess.send_message(ftnconfig.SYSOP, ("node", node), "Sysop", None, "Area Expunging notification", """Dear Sysop, %s %s is about to be deleted from node %s. Please find new uplink for the area or expunge it too. """%(domain, area, ftnconfig.ADDRESS)) sess.remove_subscription(domain, area, node) if node != ftnconfig.ADDRESS: for link_id in ftnconfig.find_link(node): my, pw = ftnaccess.link_password(db, link_id, True) # FIX choose sender address (=my) sess.send_message(ftnconfig.SYSOP, ("node", node), robot, None, pw, "-"+area) sess.forget_address(domain, area) exit() exit()