/*
* Copyright (C) 2010-2014 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
* 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;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import com.sheepit.client.hardware.cpu.CPU;
import com.sheepit.client.hardware.gpu.GPUDevice;
import com.sheepit.client.os.OS;
public class Configuration {
public enum ComputeType {
CPU_GPU, CPU, GPU
} // accept job for ...
public File workingDirectory;
public File storageDirectory; // for permanent storage (binary archive)
public boolean userSpecifiedACacheDir;
public String static_exeDirName;
private String login;
private String password;
private String proxy;
private int maxUploadingJob;
private int nbCores;
private int maxMemory; // max memory allowed for render
private int maxRenderTime; // max render time per frame allowed
private int priority;
private ComputeType computeMethod;
private GPUDevice GPUDevice;
private boolean printLog;
public List<Pair<Calendar, Calendar>> requestTime;
private String extras;
private boolean autoSignIn;
private String UIType;
private int tileSize;
private String hostname;
public Configuration(File cache_dir_, String login_, String password_) {
this.login = login_;
this.password = password_;
this.proxy = null;
this.hostname = this.getDefaultHostname();
this.static_exeDirName = "exe";
this.maxUploadingJob = 1;
this.nbCores = -1; // ie not set
this.maxMemory = -1; // ie not set
this.maxRenderTime = -1; // ie not set
this.priority = 19; // default lowest
this.computeMethod = null;
this.GPUDevice = null;
this.userSpecifiedACacheDir = false;
this.workingDirectory = null;
this.storageDirectory = null;
this.setCacheDir(cache_dir_);
this.printLog = false;
this.requestTime = null;
this.extras = "";
this.autoSignIn = false;
this.UIType = null;
this.tileSize = -1; // ie not set
}
public String toString() {
return String.format("Configuration (workingDirectory '%s')", this.workingDirectory.getAbsolutePath());
}
public String login() {
return this.login;
}
public void setLogin(String login_) {
this.login = login_;
}
public String password() {
return this.password;
}
public void setPassword(String password_) {
this.password = password_;
}
public String getProxy() {
return this.proxy;
}
public void setProxy(String url) {
this.proxy = url;
}
public int maxUploadingJob() {
return this.maxUploadingJob;
}
public GPUDevice getGPUDevice() {
return this.GPUDevice;
}
public void setMaxUploadingJob(int max) {
this.maxUploadingJob = max;
}
public void setUseNbCores(int nbcores) {
this.nbCores = nbcores;
}
public int getNbCores() {
return this.nbCores;
}
public void setMaxMemory(int max) {
this.maxMemory = max;
}
public int getMaxMemory() {
return this.maxMemory;
}
public void setMaxRenderTime(int max) {
this.maxRenderTime = max;
}
public int getMaxRenderTime() {
return this.maxRenderTime;
}
public void setUsePriority(int priority) {
if (priority > 19)
priority = 19;
if (priority < -19)
priority = -19;
this.priority = priority;
}
public int getPriority() {
return this.priority;
}
public void setPrintLog(boolean val) {
this.printLog = val;
}
public boolean getPrintLog() {
return this.printLog;
}
public int computeMethodToInt() {
return this.computeMethod.ordinal();
}
public ComputeType getComputeMethod() {
return this.computeMethod;
}
public void setUseGPU(GPUDevice device) {
this.GPUDevice = device;
}
public void setComputeMethod(ComputeType meth) {
this.computeMethod = meth;
}
public void setCacheDir(File cache_dir_) {
removeWorkingDirectory();
if (cache_dir_ == null) {
this.userSpecifiedACacheDir = false;
try {
this.workingDirectory = File.createTempFile("farm_", "");
this.workingDirectory.createNewFile(); // hoho...
this.workingDirectory.delete(); // hoho
this.workingDirectory.mkdir();
this.workingDirectory.deleteOnExit();
// since there is no working directory and the client will be working in the system temp directory,
// 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();
}
catch (IOException e) {
e.printStackTrace();
}
}
else {
this.userSpecifiedACacheDir = true;
this.workingDirectory = cache_dir_;
this.storageDirectory = cache_dir_;
}
}
public void setStorageDir(File dir) {
if (dir != null) {
if (dir.exists() == false) {
dir.mkdir();
}
this.storageDirectory = dir;
}
}
public File getStorageDir() {
if (this.storageDirectory == null) {
return this.workingDirectory;
}
else {
return this.storageDirectory;
}
}
public boolean getUserSpecifiedACacheDir() {
return this.userSpecifiedACacheDir;
}
public void setExtras(String str) {
this.extras = str;
}
public String getExtras() {
return this.extras;
}
public void setAutoSignIn(boolean v) {
this.autoSignIn = v;
}
public boolean getAutoSignIn() {
return this.autoSignIn;
}
public void setUIType(String ui) {
this.UIType = ui;
}
public String getUIType() {
return this.UIType;
}
public void setTileSize(int size) {
this.tileSize = size;
}
public int getTileSize() {
return this.tileSize;
}
public void setHostname(String hostname_) {
this.hostname = hostname_;
}
public String getHostname() {
return this.hostname;
}
public String getDefaultHostname() {
try {
return InetAddress.getLocalHost().getHostName();
}
catch (UnknownHostException e) {
return null;
}
}
public void cleanWorkingDirectory() {
this.cleanDirectory(this.workingDirectory);
this.cleanDirectory(this.storageDirectory);
}
public boolean cleanDirectory(File dir) {
if (dir == null) {
return false;
}
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
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());
if (extension.equals(".zip")) {
// check if the md5 of the file is ok
String md5_local = Utils.md5(file.getAbsolutePath());
if (md5_local.equals(name) == false) {
file.delete();
}
// TODO: remove old one
}
else {
file.delete();
}
}
catch (StringIndexOutOfBoundsException e) { // because the file does not have an . in his path
file.delete();
}
}
}
}
return true;
}
public void removeWorkingDirectory() {
if (this.userSpecifiedACacheDir == true) {
this.cleanWorkingDirectory();
}
else {
Utils.delete(this.workingDirectory);
}
}
public List<File> getLocalCacheFiles() {
List<File> files_local = new LinkedList<File>();
List<File> files = new LinkedList<File>();
if (this.workingDirectory != null) {
files.addAll(Arrays.asList(this.workingDirectory.listFiles()));
}
if (this.storageDirectory != null) {
files.addAll(Arrays.asList(this.storageDirectory.listFiles()));
}
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());
if (extension.equals(".zip")) {
// 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;
}
public String getJarVersion() {
String versionPath = "/VERSION";
InputStream versionStream = Client.class.getResourceAsStream(versionPath);
if (versionStream == null) {
System.err.println("Configuration::getJarVersion Failed to get version file");
return "";
}
try {
InputStreamReader reader = new InputStreamReader(versionStream);
BufferedReader in = new BufferedReader(reader);
String version = in.readLine();
return version;
}
catch (IOException ex) {
System.err.println("Configuration::getJarVersion error while reading manifest file (" + versionPath + "): " + ex.getMessage());
return "";
}
}
public boolean checkOSisSupported() {
return OS.getOS() != null;
}
public boolean checkCPUisSupported() {
OS os = OS.getOS();
if (os != null) {
CPU cpu = os.getCPU();
return cpu != null && cpu.haveData();
}
return false;
}
}