blob: f89c546ad9352108bfa758a22eb850b068bdfe6d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sqoop.tools.tool;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.ParseException;
import org.apache.log4j.Logger;
import org.apache.sqoop.connector.ConnectorManager;
import org.apache.sqoop.json.JobBean;
import org.apache.sqoop.json.LinkBean;
import org.apache.sqoop.json.SubmissionBean;
import org.apache.sqoop.repository.Repository;
import org.apache.sqoop.repository.RepositoryManager;
import org.apache.sqoop.tools.ConfiguredTool;
import org.apache.sqoop.common.VersionInfo;
import static org.apache.sqoop.json.util.ConfigSerialization.ALL;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
/**
* Write user-created content of Sqoop repository to JSON formatted file
*/
public class RepositoryDumpTool extends ConfiguredTool {
public static final Logger LOG = Logger.getLogger(RepositoryDumpTool.class);
@Override
public boolean runToolWithConfiguration(String[] arguments) {
boolean skipSensitive = true;
Options options = new Options();
options.addOption(OptionBuilder.withLongOpt("include-sensitive")
.withDescription("Dump all data including sensitive information such as passwords. Passwords will be dumped in clear text")
.create());
options.addOption(OptionBuilder.isRequired()
.hasArg()
.withArgName("filename")
.withLongOpt("output")
.create('o'));
CommandLineParser parser = new GnuParser();
try {
CommandLine line = parser.parse(options, arguments);
String outputFileName = line.getOptionValue('o');
if (line.hasOption("include-sensitive")) {
skipSensitive = false;
}
BufferedWriter output = new BufferedWriter(new FileWriter(outputFileName));
LOG.info("Writing JSON repository dump to file " + outputFileName);
dump(skipSensitive).writeJSONString(output);
output.flush();
output.close();
} catch (ParseException e) {
LOG.error("Error parsing command line arguments:", e);
System.out.println("Error parsing command line arguments. Please check Server logs for details.");
return false;
} catch (IOException e) {
LOG.error("Can't dump Sqoop repository to file:", e);
System.out.println("Writing repository dump to file failed. Please check Server logs for details.");
return false;
}
return true;
}
private JSONObject dump(boolean skipSensitive) {
RepositoryManager.getInstance().initialize(true);
ConnectorManager.getInstance().initialize();
Repository repository = RepositoryManager.getInstance().getRepository();
JSONObject result = new JSONObject();
LOG.info("Dumping Connections with skipSensitive=" + String.valueOf(skipSensitive));
LinkBean links = new LinkBean(repository.findLinks());
result.put(JSONConstants.LINKS, addConnectorName(links.extract(skipSensitive)));
LOG.info("Dumping Jobs with skipSensitive=" + String.valueOf(skipSensitive));
JobBean jobs = new JobBean(repository.findJobs());
result.put(JSONConstants.JOBS, addConnectorName(jobs.extract(skipSensitive)));
LOG.info("Dumping Submissions with skipSensitive=" + String.valueOf(skipSensitive));
SubmissionBean submissions = new SubmissionBean(repository.findSubmissions());
result.put(JSONConstants.SUBMISSIONS, submissions.extract(skipSensitive));
result.put(JSONConstants.METADATA, repoMetadata(skipSensitive));
return result;
}
private JSONObject repoMetadata(boolean skipSensitive) {
JSONObject metadata = new JSONObject();
metadata.put(JSONConstants.VERSION, VersionInfo.getVersion());
metadata.put(JSONConstants.REVISION, VersionInfo.getRevision());
metadata.put(JSONConstants.COMPILE_DATE, VersionInfo.getDate());
metadata.put(JSONConstants.COMPILE_USER, VersionInfo.getUser());
metadata.put(JSONConstants.INCLUDE_SENSITIVE,!skipSensitive );
return metadata;
}
private JSONObject addConnectorName(JSONObject json) {
ConnectorManager connectorManager = ConnectorManager.getInstance();
JSONArray results = (JSONArray) json.get(ALL);
Iterator<JSONObject> iterator = results.iterator();
while (iterator.hasNext()) {
JSONObject result = iterator.next();
Long connectorId = (Long) result.get(JSONConstants.CONNECTOR_ID);
result.put(JSONConstants.CONNECTOR_NAME, connectorManager.getConnectorConfig(connectorId).getUniqueName());
}
return json;
}
}