308 lines
8.9 KiB
Java
308 lines
8.9 KiB
Java
package net.i2p.router;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.BufferedOutputStream;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.util.logging.FileHandler;
|
|
import java.util.logging.Logger;
|
|
import java.util.logging.SimpleFormatter;
|
|
|
|
public class CopyConfigDir extends WindowsServiceUtil {
|
|
final Logger logger = Logger.getLogger("configlog");
|
|
|
|
public void initLogger() {
|
|
try {
|
|
// This block configure the logger with handler and formatter
|
|
FileHandler fh = new FileHandler(logFile().toString());
|
|
logger.addHandler(fh);
|
|
SimpleFormatter formatter = new SimpleFormatter();
|
|
fh.setFormatter(formatter);
|
|
// the following statement is used to log any messages
|
|
logger.info("My first log");
|
|
} catch (SecurityException e) {
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public boolean copyDirectory(String baseDir, String workDir) {
|
|
File baseFile = new File(baseDir);
|
|
File workFile = new File(workDir);
|
|
return copyDirectory(baseFile, workFile);
|
|
}
|
|
|
|
public boolean copyDirectory(File baseDir, File workDir) {
|
|
for (File file : baseDir.listFiles()) {
|
|
String fPath = file.getAbsolutePath().replace(
|
|
file.getParentFile().getAbsolutePath(), "");
|
|
String newPath = workDir.toString() + fPath;
|
|
if (file.isDirectory())
|
|
if (copyDirectory(file, new File(newPath)))
|
|
return false;
|
|
if (file.isFile())
|
|
if (0 == copyFile(file, new File(newPath), true))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public boolean copyConfigDirectory(File baseDir, File workDir) {
|
|
for (File file : baseDir.listFiles()) {
|
|
// System.out.println(file.getAbsolutePath());
|
|
String fPath = file.getAbsolutePath().replace(
|
|
file.getParentFile().getAbsolutePath(), "");
|
|
String newPath = workDir.toString() + fPath;
|
|
if (file.isDirectory())
|
|
if (!copyConfigDirectory(file, new File(newPath)))
|
|
return false;
|
|
if (file.isFile()) {
|
|
int cnr = copyFileNeverOverwrite(file, new File(newPath));
|
|
if (0 == cnr)
|
|
return false;
|
|
if (1 == cnr) {
|
|
logger.info(
|
|
"using jpackaged configs in a jpackaged install, creating jpackaged file");
|
|
File jpackagedConfigsInUse = new File(appImageHome(), "jpackaged");
|
|
if (!jpackagedConfigsInUse.exists()) {
|
|
try {
|
|
jpackagedConfigsInUse.createNewFile();
|
|
} catch (IOException e) {
|
|
logger.warning(
|
|
"Error creating jpackaged file, delete config files manually when uninstalling");
|
|
}
|
|
}
|
|
}
|
|
if (-1 == cnr) {
|
|
logger.info(
|
|
"not overwriting existing config file, not creating jpackaged file");
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public int copyFileNeverOverwrite(String basePath, String workPath) {
|
|
File baseFile = new File(basePath);
|
|
File workFile = new File(workPath);
|
|
return copyFileNeverOverwrite(baseFile, workFile);
|
|
}
|
|
|
|
public int copyFileNeverOverwrite(File basePath, File workPath) {
|
|
return copyFile(basePath, workPath, false);
|
|
}
|
|
|
|
public int copyFile(File basePath, File workPath, boolean overWrite) {
|
|
if (!basePath.exists()) {
|
|
logger.info(basePath.getAbsolutePath() + " doesn't exist, not copying");
|
|
return 0;
|
|
}
|
|
|
|
if (!overWrite && workPath.exists()) {
|
|
logger.info(workPath.getAbsolutePath() +
|
|
" already exists, not overwriting");
|
|
return -1;
|
|
}
|
|
|
|
File workDir = workPath.getParentFile();
|
|
if (!workDir.exists()) {
|
|
workDir.mkdirs();
|
|
}
|
|
try (InputStream in =
|
|
new BufferedInputStream(new FileInputStream(basePath));
|
|
OutputStream out =
|
|
new BufferedOutputStream(new FileOutputStream(workPath))) {
|
|
|
|
byte[] buffer = new byte[1024];
|
|
int lengthRead;
|
|
while ((lengthRead = in.read(buffer)) > 0) {
|
|
out.write(buffer, 0, lengthRead);
|
|
out.flush();
|
|
}
|
|
in.close();
|
|
out.close();
|
|
return 1;
|
|
} catch (Throwable e) {
|
|
logger.warning(e.toString());
|
|
logger.warning("failed to copy " + basePath.getAbsolutePath() + " to " +
|
|
workPath.getAbsolutePath());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
protected File selectHome() { // throws Exception {
|
|
String path_override = System.getenv("I2P_CONFIG");
|
|
if (path_override != null) {
|
|
File path = new File(path_override);
|
|
if (path != null && path.exists()) {
|
|
if (path.isDirectory())
|
|
return path.getAbsoluteFile();
|
|
else
|
|
throw new RuntimeException("I2P_CONFIG is not a directory: " + path);
|
|
}
|
|
}
|
|
File i2p = appImageHome();
|
|
logger.info("Checking for signs of life in I2P_CONFIG directory: " + i2p);
|
|
return i2p;
|
|
}
|
|
|
|
protected File selectProgramFile() {
|
|
String path_override = System.getenv("I2P");
|
|
if (path_override != null) {
|
|
File path = new File(path_override);
|
|
if (path.exists()) {
|
|
if (path.isDirectory())
|
|
return path.getAbsoluteFile();
|
|
else
|
|
throw new RuntimeException("I2P is not a directory: " + path);
|
|
}
|
|
}
|
|
File i2p = appImageHome();
|
|
logger.info("Checking for signs of life in I2P directory: " + i2p);
|
|
return i2p;
|
|
}
|
|
|
|
/**
|
|
* get the path to the java home, for jpackage this is related to the
|
|
* executable itself, which is handy to know. It's a directory called runtime,
|
|
* relative to the root of the app-image on each platform:
|
|
*
|
|
* Windows - Root of appimage is 1 directory above directory named runtime
|
|
* ./runtime
|
|
*
|
|
* Linux - Root of appimage is 2 directories above directory named runtime
|
|
* ./lib/runtime
|
|
*
|
|
* Mac OSX - Unknown for now
|
|
*
|
|
* @return
|
|
*/
|
|
protected File javaHome() {
|
|
File jrehome = new File(System.getProperty("java.home"));
|
|
if (jrehome != null) {
|
|
if (jrehome.exists()) {
|
|
return jrehome;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* get the path to the root of the app-image root by getting the path to
|
|
* java.home and the OS, and traversing up to the app-image root based on that
|
|
* information.
|
|
*
|
|
* @return the app-image root
|
|
*/
|
|
protected File appImageHome() {
|
|
File jreHome = javaHome();
|
|
if (jreHome != null) {
|
|
switch (osName()) {
|
|
case "windows":
|
|
return jreHome.getAbsoluteFile().getParentFile();
|
|
case "mac":
|
|
case "linux":
|
|
return jreHome.getAbsoluteFile().getParentFile().getParentFile();
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* get the path to the binary of the app-image root by getting the path to
|
|
* java.home and the OS, and traversing up to the app-image root based on that
|
|
* information, then getting the binary path on a per-platform basis. The path
|
|
* returned will be relative to the root.
|
|
*
|
|
* @return the app-image root
|
|
*/
|
|
protected String appImageExe() {
|
|
File aih = appImageHome();
|
|
if (aih != null) {
|
|
switch (osName()) {
|
|
case "windows":
|
|
return "I2P.exe";
|
|
case "mac":
|
|
case "linux":
|
|
return "./bin/I2P";
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* get the path to the default config of the app-image by getting the path to
|
|
* java.home and the OS, and traversing up to the app-image root based on that
|
|
* information, then appending the config directory to the end onn a
|
|
* per-platform basis
|
|
*
|
|
* @return the app-image root
|
|
*/
|
|
protected File appImageConfig() {
|
|
File aih = appImageHome();
|
|
if (aih == null) {
|
|
return null;
|
|
}
|
|
String osName = osName();
|
|
switch (osName) {
|
|
case "windows":
|
|
File winConfigDir = new File(aih, "config");
|
|
if (winConfigDir != null) {
|
|
if (winConfigDir.exists()) {
|
|
return winConfigDir;
|
|
}
|
|
}
|
|
case "mac":
|
|
case "linux":
|
|
File linConfigDir = new File(aih, "lib/config");
|
|
if (linConfigDir != null) {
|
|
if (linConfigDir.exists()) {
|
|
return linConfigDir;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
protected boolean copyConfigDir() {
|
|
File appImageConfigDir = appImageConfig();
|
|
File appImageHomeDir = selectHome();
|
|
return copyConfigDirectory(appImageConfigDir, appImageHomeDir);
|
|
}
|
|
|
|
protected String routerConfig() {
|
|
File appImageHomeDir = selectHome();
|
|
File routerConf = new File(appImageHomeDir, "router.config");
|
|
if (routerConf != null) {
|
|
if (routerConf.exists()) {
|
|
return routerConf.getAbsolutePath();
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* set up the path to the log file
|
|
*
|
|
* @return
|
|
*/
|
|
protected File logFile() { return logFile("launcher.log"); }
|
|
|
|
/**
|
|
* set up the path to the log file
|
|
*
|
|
* @return
|
|
*/
|
|
protected File logFile(String p) {
|
|
File log = new File(selectProgramFile(), "logs");
|
|
if (!log.exists())
|
|
log.mkdirs();
|
|
return new File(log, p);
|
|
}
|
|
}
|