blob: 6edb34b5710dedebe7b8d089e8659db48bd455a5 [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:io' as io;
import 'package:args/args.dart';
import 'log/log.dart';
import 'server.dart';
/**
* Start a web server that will allow an instrumentation log to be viewed.
*/
void main(List<String> args) {
Driver driver = new Driver();
driver.start(args);
}
/**
* The main driver that configures and starts the web server.
*/
class Driver {
/**
* The flag used to specify that the user wants to have help text printed but
* that no other work should be done.
*/
static String helpFlag = 'help';
/**
* The option used to specify the port on which the server should listen for
* requests.
*/
static String portOption = 'port';
/**
* The port that will be used if no port number is provided on the command
* line.
*/
static int defaultPortNumber = 11000;
/**
* Initialize a newly created driver.
*/
Driver();
/**
* Create and return the parser used to parse the command-line arguments.
*/
ArgParser createParser() {
ArgParser parser = new ArgParser();
parser.addFlag(helpFlag, help: 'Print this help text', negatable: false);
parser.addOption(portOption,
help: 'The port number on which the server should listen for requests',
defaultsTo: defaultPortNumber.toString());
return parser;
}
/**
* Print usage information.
*/
void printUsage(ArgParser parser,
{String error, Object exception, StackTrace stackTrace}) {
if (error != null) {
print(error);
print('');
}
print('log_viewer [options] logFile');
print('');
print('Usage:');
print('');
print(
'The "logFile" is the file containing the content of the log that is being viewed');
print('');
print('Options:');
print(parser.usage);
if (exception != null) {
print(exception);
}
if (stackTrace != null) {
print(stackTrace);
}
}
/**
* Use the given command-line [args] to configure and start the web server.
*/
void start(List<String> args) {
ArgParser parser = createParser();
ArgResults options = parser.parse(args);
if (options[helpFlag]) {
printUsage(parser);
return;
}
int port = defaultPortNumber;
try {
port = int.parse(options[portOption]);
} catch (exception) {
printUsage(parser, error: 'Invalid port number');
return;
}
List<String> arguments = options.rest;
if (arguments == null || arguments.length != 1) {
printUsage(parser, error: 'Missing log file');
return;
}
String fileName = arguments[0];
io.File logFile = new io.File(fileName);
List<String> lines;
try {
lines = logFile.readAsLinesSync();
} catch (exception, stackTrace) {
printUsage(parser,
error: 'Could not read file "$fileName":',
exception: exception,
stackTrace: stackTrace);
return;
}
print('Log file contains ${lines.length} lines');
InstrumentationLog log =
new InstrumentationLog(<String>[logFile.path], lines);
WebServer server = new WebServer(log);
server.serveHttp(port);
print('logViewer is listening on http://localhost:$port/log');
}
}