const https = require('https'); const fs = require('fs'); const path = require('path'); const os = require('os'); const homeDir = os.homedir(); const { parseKBDCIP, parseZones } = require('./parse'); process.env.PUPPETEER_EXECUTABLE_PATH="/usr/bin/chromium-browser" const pup = require('puppeteer'); //Function to retry a download in case of failure async function retry(cb, count){ try{ return await cb(); }catch(e){ if(count<=0){ console.error("[-]Download failed after 3 attempts. Returning..."); throw e; } // page.pdf({path: path.join(__dirname, 'PupError.pdf')}); console.log("[-]Download failed with error: ", e); console.log("[~]Retrying download. "+count+" attempts remaining..."); return await retry(cb, count-1); } } //General helper function to download a PDF file from a URL async function downloadPdf(pdfUrl, filename, test=false) { const fn = path.join(__dirname,filename); return new Promise((resolve, reject)=>{ https.get(pdfUrl, (response)=>{ if(!test){ console.log("[+]Downloading PDF from " + pdfUrl + " to " + fn + "..."); } const file = fs.createWriteStream(fn); response.pipe(file); console.log("RESPONSE: ",response.statusCode, response.statusMessage) file.on('finish', ()=>{ file.close(); resolve("Downloaded PDF successfully.") if(test){ //If this was a test case, delete the downloaded file fs.unlink(fn, (err)=>{ if(err){ console.error("[-]Error deleting test PDF: ", err); } }) } }) }).on('error', (err)=>{ fs.unlink(filename, ()=>{ reject("Error downloading PDF: ", err) }); }) }) } //Download the KPD CIP PDF async function downloadKPDCIP(fireDate, test=false, check=true){ let url = "https://knoxville.sharepoint.com/:b:/s/KnoxvillePublicShare/ESbv9pzfdNdEkhttuTX4-cYBkp3Z9gm9IKxRF_4chfjBVg?e=d0c3DZ" // console.log("Puppet browser launched."); retry(async ()=>{ const browser = await pup.launch({headless: true, args:['--no-sandbox', '--disable-gpu']}); const page = await browser.newPage(); await page.goto(url, {waitUntil: 'domcontentloaded', timeout:60000}); // console.log("Page loaded."); // page.pdf({path: path.join(__dirname, 'PupSS.pdf')}); await page.waitForSelector('button#downloadCommand'); const downloadButton = await page.$('button#downloadCommand'); if(downloadButton){ await downloadButton.click(); // console.log("Download Button clicked."); }else{ console.error("[-]Download button not found."); } //Waits 3 seconds for download to complete await new Promise(resolve => setTimeout(resolve, 3000)); await browser.close(); }, 3).then(()=>{ const dpath = path.join(__dirname, 'KPDCIP.pdf'); try{ // let p = '/home/githubActions/Downloads'; let p = path.join(homeDir, 'Downloads'); fs.renameSync(path.join(p, 'MediaRpt.pdf'), dpath); }catch(e){ console.error("[-]Error renaming 'downloaded' CIP PDF: ", e); return -1; } console.log("[+]Downloaded PDF successfully."); if (test) { // //If this was a test case, delete the downloaded file // fs.unlink(path.join(__dirname, "KPDCIP.pdf"), (err) => { // if (err) { // console.error("[-]Error deleting test PDF: ", err); // } // }); parseKBDCIP(fireDate, check, true) return; } parseKBDCIP(fireDate); }).catch(e=>{ console.error("[-]KPD CIP download failed. Final error: ", e); return -1; }) } //Download the KCSO Zone PDFs async function downloadKCSOZones(fireDate, test=false){ await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(100).pdf", "zone100.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(101).pdf", "zone101.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(102).pdf", "zone102.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(104).pdf", "zone104.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(200).pdf", "zone200.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(201).pdf", "zone201.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(202).pdf", "zone202.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(300).pdf", "zone300.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(302).pdf", "zone302.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(400).pdf", "zone400.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(401).pdf", "zone401.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(402).pdf", "zone402.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(403).pdf", "zone403.pdf", test); await downloadPdf("https://knoxsheriff.org/wp-content/zoneactivity/Zone%20History%20(404).pdf", "zone404.pdf", test); return new Promise((resolve, reject)=>{ try{ if(!test){ parseZones(fireDate); resolve("Downloaded and parsed KCSO Zones successfully.") }else{ resolve("Connection to KCSO Zones successful.") } }catch(e){ reject(e); } }) } //Download the UTPD Clery PDF async function downloadClery(fireDate){ await downloadPdf("https://safety.utk.edu/police/wp-content/uploads/sites/2/2021/03/60-Day-Log.pdf", "clery.pdf") } module.exports = { downloadKPDCIP, downloadKCSOZones, downloadClery, downloadPdf };