Systray: Don't attempt to launch browser when running as a service

Console: Hide/show things on /configservice when running as a service
Util: Add isWindowsService() and isService()
This commit is contained in:
zzz
2020-02-27 17:30:16 +00:00
parent eb73f0aae2
commit 6774af6910
3 changed files with 57 additions and 6 deletions

View File

@ -52,7 +52,7 @@
</div> </div>
<% <%
} }
if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { if (net.i2p.util.SystemVersion.isWindows()) {
%> %>
<h3 class="ptitle" id="runonstartup"><%=intl._t("Run on startup")%></h3> <h3 class="ptitle" id="runonstartup"><%=intl._t("Run on startup")%></h3>
<p class="infohelp"> <p class="infohelp">
@ -60,13 +60,24 @@
<%=intl._t("If you prefer the command line, you can also run the ")%> <code>install_i2p_service_winnt.bat</code> (<%=intl._t("or")%> <%=intl._t("If you prefer the command line, you can also run the ")%> <code>install_i2p_service_winnt.bat</code> (<%=intl._t("or")%>
<code>uninstall_i2p_service_winnt.bat</code>).</p> <code>uninstall_i2p_service_winnt.bat</code>).</p>
<hr><div class="formaction" id="runonstart"> <hr><div class="formaction" id="runonstart">
<%
if (net.i2p.util.SystemVersion.isWindowsService()) {
%>
<input type="submit" name="action" class="cancel" value="<%=intl._t("Don't run I2P on startup")%>" >
<% } else { %>
<input type="submit" name="action" class="accept" value="<%=intl._t("Run I2P on startup")%>" > <input type="submit" name="action" class="accept" value="<%=intl._t("Run I2P on startup")%>" >
<input type="submit" name="action" class="cancel" value="<%=intl._t("Don't run I2P on startup")%>" ></div> <% } %>
</div>
<%
if (net.i2p.util.SystemVersion.isWindowsService()) {
%>
<p class="infohelp" id="winfoservice"><b> <p class="infohelp" id="winfoservice"><b>
<%=intl._t("Note")%>:</b> <%=intl._t("If you are running I2P as service right now, removing it will shut down your router immediately.")%> <%=intl._t("Note")%>:</b> <%=intl._t("If you are running I2P as service right now, removing it will shut down your router immediately.")%>
<%=intl._t("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%></p> <%=intl._t("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%></p>
<% } %> <%
}
}
%>
<h3 class="ptitle" id="servicedebug"><%=intl._t("Debugging")%>&nbsp;<a href="/jobs">[<%=intl._t("View the job queue")%>]</a></h3> <h3 class="ptitle" id="servicedebug"><%=intl._t("Debugging")%>&nbsp;<a href="/jobs">[<%=intl._t("View the job queue")%>]</a></h3>
<p class="infohelp"> <p class="infohelp">
<% if (net.i2p.util.SystemVersion.hasWrapper()) { %> <% if (net.i2p.util.SystemVersion.hasWrapper()) { %>
@ -83,6 +94,7 @@
<% } %> <% } %>
</div> </div>
<% if (!net.i2p.util.SystemVersion.isService()) { %>
<h3 class="ptitle" id="browseronstart"><%=intl._t("Launch browser on router startup?")%></h3> <h3 class="ptitle" id="browseronstart"><%=intl._t("Launch browser on router startup?")%></h3>
<p class="infohelp"> <p class="infohelp">
<% String consoleURL = formhandler.getConsoleURL(); %> <% String consoleURL = formhandler.getConsoleURL(); %>
@ -91,4 +103,6 @@
<hr><div class="formaction" id="browserstart"> <hr><div class="formaction" id="browserstart">
<input type="submit" class="check" name="action" value="<%=intl._t("View console on startup")%>" > <input type="submit" class="check" name="action" value="<%=intl._t("View console on startup")%>" >
<input type="submit" class="delete" name="action" value="<%=intl._t("Do not view console on startup")%>" > <input type="submit" class="delete" name="action" value="<%=intl._t("Do not view console on startup")%>" >
</div></form></div></body></html> </div>
<% } %>
</form></div></body></html>

View File

@ -57,6 +57,7 @@ public class UrlLauncher implements ClientApp {
private static final int MAX_TRIES = 99; private static final int MAX_TRIES = 99;
private static final String REGISTERED_NAME = "UrlLauncher"; private static final String REGISTERED_NAME = "UrlLauncher";
private static final String PROP_BROWSER = "routerconsole.browser"; private static final String PROP_BROWSER = "routerconsole.browser";
private static final boolean IS_SERVICE = SystemVersion.isService();
/** /**
* Browsers to try IN-ORDER * Browsers to try IN-ORDER
@ -177,6 +178,8 @@ public class UrlLauncher implements ClientApp {
* unsuccessful, an attempt is made to launch the URL using the most common * unsuccessful, an attempt is made to launch the URL using the most common
* browsers. * browsers.
* *
* As of 0.9.46, fails immediately if JVM is a Windows or Linux Service.
*
* BLOCKING. This repeatedly probes the server port at the given url * BLOCKING. This repeatedly probes the server port at the given url
* until it is apparently ready. * until it is apparently ready.
* *
@ -187,6 +190,8 @@ public class UrlLauncher implements ClientApp {
* @throws IOException * @throws IOException
*/ */
public boolean openUrl(String url) throws IOException { public boolean openUrl(String url) throws IOException {
if (IS_SERVICE)
return false;
if (_log.shouldDebug()) _log.debug("Waiting for server"); if (_log.shouldDebug()) _log.debug("Waiting for server");
waitForServer(url); waitForServer(url);
if (_log.shouldDebug()) _log.debug("Done waiting for server"); if (_log.shouldDebug()) _log.debug("Done waiting for server");
@ -278,6 +283,8 @@ public class UrlLauncher implements ClientApp {
* they contain spaces or tabs. * they contain spaces or tabs.
* There is no mechanism to escape quotes or other chars with backslashes. * There is no mechanism to escape quotes or other chars with backslashes.
* *
* As of 0.9.46, fails immediately if JVM is a Windows or Linux Service.
*
* BLOCKING. However, this does NOT probe the server port to see if it is ready. * BLOCKING. However, this does NOT probe the server port to see if it is ready.
* *
* @param url The URL to open. * @param url The URL to open.
@ -288,6 +295,8 @@ public class UrlLauncher implements ClientApp {
* @throws IOException * @throws IOException
*/ */
public boolean openUrl(String url, String browser) throws IOException { public boolean openUrl(String url, String browser) throws IOException {
if (IS_SERVICE)
return false;
waitForServer(url); waitForServer(url);
if (validateUrlFormat(url)) { if (validateUrlFormat(url)) {
String[] args = parseArgs(browser, url); String[] args = parseArgs(browser, url);
@ -383,9 +392,16 @@ public class UrlLauncher implements ClientApp {
/** /**
* ClientApp interface * ClientApp interface
* As of 0.9.46, stops immediately if JVM is a Windows or Linux Service.
*
* @since 0.9.18 * @since 0.9.18
*/ */
public void startup() { public void startup() {
if (IS_SERVICE) {
// not START_FAILED so manager doesn't log CRIT
changeState(STOPPED);
return;
}
String url = _args[0]; String url = _args[0];
if (!validateUrlFormat(url)) { if (!validateUrlFormat(url)) {
changeState(START_FAILED, new MalformedURLException("Bad url: " + url)); changeState(START_FAILED, new MalformedURLException("Bad url: " + url));

View File

@ -43,6 +43,9 @@ public abstract class SystemVersion {
private static final boolean _is64; private static final boolean _is64;
private static final boolean _hasWrapper = System.getProperty("wrapper.version") != null; private static final boolean _hasWrapper = System.getProperty("wrapper.version") != null;
private static final boolean _isLinuxService; private static final boolean _isLinuxService;
// found in Tanuki WrapperManager source so we don't need the WrapperManager class here
private static final boolean _isWindowsService = _isWin && _hasWrapper && Boolean.valueOf(System.getProperty("wrapper.service"));
private static final boolean _isService;
private static final boolean _isSlow; private static final boolean _isSlow;
private static final boolean _oneDotSix; private static final boolean _oneDotSix;
@ -76,6 +79,7 @@ public abstract class SystemVersion {
_isLinuxService = !_isWin && !_isMac && !_isAndroid && _isLinuxService = !_isWin && !_isMac && !_isAndroid &&
(DAEMON_USER.equals(System.getProperty("user.name")) || (DAEMON_USER.equals(System.getProperty("user.name")) ||
(_isGentoo && GENTOO_USER.equals(System.getProperty("user.name")))); (_isGentoo && GENTOO_USER.equals(System.getProperty("user.name"))));
_isService = _isLinuxService || _isWindowsService;
_isSlow = _isAndroid || _isApache || _isArm || _isGNU || _isZero || getMaxMemory() < 48*1024*1024L; _isSlow = _isAndroid || _isApache || _isArm || _isGNU || _isZero || getMaxMemory() < 48*1024*1024L;
int sdk = 0; int sdk = 0;
@ -298,6 +302,20 @@ public abstract class SystemVersion {
return _isLinuxService; return _isLinuxService;
} }
/*
* @since 0.9.46
*/
public static boolean isWindowsService() {
return _isWindowsService;
}
/*
* @since 0.9.46
*/
public static boolean isService() {
return _isService;
}
/** /**
* Identical to android.os.Build.VERSION.SDK_INT. * Identical to android.os.Build.VERSION.SDK_INT.
* For use outside of Android code. * For use outside of Android code.
@ -376,7 +394,9 @@ public abstract class SystemVersion {
System.out.println("Java 9 : " + isJava9()); System.out.println("Java 9 : " + isJava9());
System.out.println("Java 10 : " + isJava10()); System.out.println("Java 10 : " + isJava10());
System.out.println("Java 11 : " + isJava11()); System.out.println("Java 11 : " + isJava11());
System.out.println("Java 12 : " + isJava(12)); for (int i = 12; i <= 15; i++) {
System.out.println("Java " + i + " : " + isJava(i));
}
System.out.println("Android : " + isAndroid()); System.out.println("Android : " + isAndroid());
if (isAndroid()) if (isAndroid())
System.out.println(" Version: " + getAndroidVersion()); System.out.println(" Version: " + getAndroidVersion());
@ -391,6 +411,7 @@ public abstract class SystemVersion {
System.out.println("OpenJDK : " + isOpenJDK()); System.out.println("OpenJDK : " + isOpenJDK());
System.out.println("Slow : " + isSlow()); System.out.println("Slow : " + isSlow());
System.out.println("Windows : " + isWindows()); System.out.println("Windows : " + isWindows());
System.out.println("Win. Svc : " + isWindowsService());
System.out.println("Wrapper : " + hasWrapper()); System.out.println("Wrapper : " + hasWrapper());
System.out.println("x86 : " + isX86()); System.out.println("x86 : " + isX86());
System.out.println("Zero JVM : " + isZeroVM()); System.out.println("Zero JVM : " + isZeroVM());