mirror of
https://github.com/revanced/Apktool.git
synced 2025-04-30 22:24:25 +02:00
190 lines
6.1 KiB
Java
190 lines
6.1 KiB
Java
/**
|
|
* Copyright (C) 2018 Ryszard Wiśniewski <brut.alll@gmail.com>
|
|
* Copyright (C) 2018 Connor Tumbleson <connor.tumbleson@gmail.com>
|
|
*
|
|
* Licensed 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 brut.util;
|
|
|
|
import brut.common.BrutException;
|
|
import java.io.*;
|
|
import java.util.Arrays;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.logging.Logger;
|
|
|
|
import org.apache.commons.io.IOUtils;
|
|
|
|
/**
|
|
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
|
|
*/
|
|
public class OS {
|
|
|
|
private static final Logger LOGGER = Logger.getLogger("");
|
|
|
|
public static void rmdir(File dir) throws BrutException {
|
|
if (! dir.exists()) {
|
|
return;
|
|
}
|
|
File[] files = dir.listFiles();
|
|
for (int i = 0; i < files.length; i++) {
|
|
File file = files[i];
|
|
if (file.isDirectory()) {
|
|
rmdir(file);
|
|
} else {
|
|
file.delete();
|
|
}
|
|
}
|
|
dir.delete();
|
|
}
|
|
|
|
public static void rmfile(String file) throws BrutException {
|
|
File del = new File(file);
|
|
del.delete();
|
|
}
|
|
|
|
public static void rmdir(String dir) throws BrutException {
|
|
rmdir(new File(dir));
|
|
}
|
|
|
|
public static void cpdir(File src, File dest) throws BrutException {
|
|
dest.mkdirs();
|
|
File[] files = src.listFiles();
|
|
for (int i = 0; i < files.length; i++) {
|
|
File file = files[i];
|
|
File destFile = new File(dest.getPath() + File.separatorChar
|
|
+ file.getName());
|
|
if (file.isDirectory()) {
|
|
cpdir(file, destFile);
|
|
continue;
|
|
}
|
|
try {
|
|
InputStream in = new FileInputStream(file);
|
|
OutputStream out = new FileOutputStream(destFile);
|
|
IOUtils.copy(in, out);
|
|
in.close();
|
|
out.close();
|
|
} catch (IOException ex) {
|
|
throw new BrutException("Could not copy file: " + file, ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void cpdir(String src, String dest) throws BrutException {
|
|
cpdir(new File(src), new File(dest));
|
|
}
|
|
|
|
public static void exec(String[] cmd) throws BrutException {
|
|
Process ps = null;
|
|
int exitValue = -99;
|
|
try {
|
|
ProcessBuilder builder = new ProcessBuilder(cmd);
|
|
ps = builder.start();
|
|
new StreamForwarder(ps.getErrorStream(), "ERROR").start();
|
|
new StreamForwarder(ps.getInputStream(), "OUTPUT").start();
|
|
exitValue = ps.waitFor();
|
|
if (exitValue != 0)
|
|
throw new BrutException("could not exec (exit code = " + exitValue + "): " + Arrays.toString(cmd));
|
|
} catch (IOException ex) {
|
|
throw new BrutException("could not exec: " + Arrays.toString(cmd), ex);
|
|
} catch (InterruptedException ex) {
|
|
throw new BrutException("could not exec : " + Arrays.toString(cmd), ex);
|
|
}
|
|
}
|
|
|
|
public static String execAndReturn(String[] cmd) {
|
|
ExecutorService executor = Executors.newCachedThreadPool();
|
|
try {
|
|
ProcessBuilder builder = new ProcessBuilder(cmd);
|
|
builder.redirectErrorStream(true);
|
|
|
|
Process process = builder.start();
|
|
StreamCollector collector = new StreamCollector(process.getInputStream());
|
|
executor.execute(collector);
|
|
|
|
process.waitFor();
|
|
return collector.get();
|
|
} catch (IOException | InterruptedException e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static File createTempDirectory() throws BrutException {
|
|
try {
|
|
File tmp = File.createTempFile("BRUT", null);
|
|
tmp.deleteOnExit();
|
|
if (!tmp.delete()) {
|
|
throw new BrutException("Could not delete tmp file: " + tmp.getAbsolutePath());
|
|
}
|
|
if (!tmp.mkdir()) {
|
|
throw new BrutException("Could not create tmp dir: " + tmp.getAbsolutePath());
|
|
}
|
|
return tmp;
|
|
} catch (IOException ex) {
|
|
throw new BrutException("Could not create tmp dir", ex);
|
|
}
|
|
}
|
|
|
|
static class StreamForwarder extends Thread {
|
|
|
|
StreamForwarder(InputStream is, String type) {
|
|
mIn = is;
|
|
mType = type;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
BufferedReader br = new BufferedReader(new InputStreamReader(mIn));
|
|
String line;
|
|
while ((line = br.readLine()) != null) {
|
|
if (mType.equals("OUTPUT")) {
|
|
LOGGER.info(line);
|
|
} else {
|
|
LOGGER.warning(line);
|
|
}
|
|
}
|
|
} catch (IOException ex) {
|
|
ex.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private final InputStream mIn;
|
|
private final String mType;
|
|
}
|
|
|
|
static class StreamCollector implements Runnable {
|
|
private final StringBuffer buffer = new StringBuffer();
|
|
private final InputStream inputStream;
|
|
|
|
public StreamCollector(InputStream inputStream) {
|
|
super();
|
|
this.inputStream = inputStream;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
String line;
|
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
|
|
while ((line = reader.readLine()) != null) {
|
|
buffer.append(line).append('\n');
|
|
}
|
|
} catch (IOException ignored) {}
|
|
}
|
|
|
|
public String get() {
|
|
return buffer.toString();
|
|
}
|
|
}
|
|
}
|