コード例 #1
0
    private static void ShowThreads(OpenDirectoryIndexer openDirectoryIndexer)
    {
        Console.WriteLine($"Running threads:");

        lock (openDirectoryIndexer.WebDirectoryProcessorInfoLock)
        {
            foreach (KeyValuePair <string, WebDirectory> webDirectory in openDirectoryIndexer.WebDirectoryProcessorInfo.OrderBy(i => i.Key))
            {
                Console.WriteLine($"[{webDirectory.Key}] {Library.FormatWithThousands((DateTimeOffset.UtcNow - webDirectory.Value.StartTime).TotalMilliseconds)}ms | {webDirectory.Value.Url}");
            }
        }
    }
コード例 #2
0
    private static void SaveSession(OpenDirectoryIndexer openDirectoryIndexer)
    {
        try
        {
            string jsonPath = Library.GetOutputFullPath(OpenDirectoryIndexer.Session, openDirectoryIndexer.OpenDirectoryIndexerSettings, "json");

            Logger.Info("Saving session to JSON..");
            Console.WriteLine("Saving session to JSON..");

            Library.SaveSessionJson(OpenDirectoryIndexer.Session, jsonPath);

            Logger.Info($"Saved session to JSON: {jsonPath}");
            Console.WriteLine($"Saved session to JSON: {jsonPath}");
        }
        catch (Exception ex)
        {
            Logger.Error(ex);
        }
    }
コード例 #3
0
    private static void SaveSessionText(OpenDirectoryIndexer openDirectoryIndexer)
    {
        try
        {
            Logger.Info("Saving URL list to file..");
            Console.WriteLine("Saving URL list to file..");

            IEnumerable <string> distinctUrls = OpenDirectoryIndexer.Session.Root.AllFileUrls.Distinct();

            string urlsPath = Library.GetOutputFullPath(OpenDirectoryIndexer.Session, openDirectoryIndexer.OpenDirectoryIndexerSettings, "txt");
            File.WriteAllLines(urlsPath, distinctUrls);

            Logger.Info($"Saved URL list to file: {urlsPath}");
            Console.WriteLine($"Saved URL list to file: {urlsPath}");
        }
        catch (Exception ex)
        {
            Logger.Error(ex);
        }
    }
コード例 #4
0
    static async Task <int> Main(string[] args)
    {
        SetConsoleTitle("OpenDirectoryDownloader");

        Console.OutputEncoding = Encoding.UTF8;

        Stream nlogConfigFile = Library.GetEmbeddedResourceStream(Assembly.GetEntryAssembly(), "NLog.config");

        if (nlogConfigFile != null)
        {
            XmlReader xmlReader = XmlReader.Create(nlogConfigFile);
            LogManager.Configuration = new XmlLoggingConfiguration(xmlReader, null);
        }

        Process currentProcess = Process.GetCurrentProcess();

        Console.WriteLine($"Started with PID {currentProcess.Id}");
        Logger.Info($"Started with PID {currentProcess.Id}");

        Thread.CurrentThread.Name = "Main thread";

        bool stopProcessing = false;

        Parser parser = new Parser(with =>
        {
            with.AllowMultiInstance = true;
            with.HelpWriter         = Console.Error;
        });

        parser.ParseArguments <CommandLineOptions>(args)
        .WithNotParsed(o =>
        {
            List <Error> errors = o.ToList();

            stopProcessing = errors.Any(e => e.StopsProcessing);

            if (errors.Any(e => e.Tag == ErrorType.HelpRequestedError || e.Tag == ErrorType.VersionRequestedError))
            {
                return;
            }

            foreach (Error error in errors)
            {
                Console.WriteLine($"Error command line parameter '{error.Tag}'");
            }
        })
        .WithParsed(o => CommandLineOptions = o);

        if (stopProcessing)
        {
            return(1);
        }

        if (CommandLineOptions.Threads < 1 || CommandLineOptions.Threads > 100)
        {
            Console.WriteLine("Threads must be between 1 and 100");
            return(1);
        }

        string url = CommandLineOptions.Url;

        if (string.IsNullOrWhiteSpace(url))
        {
            Console.WriteLine("Which URL do you want to index?");
            url = Console.ReadLine();
        }

        // Wait until this ticket is closed: https://github.com/dotnet/corefx/pull/37050
        //AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);

        OpenDirectoryIndexerSettings openDirectoryIndexerSettings = new OpenDirectoryIndexerSettings
        {
            CommandLineOptions = CommandLineOptions
        };

        if (File.Exists(url))
        {
            openDirectoryIndexerSettings.FileName = url;
        }
        else
        {
            Console.WriteLine($"URL specified: {url}");

            string newUrl = Library.FixUrl(url);

            if (newUrl != url)
            {
                Console.WriteLine($"URL fixed    : {newUrl}");
            }

            openDirectoryIndexerSettings.Url = newUrl;
        }

        openDirectoryIndexerSettings.Threads  = openDirectoryIndexerSettings.CommandLineOptions.Threads;
        openDirectoryIndexerSettings.Timeout  = openDirectoryIndexerSettings.CommandLineOptions.Timeout;
        openDirectoryIndexerSettings.Username = openDirectoryIndexerSettings.CommandLineOptions.Username;
        openDirectoryIndexerSettings.Password = openDirectoryIndexerSettings.CommandLineOptions.Password;

        if (string.IsNullOrEmpty(openDirectoryIndexerSettings.Username) && string.IsNullOrEmpty(openDirectoryIndexerSettings.Password))
        {
            if (Library.GetUriCredentials(new Uri(url), out string username, out string password))
            {
                Console.WriteLine($"Using username '{username}' and password '{password}'");
                openDirectoryIndexerSettings.Username = username;
                openDirectoryIndexerSettings.Password = password;
            }
        }

        // FTP
        if (openDirectoryIndexerSettings.Url?.StartsWith(Constants.UriScheme.Ftp) == true || openDirectoryIndexerSettings.Url?.StartsWith(Constants.UriScheme.Ftps) == true)
        {
            openDirectoryIndexerSettings.Threads = 6;
        }

        // Translates . and .. etc
        if (openDirectoryIndexerSettings.CommandLineOptions.OutputFile is not null)
        {
            openDirectoryIndexerSettings.CommandLineOptions.OutputFile = Path.GetFullPath(openDirectoryIndexerSettings.CommandLineOptions.OutputFile);
        }

        OpenDirectoryIndexer openDirectoryIndexer = new OpenDirectoryIndexer(openDirectoryIndexerSettings);

        SetConsoleTitle($"{new Uri(openDirectoryIndexerSettings.Url).Host.Replace("www.", string.Empty)} - {ConsoleTitle}");

        openDirectoryIndexer.StartIndexingAsync();
        Console.WriteLine("Started indexing!");

        Command.ShowInfoAndCommands();
        Command.ProcessConsoleInput(openDirectoryIndexer);

        await openDirectoryIndexer.IndexingTask;

        if (!CommandLineOptions.Quit)
        {
            Console.WriteLine("Press ESC to exit");
            Console.ReadKey();
        }

        return(0);
    }
