/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* 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 scouter.server.netio.service.handle;
import java.io.File;
import java.io.IOException;
import scouter.io.DataInputX;
import scouter.io.DataOutputX;
import scouter.lang.pack.MapPack;
import scouter.lang.pack.TextPack;
import scouter.lang.value.BooleanValue;
import scouter.lang.value.ListValue;
import scouter.net.RequestCmd;
import scouter.net.TcpFlag;
import scouter.server.Logger;
import scouter.server.LoginManager;
import scouter.server.LoginUser;
import scouter.server.db.DBCtr;
import scouter.server.management.RemoteControl;
import scouter.server.management.RemoteControlManager;
import scouter.server.netio.service.anotation.ServiceHandler;
import scouter.util.SystemUtil;
public class ManageService {
@ServiceHandler(RequestCmd.SERVER_DB_LIST)
public void listDbFiles(DataInputX din, DataOutputX dout, boolean login) throws IOException {
String rootPath = DBCtr.getRootPath();
MapPack m = new MapPack();
ListValue nameLv = m.newList("name");
ListValue sizeLv = m.newList("size");
ListValue lastModifiedLv = m.newList("lastModified");
File dbDir = new File(rootPath);
long totalLength = 0;
if (dbDir.exists() && dbDir.isDirectory()) {
totalLength = collectDirectory(dbDir, nameLv, sizeLv, lastModifiedLv, dbDir.getAbsolutePath());
}
if (SystemUtil.IS_JAVA_1_5 == false) {
m.put("free", dbDir.getUsableSpace());
}
m.put("total", totalLength);
dout.writeByte(TcpFlag.HasNEXT);
dout.writePack(m);
dout.flush();
}
@ServiceHandler(RequestCmd.SERVER_DB_DELETE)
public void deleteDbFiles(DataInputX din, DataOutputX dout, boolean login) throws IOException {
String rootPath = DBCtr.getRootPath();
MapPack param = (MapPack) din.readPack();
ListValue fileLv = param.getList("file");
MapPack m = new MapPack();
if (fileLv != null) {
for (int i = 0; i < fileLv.size(); i++) {
String filename = fileLv.getString(i);
File file = new File(rootPath + filename);
deleteFiles(file);
}
m.put("size", fileLv.size());
}
dout.writeByte(TcpFlag.HasNEXT);
dout.writePack(m);
dout.flush();
}
@ServiceHandler(RequestCmd.REMOTE_CONTROL)
public void remoteControl(DataInputX din, DataOutputX dout, boolean login) throws IOException {
MapPack param = (MapPack) din.readPack();
long session = param.getLong("toSession");
RemoteControl control = new RemoteControl(//
param.getText("command"), //
System.currentTimeMillis(), //
param, param.getLong("fromSession"));
boolean result = RemoteControlManager.add(session, control);
Logger.println("[" + RequestCmd.REMOTE_CONTROL + "]" + control.commnad() + " from "
+ LoginManager.getUser(control.commander()).ip() + " to " + LoginManager.getUser(session).ip() + " "
+ result);
MapPack m = new MapPack();
if (result) {
m.put("success", new BooleanValue(true));
dout.writeByte(TcpFlag.HasNEXT);
dout.writePack(m);
} else {
m.put("success", new BooleanValue(false));
dout.writeByte(TcpFlag.HasNEXT);
dout.writePack(m);
}
}
@ServiceHandler(RequestCmd.REMOTE_CONTROL_ALL)
public void remoteControlAll(DataInputX din, DataOutputX dout, boolean login) throws IOException {
MapPack param = (MapPack) din.readPack();
RemoteControl control = new RemoteControl(//
param.getText("command"), //
System.currentTimeMillis(), //
param, param.getLong("fromSession"));
LoginUser[] users = LoginManager.getLoginUserList();
for (int i = 0, len = (users != null ? users.length : 0); i < len; i++) {
long session = users[i].session();
RemoteControlManager.add(session, control);
}
Logger.println("[" + RequestCmd.REMOTE_CONTROL_ALL + "]" + control.commnad() + " from "
+ LoginManager.getUser(control.commander()).ip());
}
@ServiceHandler(RequestCmd.CHECK_JOB)
public void checkJob(DataInputX din, DataOutputX dout, boolean login) throws IOException {
MapPack param = (MapPack) din.readPack();
long session = param.getLong("session");
RemoteControl control = RemoteControlManager.getCommand(session);
if (control != null) {
TextPack t = new TextPack();
t.text = control.commnad();
dout.writeByte(TcpFlag.HasNEXT);
dout.writePack(t);
dout.writeByte(TcpFlag.HasNEXT);
dout.writePack(control.param());
}
}
private long collectDirectory(File dir, ListValue nameLv, ListValue sizeLv, ListValue lastModifiedLv,
String rootPath) {
long length = 0;
for (File file : dir.listFiles()) {
if (file.isFile()) {
length += file.length();
} else {
long size = collectDirectory(file, nameLv, sizeLv, lastModifiedLv, rootPath);
nameLv.add(file.getAbsolutePath().substring(rootPath.length()));
lastModifiedLv.add(file.lastModified());
sizeLv.add(size);
length += size;
}
}
return length;
}
void deleteFiles(File file) throws IOException {
if (file.exists() == false) {
return;
}
if (file.isDirectory()) {
for (File c : file.listFiles()) {
deleteFiles(c);
}
}
file.delete();
}
}