| 
#!/usr/bin/php<?php
 /**
 * Luminova Framework
 * The Luminova Framework offers high-performance HMVC (Hierarchical Model-View-Controller)
 * and MVC (Model-View-Controller) architectures designed for robust web applications.
 *
 * It combines the strengths of both architectures to enhance modularity, maintainability,
 * and scalability, enabling developers to build efficient and dynamic web solutions.
 *
 * @package Luminova
 * @author Ujah Chigozie Peter
 * @copyright (c) Nanoblock Technology Ltd
 * @license See LICENSE file
 * @link http://luminova.ng
 */
 require_once __DIR__ . '/vendor/autoload.php';
 
 use \Peterujah\BrokenLinks\Scanner;
 /**
 * CLI Script to scan for broken links on a website.
 * Usage: php broken --url="https://luminova.ng/" --host="luminova.ng" [--timeout=10] [--path="/path/to/save"] [--output=1] [--limit=0]
 */
 
 // Parse CLI options
 $options = getopt("", [
 "url:",     // Mandatory start URL (e.g. "http://luminova.ng/docs/" or "http://luminova.ng/")
 "host:",       //  Mandatory host name (e.g, "luminova.ng")
 "path::",     // Optional path to save scans
 "output::",   // Optional output flag to print broken links (1 or 0)
 "timeout::",  // Optional timeout in seconds
 "limit::"     // Optional maximin number of scans
 ]);
 
 // Check if a URL is provided
 if (empty($options['url']) || empty($options['host'])) {
 echo "Usage: php broken --url=\"https://luminova.ng/page\" [--host=\"luminova.ng\"] [--timeout=10] [--path=\"/path/to/save\"] [--output=1]\n";
 exit(1);
 }
 
 // Extract values from options
 $url   = $options['url'];
 $host    = $options['host'] ?? '';
 $timeout    = isset($options['timeout']) ? (int) $options['timeout'] : 0;
 $limit      = isset($options['limit']) ? (int) $options['limit'] : 0;
 $path       = $options['path'] ?? __DIR__ . '/scanner/logs/';
 $output     = (isset($options['output']) && $options['output'] == 1);
 
 if (!is_dir($path) && !mkdir($path, 0755, true)) {
 echo "Error: Unable to create or access path: $path\n";
 exit(1);
 }
 
 // Create an instance of the BrokenLinks class
 $scanner = new Scanner($url, $host, $limit);
 $scanner->setPath($path);
 $scanner->cli(true);
 
 // Start the scan process
 
 
 // Wait for the process to complete or until timeout
 // Output results if requested
 if($timeout > 0){
 try {
 echo "Waiting for the scan to complete...\n";
 $scanner->wait($timeout, function(Scanner $scanner) use($output){
 if ($output) {
 echo "\nBroken Links Found:\n";
 print_r($scanner->getBrokenLinks());
 }
 exit(1);
 });
 } catch (RuntimeException $e) {
 echo "Error: " . $e->getMessage() . "\n";
 exit(1);
 }
 }else{
 $scanner->start();
 if($output){
 echo "\nBroken Links Found:\n";
 print_r($scanner->getBrokenLinks());
 }
 }
 
 exit(0);
 
 |