Files
i2p.firefox/java/net/i2p/router/WindowsUpdatePostProcessor.java

114 lines
3.4 KiB
Java
Raw Normal View History

package net.i2p.router;
import static net.i2p.update.UpdateType.*;
import java.io.*;
import java.lang.InterruptedException;
import java.lang.Process;
import java.lang.ProcessBuilder;
import java.util.*;
2021-07-01 19:52:21 -04:00
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.*;
import net.i2p.I2PAppContext;
import net.i2p.crypto.*;
2021-07-01 19:52:21 -04:00
import net.i2p.update.UpdatePostProcessor;
import net.i2p.update.UpdateType;
import net.i2p.util.Log;
import net.i2p.util.SystemVersion;
2021-07-01 19:52:21 -04:00
public class WindowsUpdatePostProcessor implements UpdatePostProcessor {
private final Log _log;
private final RouterContext ctx;
private final AtomicBoolean hook = new AtomicBoolean();
private final String fileName = "i2p-jpackage-update.exe";
private volatile String version;
private volatile File positionedFile = null;
WindowsUpdatePostProcessor(RouterContext ctx) {
this.ctx = ctx;
this._log = ctx.logManager().getLog(WindowsUpdatePostProcessor.class);
}
public String getVersion() { return version; }
public File getFile() { return positionedFile; }
public void updateDownloadedandVerified(UpdateType type, int fileType,
String version, File file)
throws IOException {
_log.info("Got an update to post-process");
2022-10-23 16:05:46 -04:00
if (type != UpdateType.ROUTER_SIGNED_SU3 &&
type != UpdateType.ROUTER_DEV_SU3) {
_log.warn("Unsupported update type " + type);
return;
}
if (SystemVersion.isWindows()) {
if (fileType != SU3File.TYPE_EXE) {
_log.warn("Unsupported file type " + fileType);
return;
}
this.positionedFile = moveUpdateInstaller(file);
this.version = version;
if (!hook.compareAndSet(false, true)) {
_log.info("shutdown hook was already set");
return;
}
_log.info("adding shutdown hook");
ctx.addFinalShutdownTask(
new WinUpdateProcess(ctx, this::getVersion, this::getFile));
} else {
if (fileType == SU3File.TYPE_ZIP) {
this.positionedFile = moveUpdateInstaller(file);
this.version = version;
if (!hook.compareAndSet(false, true)) {
_log.info("shutdown hook was already set");
return;
}
_log.info("adding shutdown hook");
ctx.addFinalShutdownTask(
new ZipUpdateProcess(ctx, this::getVersion, this::getFile));
}
}
}
private File moveUpdateInstaller(File file) throws IOException {
if (this.ctx != null) {
File newFile = new File(workDir(), fileName);
boolean renamedStatus = file.renameTo(newFile);
if (renamedStatus)
return newFile;
else
throw new IOException(
"WindowsUpdatePostProcesssor unable to move file to working directory, update will fail");
}
throw new IOException(
"Router context not available to WindowsUpdatePostProcesssor, unable to find working directory, update will fail");
}
private File workDir() throws IOException {
if (this.ctx != null) {
File workDir =
new File(this.ctx.getConfigDir().getAbsolutePath(), "i2p_update_win");
if (workDir.exists()) {
if (workDir.isFile())
throw new IOException(workDir +
" exists but is a file, get it out of the way");
return null;
} else {
workDir.mkdirs();
}
return workDir;
}
return null;
}
}