private static int VerifyOutputArgsRun(CLIAnalyzeCmdOptions options) { Logger logger = Utils.SetupLogging(options, true); WriteOnce.Log = logger; options.Log = logger; //analyze with html format limit checks if (options.OutputFileFormat == "html") { options.OutputFilePath = options.OutputFilePath ?? "output.html"; string extensionCheck = Path.GetExtension(options.OutputFilePath); if (extensionCheck != ".html" && extensionCheck != ".htm") { WriteOnce.Info(MsgHelp.GetString(MsgHelp.ID.ANALYZE_HTML_EXTENSION)); } if (options.AllowDupTags) //fix #183; duplicates results for html format is not supported which causes filedialog issues { WriteOnce.Error(MsgHelp.GetString(MsgHelp.ID.ANALYZE_NODUPLICATES_HTML_FORMAT)); throw new OpException(MsgHelp.GetString(MsgHelp.ID.ANALYZE_NODUPLICATES_HTML_FORMAT)); } if (options.SimpleTagsOnly) //won't work for html that expects full data for UI { WriteOnce.Error(MsgHelp.GetString(MsgHelp.ID.ANALYZE_SIMPLETAGS_HTML_FORMAT)); throw new Exception(MsgHelp.GetString(MsgHelp.ID.ANALYZE_SIMPLETAGS_HTML_FORMAT)); } } CommonOutputChecks((CLICommandOptions)options); return(RunAnalyzeCommand(options)); }
public static CommandResultsWriter GetExportWriter(CLIExportTagsCmdOptions options) { CommandResultsWriter?writer; switch (options.OutputFileFormat.ToLower()) { case "_dummy": writer = new ExportDummyWriter(); break; case "json": writer = new JsonWriter(); break; case "text": writer = new ExportTextWriter(); break; default: WriteOnce.Error(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_ARG_VALUE, "-f")); throw new OpException((MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_ARG_VALUE, "-f"))); } //assign the stream as a file or console writer.OutputFileName = options.OutputFilePath; writer.TextWriter = GetTextWriter(writer.OutputFileName); return(writer); }
private static int VerifyOutputArgsRun(CLIPackRulesCmdOptions options) { Logger logger = Utils.SetupLogging(options, true); WriteOnce.Log = logger; options.Log = logger; if (options.RepackDefaultRules && !string.IsNullOrEmpty(options.OutputFilePath)) { WriteOnce.Info("output file argument ignored for -d option"); } options.OutputFilePath = options.RepackDefaultRules ? Utils.GetPath(Utils.AppPath.defaultRulesPackedFile) : options.OutputFilePath; if (string.IsNullOrEmpty(options.OutputFilePath)) { WriteOnce.Error(MsgHelp.GetString(MsgHelp.ID.PACK_MISSING_OUTPUT_ARG)); throw new OpException(MsgHelp.GetString(MsgHelp.ID.PACK_MISSING_OUTPUT_ARG)); } else { CommonOutputChecks(options); } return(RunPackRulesCommand(options)); }
/// <summary> /// Only AnalyzeResultsWriter supports an html option /// </summary> /// <param name="options"></param> /// <returns></returns> private static CommandResultsWriter GetAnalyzeWriter(CLIAnalyzeCmdOptions options) { CommandResultsWriter?writer; switch (options.OutputFileFormat.ToLower()) { case "json": writer = new AnalyzeJsonWriter(); break; case "text": writer = new AnalyzeTextWriter(options.TextOutputFormat); break; case "html": writer = new AnalyzeHtmlWriter(); break; case "sarif": writer = new AnalyzeSarifWriter(); break; default: WriteOnce.Error(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_ARG_VALUE, "-f")); throw new OpException((MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_ARG_VALUE, "-f"))); } //assign the stream as a file or console writer.OutputFileName = options.OutputFilePath; writer.TextWriter = GetTextWriter(writer.OutputFileName); return(writer); }
private static int VerifyOutputArgsRun(CLIAnalyzeCmdOptions options) { Logger logger = Utils.SetupLogging(options, true); WriteOnce.Log = logger; options.Log = logger; //analyze with html format limit checks if (options.OutputFileFormat == "html") { if (!string.IsNullOrEmpty(options.OutputFilePath)) //dependent local files won't be there; TODO look into dir copy to target! { WriteOnce.Info("-o output file argument ignored for html format"); } options.OutputFilePath = "output.html"; if (options.AllowDupTags) //fix #183; duplicates results for html format is not supported which causes filedialog issues { WriteOnce.Error(MsgHelp.GetString(MsgHelp.ID.ANALYZE_NODUPLICATES_HTML_FORMAT)); throw new OpException(MsgHelp.GetString(MsgHelp.ID.ANALYZE_NODUPLICATES_HTML_FORMAT)); } if (options.SimpleTagsOnly) //won't work for html that expects full data for UI { WriteOnce.Error(MsgHelp.GetString(MsgHelp.ID.ANALYZE_SIMPLETAGS_HTML_FORMAT)); throw new Exception(MsgHelp.GetString(MsgHelp.ID.ANALYZE_SIMPLETAGS_HTML_FORMAT)); } } CommonOutputChecks((CLICommandOptions)options); return(RunAnalyzeCommand(options)); }
/// <summary> /// Checks that either output filepath is valid or console verbosity is not visible to ensure /// some output can be achieved...other command specific inputs that are relevant to both CLI /// and NuGet callers are checked by the commands themselves /// </summary> /// <param name="options"></param> private static void CommonOutputChecks(CLICommandOptions options) { //validate requested format string fileFormatArg = options.OutputFileFormat; string[] validFormats = { "html", "text", "json", "sarif" }; string[] checkFormats; if (options is CLIAnalyzeCmdOptions cliAnalyzeOptions) { checkFormats = validFormats; fileFormatArg = cliAnalyzeOptions.OutputFileFormat; } else if (options is CLIPackRulesCmdOptions cliPackRulesOptions) { checkFormats = validFormats.Skip(2).Take(1).ToArray(); fileFormatArg = cliPackRulesOptions.OutputFileFormat; } else { checkFormats = validFormats.Skip(1).Take(2).ToArray(); } bool isValidFormat = checkFormats.Any(v => v.Equals(fileFormatArg.ToLower())); if (!isValidFormat) { WriteOnce.Error(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_ARG_VALUE, "-f")); throw new OpException(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_ARG_VALUE, "-f")); } //validate output is not empty if no file output specified if (string.IsNullOrEmpty(options.OutputFilePath)) { if (string.Equals(options.ConsoleVerbosityLevel, "none", StringComparison.OrdinalIgnoreCase)) { WriteOnce.Error(MsgHelp.GetString(MsgHelp.ID.CMD_NO_OUTPUT)); throw new Exception(MsgHelp.GetString(MsgHelp.ID.CMD_NO_OUTPUT)); } else if (string.Equals(options.ConsoleVerbosityLevel, "low", StringComparison.OrdinalIgnoreCase)) { WriteOnce.SafeLog("Verbosity set low. Detailed output limited.", NLog.LogLevel.Info); } } else { ValidFileWritePath(options.OutputFilePath); } }
/// <summary> /// Ensure output file path can be written to /// </summary> /// <param name="filePath"></param> private static void ValidFileWritePath(string filePath) { try { File.WriteAllText(filePath, "");//verify ability to write to location } catch (Exception) { WriteOnce.Error(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_FILE_OR_DIR, filePath)); throw new OpException(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_FILE_OR_DIR, filePath)); } }
/// <summary> /// CLI program entry point which defines command verbs and options to running /// </summary> /// <param name="args"></param> static int Main(string[] args) { int finalResult = -1; WriteOnce.Verbosity = WriteOnce.ConsoleVerbosity.Medium; try { WriteOnce.Info(Utils.GetVersionString()); var argsResult = Parser.Default.ParseArguments <AnalyzeCommandOptions, TagDiffCommandOptions, TagTestCommandOptions, ExportTagsCommandOptions, VerifyRulesCommandOptions, PackRulesCommandOptions>(args) .MapResult( (AnalyzeCommandOptions opts) => RunAnalyzeCommand(opts), (TagDiffCommandOptions opts) => RunTagDiffCommand(opts), (TagTestCommandOptions opts) => RunTagTestCommand(opts), (ExportTagsCommandOptions opts) => RunExportTagsCommand(opts), (VerifyRulesCommandOptions opts) => RunVerifyRulesCommand(opts), (PackRulesCommandOptions opts) => RunPackRulesCommand(opts), errs => 1 ); finalResult = argsResult; } catch (OpException e) { if (Logger != null) { WriteOnce.Error(ErrMsg.FormatString(ErrMsg.ID.RUNTIME_ERROR_NAMED, e.Message)); Logger.Error($"Runtime error: {e.StackTrace}"); } else { WriteOnce.Error(ErrMsg.FormatString(ErrMsg.ID.RUNTIME_ERROR_PRELOG, e.Message)); } } catch (Exception e) { if (Logger != null) { WriteOnce.Error(ErrMsg.FormatString(ErrMsg.ID.RUNTIME_ERROR_UNNAMED)); Logger.Error($"Runtime error: {e.Message} {e.StackTrace}"); } else { WriteOnce.Error(ErrMsg.FormatString(ErrMsg.ID.RUNTIME_ERROR_PRELOG, e.Message)); } } return(finalResult); }
private static TextWriter GetTextWriter(string?outputFileName) { TextWriter textWriter; if (String.IsNullOrEmpty(outputFileName)) { textWriter = Console.Out; } else { try { textWriter = File.CreateText(outputFileName); } catch (Exception e) { WriteOnce.Error(MsgHelp.FormatString(MsgHelp.ID.CMD_INVALID_FILE_OR_DIR, outputFileName)); throw new OpException(e.Message); } } return(textWriter); }