View Javadoc

    1   /*
    2    * This file is part of dependency-check-cli.
    3    *
    4    * Dependency-check-cli is free software: you can redistribute it and/or modify it
    5    * under the terms of the GNU General Public License as published by the Free
    6    * Software Foundation, either version 3 of the License, or (at your option) any
    7    * later version.
    8    *
    9    * Dependency-check-cli is distributed in the hope that it will be useful, but
    10   * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11   * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
    12   * details.
    13   *
    14   * You should have received a copy of the GNU General Public License along with
    15   * dependency-check-cli. If not, see http://www.gnu.org/licenses/.
    16   *
    17   * Copyright (c) 2012 Jeremy Long. All Rights Reserved.
    18   */
    19  package org.owasp.dependencycheck;
    20
    21  import java.io.File;
    22  import java.io.FileNotFoundException;
    23  import java.io.IOException;
    24  import java.io.InputStream;
    25  import java.util.List;
    26  import java.util.logging.Level;
    27  import java.util.logging.Logger;
    28  import org.apache.commons.cli.ParseException;
    29  import org.owasp.dependencycheck.reporting.ReportGenerator;
    30  import org.owasp.dependencycheck.dependency.Dependency;
    31  import org.owasp.dependencycheck.cli.CliParser;
    32  import org.owasp.dependencycheck.utils.LogUtils;
    33  import org.owasp.dependencycheck.utils.Settings;
    34
    35  /*
    36   * This file is part of App.
    37   *
    38   * App is free software: you can redistribute it and/or modify it under the
    39   * terms of the GNU General Public License as published by the Free Software
    40   * Foundation, either version 3 of the License, or (at your option) any later
    41   * version.
    42   *
    43   * App is distributed in the hope that it will be useful, but WITHOUT ANY
    44   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
    45   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    46   *
    47   * You should have received a copy of the GNU General Public License along with
    48   * App. If not, see http://www.gnu.org/licenses/.
    49   *
    50   * Copyright (c) 2012 Jeremy Long. All Rights Reserved.
    51   */
    52  /**
    53   * The command line interface for the DependencyCheck application.
    54   *
    55   * @author Jeremy Long (jeremy.long@owasp.org)
    56   */
    57  public class App {
    58
    59      /**
    60       * The location of the log properties configuration file.
    61       */
    62      private static final String LOG_PROPERTIES_FILE = "log.properties";
    63
    64      /**
    65       * The main method for the application.
    66       *
    67       * @param args the command line arguments
    68       */
    69      public static void main(String[] args) {
    70          final App app = new App();
    71          app.run(args);
    72      }
    73
    74      /**
    75       * Main CLI entry-point into the application.
    76       *
    77       * @param args the command line arguments
    78       */
    79      public void run(String[] args) {
    80
    81          final CliParser cli = new CliParser();
    82          try {
    83              cli.parse(args);
    84          } catch (FileNotFoundException ex) {
    85              System.err.println(ex.getMessage());
    86              cli.printHelp();
    87              return;
    88          } catch (ParseException ex) {
    89              System.err.println(ex.getMessage());
    90              cli.printHelp();
    91              return;
    92          }
    93
    94          final InputStream in = App.class.getClassLoader().getResourceAsStream(LOG_PROPERTIES_FILE);
    95          LogUtils.prepareLogger(in, cli.getVerboseLog());
    96
    97          if (cli.isGetVersion()) {
    98              cli.printVersionInfo();
    99          } else if (cli.isRunScan()) {
    100             updateSettings(cli.isAutoUpdate(), cli.getConnectionTimeout(), cli.getProxyUrl(),
    101                     cli.getProxyPort(), cli.getProxyUsername(), cli.getProxyPassword(),
    102                     cli.getDataDirectory(), cli.getPropertiesFile());
    103             runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getApplicationName(), cli.getScanFiles());
    104         } else {
    105             cli.printHelp();
    106         }
    107     }
    108
    109     /**
    110      * Scans the specified directories and writes the dependency reports to the
    111      * reportDirectory.
    112      *
    113      * @param reportDirectory the path to the directory where the reports will
    114      * be written
    115      * @param outputFormat the output format of the report
    116      * @param applicationName the application name for the report
    117      * @param files the files/directories to scan
    118      */
    119     private void runScan(String reportDirectory, String outputFormat, String applicationName, String[] files) {
    120         final Engine scanner = new Engine();
    121
    122         for (String file : files) {
    123             scanner.scan(file);
    124         }
    125
    126         scanner.analyzeDependencies();
    127         final List<Dependency> dependencies = scanner.getDependencies();
    128
    129         final ReportGenerator report = new ReportGenerator(applicationName, dependencies, scanner.getAnalyzers());
    130         try {
    131             report.generateReports(reportDirectory, outputFormat);
    132         } catch (IOException ex) {
    133             Logger.getLogger(App.class.getName()).log(Level.SEVERE, "There was an IO error while attempting to generate the report.");
    134             Logger.getLogger(App.class.getName()).log(Level.INFO, null, ex);
    135         } catch (Exception ex) {
    136             Logger.getLogger(App.class.getName()).log(Level.SEVERE, "There was an error while attempting to generate the report.");
    137             Logger.getLogger(App.class.getName()).log(Level.INFO, null, ex);
    138         }
    139     }
    140
    141     /**
    142      * Updates the global Settings.
    143      *
    144      * @param autoUpdate whether or not to update cached web data sources
    145      * @param connectionTimeout the timeout to use when downloading resources
    146      * (null or blank will use default)
    147      * @param proxyUrl the proxy url (null or blank means no proxy will be used)
    148      * @param proxyPort the proxy port (null or blank means no port will be
    149      * used)
    150      * @param dataDirectory the directory to store/retrieve persistent data from
    151      * @param propertiesFile the properties file to utilize
    152      */
    153     private void updateSettings(boolean autoUpdate, String connectionTimeout, String proxyUrl, String proxyPort,
    154                                 String proxyUser, String proxyPass, String dataDirectory, File propertiesFile) {
    155
    156         if (propertiesFile != null) {
    157             try {
    158                 Settings.mergeProperties(propertiesFile);
    159             } catch (FileNotFoundException ex) {
    160                 final String msg = String.format("Unable to load properties file '%s'", propertiesFile.getPath());
    161                 Logger.getLogger(App.class.getName()).log(Level.SEVERE, msg);
    162                 Logger.getLogger(App.class.getName()).log(Level.FINE, null, ex);
    163             } catch (IOException ex) {
    164                 final String msg = String.format("Unable to find properties file '%s'", propertiesFile.getPath());
    165                 Logger.getLogger(App.class.getName()).log(Level.SEVERE, msg);
    166                 Logger.getLogger(App.class.getName()).log(Level.FINE, null, ex);
    167             }
    168         }
    169         if (dataDirectory != null) {
    170             Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory);
    171         } else if (System.getProperty("basedir") != null) {
    172             final File dataDir = new File(System.getProperty("basedir"), "data");
    173             Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    174         } else {
    175             final File jarPath = new File(App.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    176             final File base = jarPath.getParentFile();
    177             final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
    178             final File dataDir = new File(base, sub);
    179             Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    180         }
    181         Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
    182         if (proxyUrl != null && !proxyUrl.isEmpty()) {
    183             Settings.setString(Settings.KEYS.PROXY_URL, proxyUrl);
    184         }
    185         if (proxyPort != null && !proxyPort.isEmpty()) {
    186             Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
    187         }
    188         if (proxyUser != null && !proxyUser.isEmpty()) {
    189             Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUser);
    190         }
    191         if (proxyPass != null && !proxyPass.isEmpty()) {
    192             Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPass);
    193         }
    194         if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
    195             Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
    196         }
    197     }
    198 }