コード例 #5
0
    internal static void ProcessConsoleInput(OpenDirectoryIndexer openDirectoryIndexer)
    {
        if (Console.IsInputRedirected)
        {
            string message = "Console input is redirect, maybe it is run inside another host. This could mean that no input will be send/processed.";
            Console.WriteLine(message);
            Logger.Warn(message);
        }

        while (true)
        {
            try
            {
                if (Console.IsInputRedirected)
                {
                    int keyPressed = Console.Read();

                    if (keyPressed == -1)
                    {
                        // Needed, when input is redirected it will immediately return with -1
                        Task.Delay(10).Wait();
                    }

                    //if (char.IsControl((char)keyPressed))
                    //{
                    //    Console.WriteLine($"Pressed Console.Read(): {keyPressed}");
                    //}
                    //else
                    //{
                    //    Console.WriteLine($"Pressed Console.Read(): {(char)keyPressed}");
                    //}

                    switch (keyPressed)
                    {
                    case 'x':
                    case 'X':
                        KillApplication();
                        break;

                    case 'i':
                        ShowInfoAndCommands();
                        break;

                    case 'c':
                        if (OpenDirectoryIndexer.Session.Finished != DateTimeOffset.MinValue)
                        {
                            SetClipboard(Statistics.GetSessionStats(OpenDirectoryIndexer.Session, includeExtensions: true, onlyRedditStats: true));
                            KillApplication();
                        }
                        break;

                    case 's':
                    case 'S':
                        ShowStatistics(openDirectoryIndexer);
                        break;

                    case 't':
                    case 'T':
                        ShowThreads(openDirectoryIndexer);
                        break;

                    case 'j':
                    case 'J':
                        SaveSession(openDirectoryIndexer);
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    if (!Console.KeyAvailable)
                    {
                        Task.Delay(10).Wait();
                        continue;
                    }

                    ConsoleKey keyPressed = Console.ReadKey(intercept: true).Key;
                    //Console.WriteLine($"Pressed (Console.ReadKey(): {keyPressed}");

                    switch (keyPressed)
                    {
                    case ConsoleKey.X:
                    case ConsoleKey.Escape:
                        KillApplication();
                        break;

                    case ConsoleKey.I:
                        ShowInfoAndCommands();
                        break;

                    case ConsoleKey.C:
                        if (OpenDirectoryIndexer.Session.Finished != DateTimeOffset.MinValue)
                        {
                            try
                            {
                                SetClipboard(Statistics.GetSessionStats(OpenDirectoryIndexer.Session, includeExtensions: true, onlyRedditStats: true));
                            }
                            catch (Exception ex)
                            {
                                Logger.Error($"Error copying stats to clipboard: {ex.Message}");
                            }

                            KillApplication();
                        }
                        break;

                    case ConsoleKey.S:
                        ShowStatistics(openDirectoryIndexer);
                        break;

                    case ConsoleKey.T:
                        ShowThreads(openDirectoryIndexer);
                        break;

                    case ConsoleKey.J:
                        SaveSession(openDirectoryIndexer);
                        break;

                    case ConsoleKey.U:
                        SaveSessionText(openDirectoryIndexer);
                        break;

                    default:
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error processing action");
                throw;
            }
        }
    }
コード例 #6
0
 private static void ShowStatistics(OpenDirectoryIndexer openDirectoryIndexer)
 {
     Console.WriteLine(Statistics.GetSessionStats(OpenDirectoryIndexer.Session, includeExtensions: true));
     Console.WriteLine($"Queue: {Library.FormatWithThousands(openDirectoryIndexer.WebDirectoriesQueue.Count)} ({openDirectoryIndexer.RunningWebDirectoryThreads} threads), Queue (filesizes): {Library.FormatWithThousands(openDirectoryIndexer.WebFilesFileSizeQueue.Count)} ({openDirectoryIndexer.RunningWebFileFileSizeThreads} threads)");
 }