"use strict"; var cmn=require("../$common.js"), persist=require("node-persist"), crypto=require("crypto"), http=require("http"), https=require("https"), fs=require("fs"), URL=require("url"), child_process=require("child_process"); var moddir=null; persist=persist.create({ dir:cmn.persistdir+"/changes", continuous:false, interval:false }); persist.initSync(); //urls: map(url => URLobject) //url: String //URLobject: {url, timeline: [[Date, hash, contents]]} var urls=persist.getItemSync("urls"); if(!urls){ urls={}; persist.setItemSync("urls",urls); } else { (function(){ var url,i; for(url in urls){ for(i=0;i"); nwaiting++; fetch("GET",url,function(url,status,body){ nwaiting--; console.log("Got <"+url+">; status = "+status+(status==-1?" ("+body+")":"")); var dosave=true; if(status==-1){ hashes[url]=[new Date(),null,null]; if(url=="https://futhark-lang.org/atom.xml"|| url=="https://sigkill.dk/atom.xml"){ console.log("TROELS IS WEER BEZIG"); dosave=false; } } else { var hash=crypto.createHash("sha256"); hash.update(body); var res=hash.digest("hex"); hashes[url]=[new Date(),res,body]; if(url=="http://www.rolandvdv.nl/M17/"&& res=="6c09a3f77e8a1ce36ffdf1bf0cff8aa9bb5c17616ba8f31db31d8b5946245362"){ console.log("ROLAND IS WEER BEZIG"); dosave=false; } } if(dosave){ if(!urls[url]){ console.log("WARNING: url <"+url+"> from hashes not found in urls!"); } else { //var last=urls[url].timeline[urls[url].timeline.length-1]; //if(last==undefined||hashes[url][1]==null||hashes[url][1]!=last[1]){ urls[url].timeline.push(hashes[url]); //} } } if(nwaiting==0&&cb)process.nextTick(cb); if(refresh_persist_timeout!=null)clearTimeout(refresh_persist_timeout); refresh_persist_timeout=setTimeout(function(){ persist.setItemSync("urls",urls); console.log("(persisted after refresh)") refresh_persist_timeout=null; },2000); }.bind(null,url)); } } function collectLastHashes(){ var lasthashes={}; var idx; for(var url in urls){ if(urls[url].timeline.length==0){ lasthashes[url]=null; } else { idx=urls[url].timeline.length-1; lasthashes[url]={ hash: urls[url].timeline[idx][1], date: urls[url].timeline[idx][0] }; } } return lasthashes; } function sendMail(tomails,body,cb){ if(typeof tomails=="string")tomails=[tomails]; else if(!Array.isArray(tomails)){ throw new Error("tomails argument in sendMail not an array!"); } var i; console.log("Mail to send: "+JSON.stringify(body)); var proccounter=0; function decProcCounter(){ proccounter--; if(proccounter==0){ cb(); } } var proc; for(i=0;i started"); proc.stdin.on("error",function(e){ console.log(e); cb(e); }); proc.stdin.write("To: "+tomails[i]+"\n"+body,function(proc,mailtarget){ console.log("sendmail process for <"+mailtarget+"> write completed"); proc.stdin.end(); }.bind(this,proc,tomails[i])); proc.on("exit",function(mailtarget,code,signal){ console.log("sendmail process for <"+mailtarget+"> exited with code "+code); decProcCounter(); }.bind(this,tomails[i])); //process will linger till it's finished } } function constructMailBody(diffs){ var body="From: changes \n"+ "Subject: changes notification mail\n\n"+ "The changes module recorded some changes in watched webpages.\n"+ "The URLs and their old and new content hashes are shown below.\n\n"; var i; for(i=0;i