mirror of
https://github.com/syncthing/syncthing-android.git
synced 2024-12-23 19:31:30 +00:00
parent
46d914bc1e
commit
65e090f6e9
4 changed files with 89 additions and 10 deletions
|
@ -233,7 +233,6 @@ public class DrawerFragment extends Fragment implements RestApi.OnReceiveSystemI
|
||||||
mActivity.closeDrawer();
|
mActivity.closeDrawer();
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
mActivity.getService().getApi().shutdown();
|
|
||||||
mActivity.stopService(new Intent(mActivity, SyncthingService.class));
|
mActivity.stopService(new Intent(mActivity, SyncthingService.class));
|
||||||
mActivity.finish();
|
mActivity.finish();
|
||||||
mActivity.closeDrawer();
|
mActivity.closeDrawer();
|
||||||
|
|
|
@ -21,8 +21,6 @@ public class PostTask extends AsyncTask<String, Void, Boolean> {
|
||||||
|
|
||||||
public static final String URI_CONFIG = "/rest/config";
|
public static final String URI_CONFIG = "/rest/config";
|
||||||
|
|
||||||
public static final String URI_SHUTDOWN = "/rest/shutdown";
|
|
||||||
|
|
||||||
public static final String URI_SCAN = "/rest/scan";
|
public static final String URI_SCAN = "/rest/scan";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,6 +11,7 @@ import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.os.AsyncTask;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -31,6 +32,9 @@ import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -267,7 +271,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener,
|
||||||
NotificationManager nm = (NotificationManager)
|
NotificationManager nm = (NotificationManager)
|
||||||
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
nm.cancel(NOTIFICATION_RESTART);
|
nm.cancel(NOTIFICATION_RESTART);
|
||||||
new PostTask().execute(mUrl, PostTask.URI_SHUTDOWN, mApiKey);
|
SyncthingRunnable.killSyncthing();
|
||||||
mRestartPostponed = false;
|
mRestartPostponed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,9 @@ public class SyncthingRunnable implements Runnable {
|
||||||
|
|
||||||
private static final String TAG = "SyncthingRunnable";
|
private static final String TAG = "SyncthingRunnable";
|
||||||
|
|
||||||
private static final String TAG_IONICE = "SyncthingRunnable-IoNice";
|
private static final String TAG_NICE = "SyncthingRunnable-Nice";
|
||||||
|
|
||||||
|
private static final String TAG_KILL = "SyncthingRunnable-Kill";
|
||||||
|
|
||||||
private static final String TAG_NATIVE = "SyncthingNativeCode";
|
private static final String TAG_NATIVE = "SyncthingNativeCode";
|
||||||
|
|
||||||
|
@ -99,7 +101,7 @@ public class SyncthingRunnable implements Runnable {
|
||||||
DataOutputStream niceOut = null;
|
DataOutputStream niceOut = null;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000); // Wait a second before getting the Pid
|
Thread.sleep(1000); // Wait a second before getting the pid
|
||||||
nice = Runtime.getRuntime().exec("sh");
|
nice = Runtime.getRuntime().exec("sh");
|
||||||
niceOut = new DataOutputStream(nice.getOutputStream());
|
niceOut = new DataOutputStream(nice.getOutputStream());
|
||||||
niceOut.writeBytes("set `ps |grep libsyncthing.so`\n");
|
niceOut.writeBytes("set `ps |grep libsyncthing.so`\n");
|
||||||
|
@ -108,28 +110,104 @@ public class SyncthingRunnable implements Runnable {
|
||||||
log(nice.getErrorStream(), Log.WARN);
|
log(nice.getErrorStream(), Log.WARN);
|
||||||
niceOut.flush();
|
niceOut.flush();
|
||||||
ret = nice.waitFor();
|
ret = nice.waitFor();
|
||||||
Log.i(TAG_IONICE, "ionice performed on libsyncthing.so");
|
Log.i(TAG_NICE, "ionice performed on libsyncthing.so");
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
Log.e(TAG_IONICE, "Failed to execute ionice binary", e);
|
Log.e(TAG_NICE, "Failed to execute ionice binary", e);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
if (niceOut != null) {
|
if (niceOut != null) {
|
||||||
niceOut.close();
|
niceOut.close();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG_IONICE, "Failed to close shell stream", e);
|
Log.w(TAG_NICE, "Failed to close shell stream", e);
|
||||||
}
|
}
|
||||||
if (nice != null) {
|
if (nice != null) {
|
||||||
nice.destroy();
|
nice.destroy();
|
||||||
}
|
}
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
Log.e(TAG_IONICE, "Failed to set ionice " + Integer.toString(ret));
|
Log.e(TAG_NICE, "Failed to set ionice " + Integer.toString(ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.start();
|
}.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look for running libsyncthing.so processes and kill them.
|
||||||
|
* Try a SIGTERM once, then try again (twice) with SIGKILL.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static void killSyncthing() {
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
Process ps = null;
|
||||||
|
DataOutputStream psOut = null;
|
||||||
|
try {
|
||||||
|
ps = Runtime.getRuntime().exec("sh");
|
||||||
|
psOut = new DataOutputStream(ps.getOutputStream());
|
||||||
|
psOut.writeBytes("ps | grep libsyncthing.so\n");
|
||||||
|
psOut.writeBytes("exit\n");
|
||||||
|
psOut.flush();
|
||||||
|
ps.waitFor();
|
||||||
|
InputStreamReader isr = new InputStreamReader(ps.getInputStream());
|
||||||
|
BufferedReader br = new BufferedReader(isr);
|
||||||
|
String id;
|
||||||
|
while ((id = br.readLine()) != null) {
|
||||||
|
killProcessId(id, i > 0);
|
||||||
|
}
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
Log.w(TAG_KILL, "Failed list Syncthing processes", e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (psOut != null) {
|
||||||
|
psOut.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w(TAG_KILL, "Failed close the psOut stream", e);
|
||||||
|
}
|
||||||
|
if (ps != null) {
|
||||||
|
ps.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kill a given process ID
|
||||||
|
*
|
||||||
|
* @param force Whether to use a SIGKILL.
|
||||||
|
*/
|
||||||
|
private static void killProcessId(String id, boolean force) {
|
||||||
|
Process kill = null;
|
||||||
|
DataOutputStream killOut = null;
|
||||||
|
try {
|
||||||
|
kill = Runtime.getRuntime().exec("sh");
|
||||||
|
killOut = new DataOutputStream(kill.getOutputStream());
|
||||||
|
if (!force) {
|
||||||
|
killOut.writeBytes("kill " + id + "\n");
|
||||||
|
killOut.writeBytes("sleep 1\n");
|
||||||
|
} else {
|
||||||
|
killOut.writeBytes("sleep 3\n");
|
||||||
|
killOut.writeBytes("kill -9 " + id + "\n");
|
||||||
|
}
|
||||||
|
killOut.writeBytes("exit\n");
|
||||||
|
killOut.flush();
|
||||||
|
kill.waitFor();
|
||||||
|
Log.i(TAG_KILL, "Killed Syncthing process "+id);
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
Log.w(TAG_KILL, "Failed to kill process id "+id, e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (killOut != null) {
|
||||||
|
killOut.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w(TAG_KILL, "Failed close the killOut stream", e);}
|
||||||
|
if (kill != null) {
|
||||||
|
kill.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the outputs of a stream to logcat and mNativeLog.
|
* Logs the outputs of a stream to logcat and mNativeLog.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue