2014-11-20 13:21:19 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2010-2014 Laurent CLOUET
|
|
|
|
|
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
|
|
|
|
|
*
|
2020-05-28 13:28:42 +02:00
|
|
|
* This program is free software; you can redistribute it and/or
|
2014-11-20 13:21:19 +00:00
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
|
* as published by the Free Software Foundation; version 2
|
|
|
|
|
* of the License.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package com.sheepit.client;
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.io.InputStreamReader;
|
2017-05-08 01:35:08 +02:00
|
|
|
import java.net.InetAddress;
|
|
|
|
|
import java.net.UnknownHostException;
|
2023-01-06 14:43:14 +00:00
|
|
|
import java.util.ArrayList;
|
2014-11-20 13:21:19 +00:00
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
|
import java.util.LinkedList;
|
|
|
|
|
import java.util.List;
|
2023-01-06 14:43:14 +00:00
|
|
|
import java.util.ListIterator;
|
2014-11-20 13:21:19 +00:00
|
|
|
|
2014-12-17 21:47:31 +00:00
|
|
|
import com.sheepit.client.hardware.cpu.CPU;
|
2014-11-20 13:21:19 +00:00
|
|
|
import com.sheepit.client.hardware.gpu.GPUDevice;
|
2014-12-17 21:47:31 +00:00
|
|
|
import com.sheepit.client.os.OS;
|
2021-07-16 23:37:24 +00:00
|
|
|
import lombok.AllArgsConstructor;
|
2019-08-07 22:17:59 +02:00
|
|
|
import lombok.Data;
|
2014-11-20 13:21:19 +00:00
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Provides facilities regarding the configuration of the SheepIt client
|
|
|
|
|
*/
|
2021-07-16 23:37:24 +00:00
|
|
|
@AllArgsConstructor
|
2020-05-28 13:28:42 +02:00
|
|
|
@Data public class Configuration {
|
2021-07-07 16:18:45 +00:00
|
|
|
|
2021-12-30 17:46:20 +00:00
|
|
|
public static final String jarVersion = getJarVersion();
|
|
|
|
|
|
2014-11-20 13:21:19 +00:00
|
|
|
public enum ComputeType {
|
2015-04-07 20:05:48 +01:00
|
|
|
CPU_GPU, CPU, GPU
|
2015-01-25 18:26:21 +00:00
|
|
|
} // accept job for ...
|
2014-11-20 13:21:19 +00:00
|
|
|
|
2018-12-18 22:53:01 +01:00
|
|
|
private String configFilePath;
|
2024-04-14 09:27:52 +00:00
|
|
|
private String logDirectory;
|
2019-08-07 22:17:59 +02:00
|
|
|
private File workingDirectory;
|
2020-10-21 22:03:09 +11:00
|
|
|
private File sharedDownloadsDirectory;
|
2019-08-07 22:17:59 +02:00
|
|
|
private File storageDirectory; // for permanent storage (binary archive)
|
|
|
|
|
private boolean userHasSpecifiedACacheDir;
|
|
|
|
|
private String static_exeDirName;
|
2014-11-20 13:21:19 +00:00
|
|
|
private String login;
|
|
|
|
|
private String password;
|
2015-07-06 18:41:28 +01:00
|
|
|
private String proxy;
|
2014-11-20 13:21:19 +00:00
|
|
|
private int maxUploadingJob;
|
|
|
|
|
private int nbCores;
|
2021-11-16 14:51:53 +00:00
|
|
|
private long maxAllowedMemory; // in KiB, max memory allowed for render
|
2017-04-25 13:06:23 +02:00
|
|
|
private int maxRenderTime; // max render time per frame allowed
|
2017-01-05 09:58:27 +01:00
|
|
|
private int priority;
|
2014-11-20 13:21:19 +00:00
|
|
|
private ComputeType computeMethod;
|
|
|
|
|
private GPUDevice GPUDevice;
|
2018-08-24 19:46:03 +02:00
|
|
|
private boolean detectGPUs;
|
2014-11-20 13:21:19 +00:00
|
|
|
private boolean printLog;
|
2024-05-05 10:55:46 +00:00
|
|
|
private boolean debugLevel;
|
2019-08-07 22:17:59 +02:00
|
|
|
private List<Pair<Calendar, Calendar>> requestTime;
|
2020-07-28 00:49:36 +10:00
|
|
|
private long shutdownTime;
|
|
|
|
|
private String shutdownMode;
|
2014-11-20 13:21:19 +00:00
|
|
|
private String extras;
|
2015-04-03 19:50:58 +01:00
|
|
|
private boolean autoSignIn;
|
2020-06-09 14:47:39 +10:00
|
|
|
private boolean useSysTray;
|
2021-07-16 23:37:24 +00:00
|
|
|
private boolean headless;
|
2015-04-08 20:37:53 +01:00
|
|
|
private String UIType;
|
2017-05-08 01:35:08 +02:00
|
|
|
private String hostname;
|
2020-04-14 23:24:28 +10:00
|
|
|
private String theme;
|
2024-03-26 14:08:46 +00:00
|
|
|
private boolean disableLargeDownloads;
|
2024-06-08 03:21:33 +00:00
|
|
|
private String incompatibleProcess;
|
2014-11-20 13:21:19 +00:00
|
|
|
|
|
|
|
|
public Configuration(File cache_dir_, String login_, String password_) {
|
2018-12-18 22:53:01 +01:00
|
|
|
this.configFilePath = null;
|
2024-04-14 09:27:52 +00:00
|
|
|
this.logDirectory = null;
|
2014-11-20 13:21:19 +00:00
|
|
|
this.login = login_;
|
|
|
|
|
this.password = password_;
|
2015-07-06 18:41:28 +01:00
|
|
|
this.proxy = null;
|
2017-05-08 01:35:08 +02:00
|
|
|
this.hostname = this.getDefaultHostname();
|
2014-11-20 13:21:19 +00:00
|
|
|
this.static_exeDirName = "exe";
|
|
|
|
|
this.maxUploadingJob = 1;
|
|
|
|
|
this.nbCores = -1; // ie not set
|
2021-11-16 14:51:53 +00:00
|
|
|
this.maxAllowedMemory = -1; // ie not set
|
2017-04-25 13:06:23 +02:00
|
|
|
this.maxRenderTime = -1; // ie not set
|
2017-03-19 17:38:22 +01:00
|
|
|
this.priority = 19; // default lowest
|
2015-03-31 23:06:21 +01:00
|
|
|
this.computeMethod = null;
|
2014-11-20 13:21:19 +00:00
|
|
|
this.GPUDevice = null;
|
2018-08-18 01:44:40 +02:00
|
|
|
this.userHasSpecifiedACacheDir = false;
|
2018-08-24 19:46:03 +02:00
|
|
|
this.detectGPUs = true;
|
2014-11-20 13:21:19 +00:00
|
|
|
this.workingDirectory = null;
|
2020-10-21 22:03:09 +11:00
|
|
|
this.sharedDownloadsDirectory = null;
|
2014-11-20 13:21:19 +00:00
|
|
|
this.storageDirectory = null;
|
|
|
|
|
this.setCacheDir(cache_dir_);
|
|
|
|
|
this.printLog = false;
|
2024-05-05 10:55:46 +00:00
|
|
|
this.debugLevel = false;
|
2014-11-20 13:21:19 +00:00
|
|
|
this.requestTime = null;
|
2020-07-28 00:49:36 +10:00
|
|
|
this.shutdownTime = -1;
|
|
|
|
|
this.shutdownMode = "soft";
|
2014-11-20 13:21:19 +00:00
|
|
|
this.extras = "";
|
2015-04-03 19:50:58 +01:00
|
|
|
this.autoSignIn = false;
|
2021-05-15 16:47:20 +02:00
|
|
|
this.useSysTray = false;
|
2021-07-16 23:37:24 +00:00
|
|
|
this.headless = java.awt.GraphicsEnvironment.isHeadless();
|
2015-04-08 20:37:53 +01:00
|
|
|
this.UIType = null;
|
2020-04-14 23:24:28 +10:00
|
|
|
this.theme = null;
|
2024-03-26 14:08:46 +00:00
|
|
|
this.disableLargeDownloads = false;
|
2024-06-08 03:21:33 +00:00
|
|
|
this.incompatibleProcess = null;
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return string formatted with SheepIt Admin Log Viewer in mind
|
|
|
|
|
*/
|
2024-06-07 14:30:24 +00:00
|
|
|
@Override public String toString() {
|
2024-06-06 03:04:34 +02:00
|
|
|
String c = " CFG: ";
|
|
|
|
|
String n ="\n";
|
2022-09-10 10:10:57 +00:00
|
|
|
return
|
2023-07-30 21:36:27 +00:00
|
|
|
c + "version: " + getJarVersion() + n +
|
|
|
|
|
c + "configFilePath: " + configFilePath + n +
|
2024-04-14 09:27:52 +00:00
|
|
|
c + "logDir: " + (logDirectory == null ? "NULL" : logDirectory) + n +
|
2022-09-10 10:10:57 +00:00
|
|
|
c + "workingDirectory: " + workingDirectory + n +
|
|
|
|
|
c + "sharedDownloadsDirectory: " + sharedDownloadsDirectory + n +
|
|
|
|
|
c + "storageDirectory: " + storageDirectory + n +
|
|
|
|
|
c + "userHasSpecifiedACacheDir: " + userHasSpecifiedACacheDir + n +
|
|
|
|
|
c + "static_exeDirName: " + static_exeDirName + n +
|
|
|
|
|
c + "login: " + login + n +
|
|
|
|
|
c + "proxy: " + proxy + n +
|
|
|
|
|
c + "maxUploadingJob: " + maxUploadingJob + n +
|
|
|
|
|
c + "nbCores: " + nbCores + n +
|
|
|
|
|
c + "maxAllowedMemory: " + maxAllowedMemory + n +
|
|
|
|
|
c + "maxRenderTime: " + maxRenderTime + n +
|
|
|
|
|
c + "priority: " + priority + n +
|
|
|
|
|
c + "computeMethod: " + computeMethod + n +
|
|
|
|
|
c + "GPUDevice: " + GPUDevice + n +
|
|
|
|
|
c + "detectGPUs: " + detectGPUs + n +
|
|
|
|
|
c + "printLog: " + printLog + n +
|
2024-05-05 10:55:46 +00:00
|
|
|
c + "debugLog: " + debugLevel + n +
|
2022-09-10 10:10:57 +00:00
|
|
|
c + "requestTime: " + requestTime + n +
|
|
|
|
|
c + "shutdownTime: " + shutdownTime + n +
|
|
|
|
|
c + "shutdownMode: " + shutdownMode + n +
|
|
|
|
|
c + "extras: " + extras + n +
|
|
|
|
|
c + "autoSignIn: " + autoSignIn + n +
|
|
|
|
|
c + "useSysTray: " + useSysTray + n +
|
|
|
|
|
c + "headless: " + headless + n +
|
|
|
|
|
c + "UIType: " + UIType + n +
|
|
|
|
|
c + "hostname: " + hostname + n +
|
2024-03-26 14:08:46 +00:00
|
|
|
c + "theme: " + theme + n +
|
2024-06-08 03:21:33 +00:00
|
|
|
c + "incompatibleProcess: " + incompatibleProcess + n +
|
2024-03-26 14:08:46 +00:00
|
|
|
c + "disableLargeDownloads: " + disableLargeDownloads;
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
2020-05-28 13:28:42 +02:00
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Sets the priority that Blender will be started with
|
|
|
|
|
* @param priority integer that will be clamped between 19 and -19,
|
|
|
|
|
* lowest to highest in terms of priority
|
|
|
|
|
*/
|
2023-10-19 11:09:08 +00:00
|
|
|
public void setPriority(int priority) {
|
2017-01-05 09:58:27 +01:00
|
|
|
if (priority > 19)
|
|
|
|
|
priority = 19;
|
2023-10-19 11:09:08 +00:00
|
|
|
else if (priority < -19)
|
2017-01-05 09:58:27 +01:00
|
|
|
priority = -19;
|
|
|
|
|
|
|
|
|
|
this.priority = priority;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Returns ordinal integer of the computeMethod enum
|
|
|
|
|
* @return ordinal integer of the computeMethod enum
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public int computeMethodToInt() {
|
|
|
|
|
return this.computeMethod.ordinal();
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Sets and optionally creates cache directory
|
|
|
|
|
* @param cache_dir_ File representing cache directory
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public void setCacheDir(File cache_dir_) {
|
|
|
|
|
removeWorkingDirectory();
|
|
|
|
|
if (cache_dir_ == null) {
|
2018-08-18 01:44:40 +02:00
|
|
|
this.userHasSpecifiedACacheDir = false;
|
2014-11-20 13:21:19 +00:00
|
|
|
try {
|
|
|
|
|
this.workingDirectory = File.createTempFile("farm_", "");
|
|
|
|
|
this.workingDirectory.createNewFile(); // hoho...
|
|
|
|
|
this.workingDirectory.delete(); // hoho
|
|
|
|
|
this.workingDirectory.mkdir();
|
|
|
|
|
this.workingDirectory.deleteOnExit();
|
2017-04-30 22:34:16 +02:00
|
|
|
|
2020-05-28 13:28:42 +02:00
|
|
|
// since there is no working directory and the client will be working in the system temp directory,
|
2017-04-30 22:34:16 +02:00
|
|
|
// we can also set up a 'permanent' directory for immutable files (like renderer binary)
|
|
|
|
|
|
|
|
|
|
this.storageDirectory = new File(this.workingDirectory.getParent() + File.separator + "sheepit_binary_cache");
|
|
|
|
|
this.storageDirectory.mkdir();
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
2018-08-18 01:44:40 +02:00
|
|
|
this.userHasSpecifiedACacheDir = true;
|
2018-08-18 02:03:51 +02:00
|
|
|
this.workingDirectory = new File(cache_dir_.getAbsolutePath() + File.separator + "sheepit");
|
|
|
|
|
this.storageDirectory = new File(cache_dir_.getAbsolutePath() + File.separator + "sheepit_binary_cache");
|
2018-12-18 22:46:28 +01:00
|
|
|
this.workingDirectory.mkdirs();
|
|
|
|
|
this.storageDirectory.mkdirs();
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
|
2020-10-21 22:03:09 +11:00
|
|
|
if (this.sharedDownloadsDirectory != null) {
|
|
|
|
|
this.sharedDownloadsDirectory.mkdirs();
|
|
|
|
|
|
|
|
|
|
if (!this.sharedDownloadsDirectory.exists()) {
|
|
|
|
|
System.err.println("Configuration::setCacheDir Unable to create common directory " + this.sharedDownloadsDirectory.getAbsolutePath());
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return the storage directory or the working directory if the former is not defined
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public File getStorageDir() {
|
2023-11-22 17:10:16 +00:00
|
|
|
return this.storageDirectory == null ? this.workingDirectory : this.storageDirectory;
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return the user specified cache directory or null if it hasn't been specified
|
|
|
|
|
*/
|
2018-08-18 02:03:51 +02:00
|
|
|
public File getCacheDirForSettings() {
|
2023-11-22 17:10:16 +00:00
|
|
|
// when the user has a cache directory specified,
|
|
|
|
|
// a "sheepit" and "sheepit_binary_cache" directory is to be automatically created
|
|
|
|
|
return this.userHasSpecifiedACacheDir == false ? null : this.workingDirectory.getParentFile();
|
2018-08-18 02:03:51 +02:00
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return string-representation of the hostname or an empty string if an error was encountered
|
|
|
|
|
*/
|
2017-05-08 01:35:08 +02:00
|
|
|
public String getDefaultHostname() {
|
|
|
|
|
try {
|
|
|
|
|
return InetAddress.getLocalHost().getHostName();
|
|
|
|
|
}
|
|
|
|
|
catch (UnknownHostException e) {
|
2017-07-22 12:20:28 +02:00
|
|
|
return "";
|
2017-05-08 01:35:08 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Deletes the working and storage directories
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public void cleanWorkingDirectory() {
|
|
|
|
|
this.cleanDirectory(this.workingDirectory);
|
|
|
|
|
this.cleanDirectory(this.storageDirectory);
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Cleans a directory and removes files in it from the md5 cache
|
|
|
|
|
* @param dir representing the directory to be cleaned
|
|
|
|
|
* @return false if the dir null, true otherwise
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public boolean cleanDirectory(File dir) {
|
|
|
|
|
if (dir == null) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
File[] files = dir.listFiles();
|
|
|
|
|
if (files != null) {
|
2015-01-25 18:36:39 +00:00
|
|
|
for (File file : files) {
|
2014-11-20 13:21:19 +00:00
|
|
|
if (file.isDirectory()) {
|
|
|
|
|
Utils.delete(file);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
try {
|
|
|
|
|
String extension = file.getName().substring(file.getName().lastIndexOf('.')).toLowerCase();
|
|
|
|
|
String name = file.getName().substring(0, file.getName().length() - 1 * extension.length());
|
2024-06-07 14:35:47 +00:00
|
|
|
if (".zip".equals(extension) || ".wool".equals(extension)) {
|
2014-11-20 13:21:19 +00:00
|
|
|
// check if the md5 of the file is ok
|
|
|
|
|
String md5_local = Utils.md5(file.getAbsolutePath());
|
|
|
|
|
|
|
|
|
|
if (md5_local.equals(name) == false) {
|
|
|
|
|
file.delete();
|
|
|
|
|
}
|
2023-11-22 17:45:34 +00:00
|
|
|
|
|
|
|
|
// TODO: remove old one
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
file.delete();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (StringIndexOutOfBoundsException e) { // because the file does not have an . in his path
|
|
|
|
|
file.delete();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* Cleans working directory and also deletes it if the user hasn't specified a cache directory
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public void removeWorkingDirectory() {
|
2018-08-18 01:44:40 +02:00
|
|
|
if (this.userHasSpecifiedACacheDir) {
|
2014-11-20 13:21:19 +00:00
|
|
|
this.cleanWorkingDirectory();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
Utils.delete(this.workingDirectory);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return a list of archives (files with extensions .zip or .wool) in the
|
|
|
|
|
* working, storage, and shared downloads directories as long as they are not null
|
|
|
|
|
*/
|
2014-11-20 13:21:19 +00:00
|
|
|
public List<File> getLocalCacheFiles() {
|
|
|
|
|
List<File> files_local = new LinkedList<File>();
|
|
|
|
|
List<File> files = new LinkedList<File>();
|
|
|
|
|
if (this.workingDirectory != null) {
|
2017-12-31 15:19:27 +01:00
|
|
|
File[] filesInDirectory = this.workingDirectory.listFiles();
|
|
|
|
|
if (filesInDirectory != null) {
|
|
|
|
|
files.addAll(Arrays.asList(filesInDirectory));
|
|
|
|
|
}
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
|
|
|
|
if (this.storageDirectory != null) {
|
2017-12-31 15:19:27 +01:00
|
|
|
File[] filesInDirectory = this.storageDirectory.listFiles();
|
|
|
|
|
if (filesInDirectory != null) {
|
|
|
|
|
files.addAll(Arrays.asList(filesInDirectory));
|
|
|
|
|
}
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
2020-10-21 22:03:09 +11:00
|
|
|
if (this.sharedDownloadsDirectory != null) {
|
|
|
|
|
File[] filesInDirectory = this.sharedDownloadsDirectory.listFiles();
|
|
|
|
|
if (filesInDirectory != null) {
|
|
|
|
|
files.addAll(Arrays.asList(filesInDirectory));
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-11-20 13:21:19 +00:00
|
|
|
|
|
|
|
|
for (File file : files) {
|
|
|
|
|
if (file.isFile()) {
|
|
|
|
|
try {
|
|
|
|
|
String extension = file.getName().substring(file.getName().lastIndexOf('.')).toLowerCase();
|
|
|
|
|
String name = file.getName().substring(0, file.getName().length() - 1 * extension.length());
|
2024-06-07 14:35:47 +00:00
|
|
|
if (".zip".equals(extension) || ".wool".equals(extension)) {
|
2014-11-20 13:21:19 +00:00
|
|
|
// check if the md5 of the file is ok
|
|
|
|
|
String md5_local = Utils.md5(file.getAbsolutePath());
|
|
|
|
|
|
|
|
|
|
if (md5_local.equals(name)) {
|
|
|
|
|
files_local.add(file);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (StringIndexOutOfBoundsException e) { // because the file does not have an . his path
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return files_local;
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-06 14:43:14 +00:00
|
|
|
/**
|
|
|
|
|
* Runs through all SheepIt related directories and checks if files and folders are all readable, writeable
|
|
|
|
|
* and in case of directories, checks if the contents can be listed and if usable space is enough.
|
|
|
|
|
* Only logs instances where something was detected, otherwise is it will only print "FilesystemHealthCheck started"
|
2023-10-19 10:33:48 +00:00
|
|
|
* @return an ArrayList of Strings containing all logs of the FSHealth check
|
2023-01-06 14:43:14 +00:00
|
|
|
*/
|
2024-06-07 16:05:16 +02:00
|
|
|
public List<String> filesystemHealthCheck() {
|
2024-06-10 16:34:12 +00:00
|
|
|
List<String> logs = new ArrayList<>();
|
2023-01-06 14:43:14 +00:00
|
|
|
String f = "FSHealth: ";
|
|
|
|
|
logs.add(f + "FilesystemHealthCheck started");
|
2024-06-10 16:34:12 +00:00
|
|
|
List<File> dirsToCheck = new ArrayList<>();
|
|
|
|
|
List<File> dirsChecked = new ArrayList<>();
|
2023-01-06 14:43:14 +00:00
|
|
|
dirsToCheck.add(workingDirectory.getAbsoluteFile());
|
|
|
|
|
if (sharedDownloadsDirectory != null && dirsToCheck.contains(sharedDownloadsDirectory.getAbsoluteFile()) == false) {
|
|
|
|
|
dirsToCheck.add(sharedDownloadsDirectory.getAbsoluteFile());
|
|
|
|
|
}
|
|
|
|
|
if (storageDirectory != null && dirsToCheck.contains(storageDirectory.getAbsoluteFile()) == false) {
|
|
|
|
|
dirsToCheck.add(storageDirectory.getAbsoluteFile());
|
|
|
|
|
}
|
|
|
|
|
ListIterator<File> dirs = dirsToCheck.listIterator();
|
|
|
|
|
while (dirs.hasNext()) {
|
|
|
|
|
File dir = dirs.next();
|
|
|
|
|
dirs.remove();
|
|
|
|
|
dirsChecked.add(dir);
|
|
|
|
|
File[] fileList = dir.listFiles();
|
|
|
|
|
if (fileList == null) {
|
|
|
|
|
logs.add(f + "File list of " + dir + " is null");
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
for (File file : fileList) {
|
|
|
|
|
file = file.getAbsoluteFile();
|
|
|
|
|
//logs.add(f + file);
|
|
|
|
|
boolean canRead = file.canRead();
|
|
|
|
|
boolean canWrite = file.canWrite();
|
|
|
|
|
boolean isDir = file.isDirectory();
|
|
|
|
|
if (canRead == false) {
|
|
|
|
|
logs.add(f + "Can't read from " + file);
|
|
|
|
|
}
|
|
|
|
|
if (canWrite == false) {
|
|
|
|
|
logs.add(f + "Can't write to " + file);
|
|
|
|
|
}
|
|
|
|
|
if (canRead && canWrite && isDir) {
|
|
|
|
|
if (dirsChecked.contains(file)) {
|
|
|
|
|
logs.add(f + "Dir " + file + " already checked. Loop detected");
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
dirs.add(file);
|
|
|
|
|
}
|
|
|
|
|
long usableSpace = file.getUsableSpace();
|
|
|
|
|
if (usableSpace < 512 * 1024) {
|
|
|
|
|
logs.add(f + "Usable space is " + usableSpace + " for " + file);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return logs;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return a string representing the version of the jar or
|
|
|
|
|
* {@code 6.0.0} if on error is encountered or the VERSION file doesn't exist
|
|
|
|
|
*/
|
2021-12-30 17:46:20 +00:00
|
|
|
private static String getJarVersion() {
|
2014-11-20 13:21:19 +00:00
|
|
|
String versionPath = "/VERSION";
|
2021-12-30 17:46:20 +00:00
|
|
|
String version = "6.0.0";
|
2014-11-20 13:21:19 +00:00
|
|
|
|
|
|
|
|
InputStream versionStream = Client.class.getResourceAsStream(versionPath);
|
2021-12-30 17:46:20 +00:00
|
|
|
if (versionStream != null) {
|
|
|
|
|
try {
|
|
|
|
|
BufferedReader in = new BufferedReader(new InputStreamReader(versionStream));
|
|
|
|
|
version = in.readLine();
|
|
|
|
|
}
|
|
|
|
|
catch (IOException ex) {
|
|
|
|
|
System.err.println("Configuration::getJarVersion error while reading manifest file (" + versionPath + "): " + ex.getMessage());
|
|
|
|
|
}
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
2021-12-30 17:46:20 +00:00
|
|
|
else {
|
|
|
|
|
System.err.println("Configuration::getJarVersion Failed to get version file");
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
2021-12-30 17:46:20 +00:00
|
|
|
return version;
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|
2014-12-17 21:47:31 +00:00
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return true if operating system is in among the supported platforms
|
|
|
|
|
* and is running in a compatible configuration
|
|
|
|
|
* false otherwise
|
|
|
|
|
* @see OS#isSupported()
|
|
|
|
|
*/
|
2014-12-17 21:47:31 +00:00
|
|
|
public boolean checkOSisSupported() {
|
2021-09-10 00:23:57 +00:00
|
|
|
return OS.getOS() != null && OS.getOS().isSupported();
|
2014-12-17 21:47:31 +00:00
|
|
|
}
|
|
|
|
|
|
2023-10-19 10:33:48 +00:00
|
|
|
/**
|
|
|
|
|
* @return true if operating system is in among the supported platforms
|
|
|
|
|
* and if we have data on the cpu
|
|
|
|
|
* false otherwise
|
|
|
|
|
* @see CPU#haveData()
|
|
|
|
|
*/
|
2015-01-05 23:04:38 +01:00
|
|
|
public boolean checkCPUisSupported() {
|
2014-12-17 21:47:31 +00:00
|
|
|
OS os = OS.getOS();
|
|
|
|
|
if (os != null) {
|
|
|
|
|
CPU cpu = os.getCPU();
|
|
|
|
|
return cpu != null && cpu.haveData();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2014-11-20 13:21:19 +00:00
|
|
|
}
|