package it.quadrata.android.quad_prox_mob;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class ClusterLogActivity extends Activity {
// Authentication credentials
private static String server;
private static String ticket;
// Node or cluster to get info for.
private static String logHost;
// Log variables
private static int errors;
private static String status;
// Epoch time variables
private long timeStart;
private long timeStop;
// Task info
private static String node;
private static String upid;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.log_list_layout);
// Cluster data retrieving
Intent logListIntent = ClusterLogActivity.this.getIntent();
server = logListIntent.getStringExtra("server");
ticket = logListIntent.getStringExtra("ticket");
logHost = logListIntent.getStringExtra("logHost");
buildLogList();
}
private void buildLogList() {
// Logs header views
final TextView logTitle = (TextView) findViewById(R.id.logTitle);
final TextView taskErrorsText = (TextView) findViewById(R.id.taskErrors);
errors = 0;
// Tasks list view and adapter
ListView taskListView = (ListView) findViewById(R.id.taskList);
final ArrayAdapter<TaskItem> taskArrayAdapter = new ArrayAdapter<TaskItem>(
this, R.layout.log_row_layout, R.id.logRow) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getTaskRowHolder(position, convertView, parent);
}
public View getTaskRowHolder(int position, View convertView,
ViewGroup parent) {
TaskRowHolder rowHolder = null;
if (convertView == null) {
LayoutInflater taskInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = taskInflater.inflate(R.layout.log_row_layout,
null);
rowHolder = new TaskRowHolder();
rowHolder.taskRowStart = (TextView) convertView
.findViewById(R.id.taskStartTime);
rowHolder.taskRowStop = (TextView) convertView
.findViewById(R.id.taskStopTime);
rowHolder.taskRowType = (TextView) convertView
.findViewById(R.id.taskType);
rowHolder.taskRowVm = (TextView) convertView
.findViewById(R.id.taskVm);
rowHolder.taskRowUser = (TextView) convertView
.findViewById(R.id.taskUser);
rowHolder.taskRowBkg = (ImageView) convertView
.findViewById(R.id.taskColor);
convertView.setTag(rowHolder);
} else {
rowHolder = (TaskRowHolder) convertView.getTag();
}
TaskItem item = getItem(position);
rowHolder.taskRowStart.setText(item.task_start);
rowHolder.taskRowStop.setText(item.task_stop);
rowHolder.taskRowType.setText(item.task_type);
rowHolder.taskRowVm.setText(item.task_id + ", "
+ item.task_node);
rowHolder.taskRowUser.setText(item.task_user);
rowHolder.taskRowBkg.setBackgroundColor(item.task_bkg);
return convertView;
}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
if (isOnline() == false) {
throw new Exception();
}
ProxmoxCustomApp httpApp = (ProxmoxCustomApp) getApplication();
HttpClient logHttpClient = httpApp.getHttpClient();
// Log list request
HttpGet logRequest = new HttpGet(server
+ "/api2/json/cluster/tasks");
logRequest.addHeader("Cookie", "PVEAuthCookie=" + ticket);
String logResponse = logHttpClient.execute(logRequest,
serverResponseHandler);
JSONObject logObject = new JSONObject(logResponse);
JSONArray logJsonArray = logObject.getJSONArray("data");
final int logJsonArrayLenght = logJsonArray.length();
// Log list items creation
JSONObject singleTaskObject = new JSONObject();
for (int i = 0; i <= (logJsonArrayLenght - 1); i++) {
singleTaskObject = logJsonArray.getJSONObject(i);
final TaskItem item = new TaskItem();
String task_node = singleTaskObject.getString("node");
String task_id = singleTaskObject.optString("id");
if (task_id.equals("")) {
task_id = "###";
}
if (logHost.length() > 0) {
boolean next;
if (task_id.length() < 1) {
next = (logHost.compareTo(task_node) != 0) ?
true : false;
}
else {
if (task_id.equals("###")) {
next = true;
}
else if (logHost.compareTo(task_id) == 0) {
next = false;
}
else {
next = (logHost.compareTo(task_node) != 0) ?
true : false;
}
}
if (next)
continue;
}
logTitle.post(new Runnable() {
public void run() {
String logInfo = "Logs: ";
logInfo += (logHost.length() > 0) ? logHost : "Cluster";
logTitle.setText(logInfo);
}
});
item.task_node = task_node;
item.task_id = task_id;
timeStart = singleTaskObject.getLong("starttime");
item.task_start = new SimpleDateFormat(
"MMM dd HH:mm:ss").format(new Date(
timeStart * 1000));
timeStop = singleTaskObject.optLong("endtime");
if (timeStop == 0) {
item.task_stop = "Running";
} else {
item.task_stop = new SimpleDateFormat(
"MMM dd HH:mm:ss").format(new Date(
timeStop * 1000));
}
item.task_type = singleTaskObject.getString("type");
item.task_user = singleTaskObject.getString("user");
status = singleTaskObject.optString("status");
if (status.equals("OK")) {
item.task_bkg = Color.parseColor("#96FF98");
} else {
if (status == "") {
item.task_bkg = Color.parseColor("#FDFF96");
} else {
errors = errors + 1;
item.task_bkg = Color.parseColor("#FF9696");
}
}
item.task_upid = singleTaskObject.getString("upid");
ClusterLogActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
taskArrayAdapter.add(item);
}
});
}
taskErrorsText.post(new Runnable() {
@Override
public void run() {
taskErrorsText.setText(Integer.toString(errors));
}
});
} catch (Exception e) {
if (e.getMessage() != null) {
Log.e(e.getClass().getName(), e.getMessage());
} else {
Log.e(e.getClass().getName(), "null");
}
showErrorDialog();
}
}
}).start();
taskListView.setAdapter(taskArrayAdapter);
taskListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
TaskItem item = (TaskItem) parent.getItemAtPosition(position);
node = item.task_node;
upid = item.task_upid;
Intent logStatsIntent = new Intent(ClusterLogActivity.this,
LogStatsActivity.class);
logStatsIntent.putExtra("server", server);
logStatsIntent.putExtra("ticket", ticket);
logStatsIntent.putExtra("node", node);
logStatsIntent.putExtra("upid", upid);
startActivity(logStatsIntent);
}
});
}
private static class TaskItem {
public String task_start;
public String task_stop;
public String task_type;
public String task_id;
public String task_node;
public String task_user;
public String task_upid;
public int task_bkg;
}
private static class TaskRowHolder {
public TextView taskRowStart;
public TextView taskRowStop;
public TextView taskRowType;
public TextView taskRowVm;
public TextView taskRowUser;
public ImageView taskRowBkg;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater nodesMenu_inflater = getMenuInflater();
nodesMenu_inflater.inflate(R.menu.log_list_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.updateLogsPref:
buildLogList();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private final ResponseHandler<String> serverResponseHandler = new ResponseHandler<String>() {
@Override
public String handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
return result;
}
};
private void showErrorDialog() {
ClusterLogActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(
ClusterLogActivity.this);
builder.setTitle("Connection error");
builder.setMessage("Unable to connect. \nDo you want to retry?");
builder.setCancelable(false);
builder.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
buildLogList();
}
});
builder.setNegativeButton("No",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
ClusterLogActivity.this.finish();
}
});
AlertDialog alertDialog = builder.create();
if (!isFinishing()) {
alertDialog.show();
}
}
});
}
public boolean isOnline() {
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
}
}