finished managing, added page system, added pin system, added disk information, added zfs information, updated menu UI, implemented back button

main
xad1 3 years ago
parent 81ad30c03a
commit 109a7de759

@ -6,6 +6,8 @@ extern String selectedNode;
extern int selectedItem; extern int selectedItem;
extern int selectedLXC; extern int selectedLXC;
extern int selectedVM; extern int selectedVM;
extern String selectedDisk;
extern String selectedPool;
// TODO remove later // TODO remove later
#endif #endif

@ -4,7 +4,7 @@
typedef struct { typedef struct {
String name; String name;
int cpu; float cpu;
int threads; int threads;
String onlineStatus; String onlineStatus;
long long mem; long long mem;
@ -34,9 +34,29 @@ typedef struct {
long long netout; long long netout;
} VM; } VM;
typedef struct {
String devpath;
long long size;
String used;
String serial;
String model;
String vendor;
String health;
} Disk;
typedef struct {
String name;
long long free;
long long size;
String health;
} Pool;
Node *getNodeInfo(int *numNodes); Node *getNodeInfo(int *numNodes);
Container *getContainerInfo(int *numContainers, String node); Container *getContainerInfo(int *numContainers, String node);
VM *getVMInfo(int *numVMs, String node); VM *getVMInfo(int *numVMs, String node);
Disk *getDiskInfo(int *numDisks, String node);
Pool *getPoolInfo(int *numPools, String node);
#endif /* JSON_RETRIEVE_H */ #endif /* JSON_RETRIEVE_H */

@ -3,6 +3,10 @@
#include <Arduino.h> #include <Arduino.h>
void restartVM(String node, int vmid); void restartVM(String node, int vmid);
void restartContainer(String node, int containerid); void restartContainer(String node, int containerid);
void restartNode(String node); void startVM(String node, int vmid);
void startContainer(String node, int containerid);
void stopVM(String node, int vmid);
void stopContainer(String node, int containerid);
#endif /* JSON_SEND_H */ #endif /* JSON_SEND_H */

@ -6,5 +6,7 @@
Node getNode(String name); Node getNode(String name);
Container getContainer(int id, String node); Container getContainer(int id, String node);
VM getVM(int id, String node); VM getVM(int id, String node);
Disk getDisk(String devpath, String node);
Pool getPool(String name, String node);
#endif /* JSON_UTILS_H */ #endif /* JSON_UTILS_H */

@ -1,5 +1,11 @@
#ifndef MANAGE_H #ifndef MANAGE_H
#define MANAGE_H #define MANAGE_H
void vmRestart();
void containerRestart();
void vmStart();
void containerStart();
void vmStop();
void containerStop();
#endif /* MANAGE_H */ #endif /* MANAGE_H */

@ -12,8 +12,13 @@ typedef struct {
void listNodes(Node* nodes, int numItems); void listNodes(Node* nodes, int numItems);
void listContainers(Container* containers, int numItems); void listContainers(Container* containers, int numItems);
void listVMs(VM* vms, int numItems); void listVMs(VM* vms, int numItems);
void listDisks(Disk* disks, int numItems);
void listPools(Pool* pools, int numItems);
void mainMenu(); void mainMenu();
void manageContainerMenu();
void manageVMMenu();
extern int selectedItem; extern int selectedItem;
extern int selectedPage;
#endif #endif

@ -0,0 +1,14 @@
#ifndef PIN_H
#define PIN_H
#include <Arduino.h>
const String LOCK_PIN = "";
/**
* 0 = A Button
* 1 = B Button
* 2 = Down
* 3 = Up
* 4 = Right
* 5 = Left
*/
#endif /* PIN_H */

@ -3,5 +3,7 @@
void nodeInfo(); void nodeInfo();
void containerInfo(); void containerInfo();
void vmInfo(); void vmInfo();
void diskInfo();
void poolInfo();
#endif /* STATISTICS_H */ #endif /* STATISTICS_H */

@ -4,5 +4,7 @@
void displayError(String message); void displayError(String message);
void connectWiFi(); void connectWiFi();
bool enterPin();
int pinListener();
#endif /* UTILS_H */ #endif /* UTILS_H */

@ -19,7 +19,7 @@ Node *getNodeInfo(int *numNodes)
if (httpCode > 0) if (httpCode > 0)
{ {
String json = http.getString(); String json = http.getString();
DynamicJsonDocument doc(6144); DynamicJsonDocument doc(8096);
deserializeJson(doc, json); deserializeJson(doc, json);
JsonArray nodes = doc["data"].as<JsonArray>(); JsonArray nodes = doc["data"].as<JsonArray>();
@ -28,7 +28,7 @@ Node *getNodeInfo(int *numNodes)
for (int i = 0; i < nodes.size(); i++) for (int i = 0; i < nodes.size(); i++)
{ {
nodeArray[i].name = nodes[i]["node"].as<String>(); nodeArray[i].name = nodes[i]["node"].as<String>();
nodeArray[i].cpu = nodes[i]["cpu"].as<int>(); nodeArray[i].cpu = nodes[i]["cpu"].as<float>();
nodeArray[i].threads = nodes[i]["maxcpu"].as<int>(); nodeArray[i].threads = nodes[i]["maxcpu"].as<int>();
nodeArray[i].onlineStatus = nodes[i]["status"].as<String>(); nodeArray[i].onlineStatus = nodes[i]["status"].as<String>();
nodeArray[i].mem = nodes[i]["mem"].as<long long>(); nodeArray[i].mem = nodes[i]["mem"].as<long long>();
@ -58,7 +58,7 @@ Container *getContainerInfo(int *numContainers, String node)
if (httpCode > 0) if (httpCode > 0)
{ {
String json = http.getString(); String json = http.getString();
DynamicJsonDocument doc(1024); DynamicJsonDocument doc(8096);
deserializeJson(doc, json); deserializeJson(doc, json);
JsonArray containers = doc["data"].as<JsonArray>(); JsonArray containers = doc["data"].as<JsonArray>();
Container *containerArray = new Container[containers.size()]; Container *containerArray = new Container[containers.size()];
@ -94,7 +94,7 @@ VM *getVMInfo(int *numVMs, String node)
if (httpCode > 0) if (httpCode > 0)
{ {
String json = http.getString(); String json = http.getString();
DynamicJsonDocument doc(1024); DynamicJsonDocument doc(8096);
deserializeJson(doc, json); deserializeJson(doc, json);
JsonArray vms = doc["data"].as<JsonArray>(); JsonArray vms = doc["data"].as<JsonArray>();
VM *vmArray = new VM[vms.size()]; VM *vmArray = new VM[vms.size()];
@ -115,4 +115,74 @@ VM *getVMInfo(int *numVMs, String node)
return vmArray; return vmArray;
} }
throw std::runtime_error("Can't get VM info: HTTP request failed with code: " + httpCode); throw std::runtime_error("Can't get VM info: HTTP request failed with code: " + httpCode);
}
Disk *getDiskInfo(int *numDisks, String node)
{
HTTPClient http;
String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/disks/list";
String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET;
char authc[auth.length() + 1];
auth.toCharArray(authc, auth.length() + 1);
http.begin(apiAddress);
http.setAuthorization(authc);
int httpCode = http.GET();
if (httpCode > 0)
{
String json = http.getString();
DynamicJsonDocument doc(32768);
deserializeJson(doc, json);
JsonArray disks = doc["data"].as<JsonArray>();
Disk *diskArray = new Disk[disks.size()];
for (int i = 0; i < disks.size(); i++)
{
Serial.println(disks[i]["devpath"].as<String>());
diskArray[i].devpath = disks[i]["devpath"].as<String>();
diskArray[i].size = disks[i]["size"].as<long long>();
diskArray[i].used = disks[i]["used"].as<String>();
diskArray[i].serial = disks[i]["serial"].as<String>();
diskArray[i].model = disks[i]["model"].as<String>();
diskArray[i].vendor = disks[i]["vendor"].as<String>();
diskArray[i].health = disks[i]["health"].as<String>();
}
*numDisks = disks.size();
return diskArray;
}
throw std::runtime_error("Can't get disk info: HTTP request failed with code: " + httpCode);
}
Pool *getPoolInfo(int *numPools, String node)
{
HTTPClient http;
String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/disks/zfs";
String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET;
char authc[auth.length() + 1];
auth.toCharArray(authc, auth.length() + 1);
http.begin(apiAddress);
http.setAuthorization(authc);
int httpCode = http.GET();
if (httpCode > 0)
{
String json = http.getString();
DynamicJsonDocument doc(32768);
deserializeJson(doc, json);
JsonArray pools = doc["data"].as<JsonArray>();
Pool *poolArray = new Pool[pools.size()];
for (int i = 0; i < pools.size(); i++)
{
poolArray[i].name = pools[i]["name"].as<String>();
poolArray[i].free = pools[i]["free"].as<long long>();
poolArray[i].size = pools[i]["size"].as<long long>();
poolArray[i].health = pools[i]["health"].as<String>();
}
*numPools = pools.size();
return poolArray;
}
throw std::runtime_error("Can't get pool info: HTTP request failed with code: " + httpCode);
} }

@ -39,10 +39,10 @@ void restartContainer(String node, int containerid)
} }
} }
void restartNode(String node) void startVM(String node, int vmid)
{ {
HTTPClient http; HTTPClient http;
String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/status/reboot"; String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/qemu/" + vmid + "/status/start";
String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET; String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET;
char authc[auth.length() + 1]; char authc[auth.length() + 1];
auth.toCharArray(authc, auth.length() + 1); auth.toCharArray(authc, auth.length() + 1);
@ -52,7 +52,57 @@ void restartNode(String node)
http.end(); http.end();
if(httpCode == 0) { if(httpCode == 0) {
throw std::runtime_error("Can't restart container. Error code: " + httpCode); throw std::runtime_error("Can't start VM. Error code: " + httpCode);
} }
} }
void startContainer(String node, int containerid)
{
HTTPClient http;
String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/lxc/" + containerid + "/status/start";
String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET;
char authc[auth.length() + 1];
auth.toCharArray(authc, auth.length() + 1);
http.begin(apiAddress);
http.setAuthorization(authc);
int httpCode = http.POST("");
http.end();
if(httpCode == 0) {
throw std::runtime_error("Can't start container. Error code: " + httpCode);
}
}
void stopVM(String node, int vmid)
{
HTTPClient http;
String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/qemu/" + vmid + "/status/stop";
String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET;
char authc[auth.length() + 1];
auth.toCharArray(authc, auth.length() + 1);
http.begin(apiAddress);
http.setAuthorization(authc);
int httpCode = http.POST("");
http.end();
if(httpCode == 0) {
throw std::runtime_error("Can't stop VM. Error code: " + httpCode);
}
}
void stopContainer(String node, int containerid)
{
HTTPClient http;
String apiAddress = PROXMOX_ADDRESS + "/api2/json/nodes/" + node + "/lxc/" + containerid + "/status/stop";
String auth = "PVEAPIToken=" + PROXMOX_TOKEN_USER + "!" + PROXMOX_TOKEN_NAME + "=" + PROXMOX_TOKEN_SECRET;
char authc[auth.length() + 1];
auth.toCharArray(authc, auth.length() + 1);
http.begin(apiAddress);
http.setAuthorization(authc);
int httpCode = http.POST("");
http.end();
if(httpCode == 0) {
throw std::runtime_error("Can't stop container. Error code: " + httpCode);
}
}

@ -50,3 +50,35 @@ VM getVM(int id, String node)
throw std::runtime_error("Can't find the requested vm in the array"); throw std::runtime_error("Can't find the requested vm in the array");
} }
Disk getDisk(String devpath, String node)
{
int numDisks;
Disk *disks = getDiskInfo(&numDisks, node);
for (int i = 0; i < numDisks; i++)
{
if (disks[i].devpath == devpath)
{
return disks[i];
}
}
throw std::runtime_error("Can't find the requested disk in the array");
}
Pool getPool(String name, String node)
{
int numPools;
Pool *pools = getPoolInfo(&numPools, node);
for (int i = 0; i < numPools; i++)
{
if (pools[i].name == name)
{
return pools[i];
}
}
throw std::runtime_error("Can't find the requested pool in the array");
}

@ -7,16 +7,9 @@
#include <menu.h> #include <menu.h>
#include <json/retrieve.h> #include <json/retrieve.h>
void setup()
{
Serial.begin(115200);
GO.begin();
connectWiFi();
}
void loop() void loop()
{ {
if (WiFi.status() != WL_CONNECTED) if (WiFi.status() != WL_CONNECTED)
{ {
displayError("WiFi Connection Lost"); displayError("WiFi Connection Lost");
@ -28,7 +21,9 @@ void loop()
int numNodes; int numNodes;
Node *nodes = getNodeInfo(&numNodes); Node *nodes = getNodeInfo(&numNodes);
listNodes(nodes, numNodes); listNodes(nodes, numNodes);
delete[] nodes;
selectedItem = 0; selectedItem = 0;
selectedPage = 0;
mainMenu(); mainMenu();
} }
catch (const std::exception &e) catch (const std::exception &e)
@ -36,5 +31,18 @@ void loop()
Serial.println(e.what()); Serial.println(e.what());
displayError(e.what()); displayError(e.what());
} }
}
void setup()
{
Serial.begin(115200);
GO.begin();
GO.lcd.setTextWrap(false);
bool pinCorrect = false;
while (!pinCorrect) {
pinCorrect = enterPin();
}
connectWiFi();
Serial.println("done setup");
}
}

@ -6,22 +6,52 @@
#include <odroid_go.h> #include <odroid_go.h>
#include <utils.h> #include <utils.h>
void nodeRestart() void vmRestart()
{ {
Serial.println("node restart"); Serial.println("vm restart");
selectedItem = 0; selectedItem = 0;
int numVMs;
VM *vms = getVMInfo(&numVMs, selectedNode);
if (vms != NULL)
{
listVMs(vms, numVMs);
delete[] vms;
restartVM(selectedNode, selectedVM);
restartNode(selectedNode); GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0);
GO.lcd.println("done");
delay(2000);
manageVMMenu();
}
}
void containerRestart()
{
Serial.println("lxc restart");
selectedItem = 0;
int numContainers;
Container *containers = getContainerInfo(&numContainers, selectedNode);
if (containers != NULL)
{
listContainers(containers, numContainers);
delete[] containers;
GO.lcd.clearDisplay(); restartContainer(selectedNode, selectedLXC);
GO.lcd.println("done"); GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0);
GO.lcd.println("done");
delay(2000); delay(2000);
manageContainerMenu();
}
} }
void vmRestart()
void vmStart()
{ {
Serial.println("vm restart"); Serial.println("vm start");
selectedItem = 0; selectedItem = 0;
int numVMs; int numVMs;
VM *vms = getVMInfo(&numVMs, selectedNode); VM *vms = getVMInfo(&numVMs, selectedNode);
@ -29,7 +59,7 @@ void vmRestart()
{ {
listVMs(vms, numVMs); listVMs(vms, numVMs);
restartVM(selectedNode, selectedVM); startVM(selectedNode, selectedVM);
GO.lcd.clearDisplay(); GO.lcd.clearDisplay();
GO.lcd.println("done"); GO.lcd.println("done");
@ -38,9 +68,9 @@ void vmRestart()
} }
} }
void containerRestart() void containerStart()
{ {
Serial.println("lxc restart"); Serial.println("lxc start");
selectedItem = 0; selectedItem = 0;
int numContainers; int numContainers;
Container *containers = getContainerInfo(&numContainers, selectedNode); Container *containers = getContainerInfo(&numContainers, selectedNode);
@ -48,7 +78,26 @@ void containerRestart()
{ {
listContainers(containers, numContainers); listContainers(containers, numContainers);
restartContainer(selectedNode, selectedLXC); startContainer(selectedNode, selectedLXC);
GO.lcd.clearDisplay();
GO.lcd.println("done");
delay(2000);
}
}
void vmStop()
{
Serial.println("vm stop");
selectedItem = 0;
int numVMs;
VM *vms = getVMInfo(&numVMs, selectedNode);
if (vms != NULL)
{
listVMs(vms, numVMs);
stopVM(selectedNode, selectedVM);
GO.lcd.clearDisplay(); GO.lcd.clearDisplay();
GO.lcd.println("done"); GO.lcd.println("done");
@ -56,104 +105,20 @@ void containerRestart()
} }
} }
void containerStop()
{
Serial.println("lxc stop");
selectedItem = 0;
int numContainers;
Container *containers = getContainerInfo(&numContainers, selectedNode);
if (containers != NULL)
{
listContainers(containers, numContainers);
stopContainer(selectedNode, selectedLXC);
GO.lcd.clearDisplay();
GO.lcd.println("done");
// void nodeStart() delay(2000);
// { }
// Serial.println("node start"); }
// selectedItem = 0;
// startNode(selectedNode);
// GO.lcd.clearDisplay();
// GO.lcd.println("done");
// delay(2000);
// }
// void vmStart()
// {
// Serial.println("vm start");
// selectedItem = 0;
// int numVMs;
// VM *vms = getVMInfo(&numVMs, selectedNode);
// if (vms != NULL)
// {
// listVMs(vms, numVMs);
// startVM(selectedNode, selectedVM);
// GO.lcd.clearDisplay();
// GO.lcd.println("done");
// delay(2000);
// }
// }
// void containerStart()
// {
// Serial.println("lxc start");
// selectedItem = 0;
// int numContainers;
// Container *containers = getContainerInfo(&numContainers, selectedNode);
// if (containers != NULL)
// {
// listContainers(containers, numContainers);
// startContainer(selectedNode, selectedLXC);
// GO.lcd.clearDisplay();
// GO.lcd.println("done");
// delay(2000);
// }
// }
// void nodeStop()
// {
// Serial.println("node stop");
// selectedItem = 0;
// stopNode(selectedNode);
// GO.lcd.clearDisplay();
// GO.lcd.println("done");
// delay(2000);
// }
// void vmStop()
// {
// Serial.println("vm stop");
// selectedItem = 0;
// int numVMs;
// VM *vms = getVMInfo(&numVMs, selectedNode);
// if (vms != NULL)
// {
// listVMs(vms, numVMs);
// stopVM(selectedNode, selectedVM);
// GO.lcd.clearDisplay();
// GO.lcd.println("done");
// delay(2000);
// }
// }
// void containerStop()
// {
// Serial.println("lxc stop");
// selectedItem = 0;
// int numContainers;
// Container *containers = getContainerInfo(&numContainers, selectedNode);
// if (containers != NULL)
// {
// listContainers(containers, numContainers);
// stopContainer(selectedNode, selectedLXC);
// GO.lcd.clearDisplay();
// GO.lcd.println("done");
// delay(2000);
// }
// }

@ -4,167 +4,304 @@
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <statistics.h> #include <statistics.h>
#include <global.h> #include <global.h>
#include <manage.h>
const int MAIN_TEXT_COLOR = WHITE; const int MAIN_TEXT_COLOR = WHITE;
const int MAIN_TEXT_SIZE = 2; const int MAIN_TEXT_SIZE = 2;
const int ITEMS_PER_PAGE = 12;
int selectedItem = 0; int selectedItem = 0;
int selectedPage = 0;
String selectedNode = ""; String selectedNode = "";
int selectedLXC = 0; int selectedLXC = 0;
int selectedVM = 0; int selectedVM = 0;
String selectedDisk = "";
String selectedPool = "";
// Array of the main menu items // Array of the main menu items
MenuItem mainMenuItems[] = { MenuItem mainMenuItems[] = {
{"Node Information", &nodeInfo}, {"Node Information", &nodeInfo},
{"Container Information", &containerInfo}, {"Container Information", &containerInfo},
{"VM Information", &vmInfo} {"VM Information", &vmInfo},
{"Disk Information", &diskInfo},
{"ZFS Pool Information", &poolInfo},
{"Manage VM", &manageVMMenu},
{"Manage Container", &manageContainerMenu}};
MenuItem manageVMItems[] = {
{"Restart", &vmRestart},
{"Start", &vmStart},
{"Stop", &vmStop},
}; };
MenuItem manageContainerItems[] = {
{"Restart", &containerRestart},
{"Start", &containerStart},
{"Stop", &containerStop},
};
int buttonListener(int numItems) { int buttonListener(int numItems)
delay(200); {
while (true) { delay(300);
while (true)
{
GO.update(); GO.update();
if (GO.JOY_Y.isAxisPressed() == 1 && selectedItem < (numItems - 1)) { if (GO.JOY_Y.isAxisPressed() == 1 && selectedItem < (numItems - 1))
{
selectedItem++; selectedItem++;
Serial.println(selectedItem); Serial.println(selectedItem);
break; break;
} }
if (GO.JOY_Y.isAxisPressed() == 2 && selectedItem > 0) { if (GO.JOY_Y.isAxisPressed() == 2 && selectedItem > 0)
{
selectedItem--; selectedItem--;
Serial.println(selectedItem); Serial.println(selectedItem);
break; break;
} }
if (GO.BtnA.isPressed() == 1) { if (GO.JOY_X.isAxisPressed() == 1 && selectedPage + 1 < (numItems / ITEMS_PER_PAGE))
delay(300); {
selectedPage++;
selectedItem = selectedPage * ITEMS_PER_PAGE;
Serial.println(selectedPage);
break;
}
if (GO.JOY_X.isAxisPressed() == 2 && selectedPage > 0)
{
selectedPage--;
selectedItem = selectedPage * ITEMS_PER_PAGE;
Serial.println(selectedPage);
break;
}
if (GO.BtnA.isPressed() == 1)
{
delay(200);
return 1; return 1;
} }
if (GO.BtnB.isPressed() == 1) { if (GO.BtnB.isPressed() == 1)
delay(300); {
delay(200);
return 2; return 2;
} }
delay(50);
} }
return 0; return 0;
} }
void drawMenu(MenuItem menuItems[], int numItems) { void drawMenu(MenuItem menuItems[], int numItems, String menuTitle)
{
GO.lcd.clearDisplay(); GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(MAIN_TEXT_COLOR); GO.lcd.setTextColor(MAIN_TEXT_COLOR);
GO.lcd.setTextSize(MAIN_TEXT_SIZE); GO.lcd.setTextSize(MAIN_TEXT_SIZE);
GO.lcd.println(menuTitle);
GO.lcd.println("--------------------------");
for (int i = 0; i < numItems; i++) { for (int i = 0; i < numItems; i++)
if (selectedItem == i) { {
if (selectedItem == i)
{
GO.lcd.print("> "); GO.lcd.print("> ");
} }
GO.lcd.println(menuItems[i].name); GO.lcd.println(menuItems[i].name);
} }
switch (buttonListener(numItems)) { switch (buttonListener(numItems))
case 1: {
Serial.println("selected " + selectedItem); case 1:
menuItems[selectedItem].function(); Serial.println("selected " + selectedItem);
break; menuItems[selectedItem].function();
case 2: break;
Serial.println("back"); case 2:
break; Serial.println("back");
default: break;
drawMenu(menuItems, numItems); default:
break; drawMenu(menuItems, numItems, menuTitle);
break;
} }
}
void mainMenu()
{
int numItems = sizeof(mainMenuItems) / sizeof(MenuItem);
drawMenu(mainMenuItems, numItems, "Main Menu");
} }
void mainMenu(){
int numItems = sizeof(mainMenuItems) / sizeof(MenuItem); void manageVMMenu()
drawMenu(mainMenuItems, numItems); {
selectedItem = 0;
int numItems = sizeof(manageVMItems) / sizeof(MenuItem);
drawMenu(manageVMItems, numItems, "Manage VM");
mainMenu();
} }
void listNodes(Node* nodes, int numItems) { void manageContainerMenu()
{
selectedItem = 0;
int numItems = sizeof(manageContainerItems) / sizeof(MenuItem);
drawMenu(manageContainerItems, numItems, "Manage Container");
mainMenu();
}
void listNodes(Node *nodes, int numItems)
{
GO.lcd.clearDisplay(); GO.lcd.clearDisplay();
GO.lcd.setTextColor(MAIN_TEXT_COLOR); GO.lcd.setTextColor(MAIN_TEXT_COLOR);
GO.lcd.setTextSize(MAIN_TEXT_SIZE); GO.lcd.setTextSize(MAIN_TEXT_SIZE);
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.println("Select Node (Page " + String(selectedPage + 1) + ")");
GO.lcd.println("--------------------------");
for (int i = 0; i < numItems; i++) { for (int i = selectedPage * ITEMS_PER_PAGE; i < numItems && i < (selectedPage + 1) * ITEMS_PER_PAGE; i++)
if (selectedItem == i) { {
Serial.println("running loop");
if (selectedItem == i)
{
GO.lcd.print("> "); GO.lcd.print("> ");
} }
GO.lcd.println(nodes[i].name); GO.lcd.println(nodes[i].name);
} }
Serial.println("completed loop");
switch (buttonListener(numItems)) { switch (buttonListener(numItems))
case 1: {
Serial.println("selected " + selectedItem); case 1:
selectedNode = nodes[selectedItem].name; Serial.println("selected " + selectedItem);
break; selectedNode = nodes[selectedItem].name;
case 2: break;
Serial.println("back"); case 2:
break; Serial.println("back");
default: break;
listNodes(nodes, numItems); default:
break; listNodes(nodes, numItems);
break;
} }
} }
void listContainers(Container* containers, int numItems) { void listContainers(Container *containers, int numItems)
{
GO.lcd.clearDisplay(); GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(MAIN_TEXT_COLOR); GO.lcd.setTextColor(MAIN_TEXT_COLOR);
GO.lcd.setTextSize(MAIN_TEXT_SIZE); GO.lcd.setTextSize(MAIN_TEXT_SIZE);
GO.lcd.println("Select Container (Page " + String(selectedPage + 1) + ")");
GO.lcd.println("--------------------------");
for (int i = 0; i < numItems; i++) { for (int i = selectedPage * ITEMS_PER_PAGE; i < numItems && i < (selectedPage + 1) * ITEMS_PER_PAGE; i++)
if (selectedItem == i) { {
if (selectedItem == i)
{
GO.lcd.print("> "); GO.lcd.print("> ");
} }
GO.lcd.println(String(containers[i].id) + ": " + containers[i].name); GO.lcd.println(String(containers[i].id) + ": " + containers[i].name);
} }
switch (buttonListener(numItems)) { switch (buttonListener(numItems))
case 1: {
selectedLXC = containers[selectedItem].id; case 1:
break; selectedLXC = containers[selectedItem].id;
case 2: break;
Serial.println("back"); case 2:
break; Serial.println("back");
default: break;
listContainers(containers, numItems); default:
break; listContainers(containers, numItems);
break;
} }
} }
void listVMs(VM *vms, int numItems)
void listVMs(VM* vms, int numItems) { {
GO.lcd.clearDisplay(); GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(MAIN_TEXT_COLOR); GO.lcd.setTextColor(MAIN_TEXT_COLOR);
GO.lcd.setTextSize(MAIN_TEXT_SIZE); GO.lcd.setTextSize(MAIN_TEXT_SIZE);
GO.lcd.println("Select VM (Page " + String(selectedPage + 1) + ")");
GO.lcd.println("--------------------------");
for (int i = 0; i < numItems; i++) { for (int i = selectedPage * ITEMS_PER_PAGE; i < numItems && i < (selectedPage + 1) * ITEMS_PER_PAGE; i++)
if (selectedItem == i) { {
if (selectedItem == i)
{
GO.lcd.print("> "); GO.lcd.print("> ");
} }
GO.lcd.println(String(vms[i].id) + ": " + vms[i].name); GO.lcd.println(String(vms[i].id) + ": " + vms[i].name);
} }
switch (buttonListener(numItems)) { switch (buttonListener(numItems))
case 1: {
selectedVM = vms[selectedItem].id; case 1:
break; selectedVM = vms[selectedItem].id;
case 2: break;
Serial.println("back"); case 2:
break; Serial.println("back");
default: break;
listVMs(vms, numItems); default:
break; listVMs(vms, numItems);
break;
} }
}
void listDisks(Disk *disks, int numItems)
{
GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(MAIN_TEXT_COLOR);
GO.lcd.setTextSize(MAIN_TEXT_SIZE);
GO.lcd.println("Select Disk (Page " + String(selectedPage + 1) + ")");
GO.lcd.println("--------------------------");
for (int i = selectedPage * ITEMS_PER_PAGE; i < numItems && i < (selectedPage + 1) * ITEMS_PER_PAGE; i++)
{
if (selectedItem == i)
{
GO.lcd.print("> ");
}
GO.lcd.println(disks[i].devpath);
}
switch (buttonListener(numItems))
{
case 1:
selectedDisk = disks[selectedItem].devpath;
break;
case 2:
Serial.println("back");
break;
default:
listDisks(disks, numItems);
break;
}
} }
void listPools(Pool *pools, int numItems)
{
GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(MAIN_TEXT_COLOR);
GO.lcd.setTextSize(MAIN_TEXT_SIZE);
GO.lcd.println("Select Pool (Page " + String(selectedPage + 1) + ")");
GO.lcd.println("--------------------------");
for (int i = selectedPage * ITEMS_PER_PAGE; i < numItems && i < (selectedPage + 1) * ITEMS_PER_PAGE; i++)
{
if (selectedItem == i)
{
GO.lcd.print("> ");
}
GO.lcd.println(pools[i].name);
}
switch (buttonListener(numItems))
{
case 1:
selectedPool = pools[selectedItem].name;
break;
case 2:
Serial.println("back");
break;
default:
listPools(pools, numItems);
break;
}
}

@ -5,6 +5,10 @@
#include <odroid_go.h> #include <odroid_go.h>
#include <utils.h> #include <utils.h>
const int BACKGROUND_COLOR = WHITE;
const int TEXT_COLOR = BLACK;
const int TEXT_SIZE = 2;
String convertBytes(long long value) { String convertBytes(long long value) {
if (value > 1099511627776) { if (value > 1099511627776) {
return String(value / 1099511627776) + " TB"; return String(value / 1099511627776) + " TB";
@ -34,17 +38,17 @@ String convertTime(long long value) {
void printNodeStats(Node node) void printNodeStats(Node node)
{ {
GO.lcd.fillScreen(WHITE); GO.lcd.fillScreen(BACKGROUND_COLOR);
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(BLACK); GO.lcd.setTextColor(TEXT_COLOR);
GO.lcd.setTextSize(3); GO.lcd.setTextSize(TEXT_SIZE);
GO.lcd.println(node.name); GO.lcd.println(node.name);
GO.lcd.setTextSize(2);
GO.lcd.println("--------------------------"); GO.lcd.println("--------------------------");
GO.lcd.println("Status: " + node.onlineStatus); GO.lcd.println("Status: " + node.onlineStatus);
GO.lcd.println("Uptime: " + convertTime(node.uptime)); GO.lcd.println("Uptime: " + convertTime(node.uptime));
GO.lcd.println("CPU: " + String(node.cpu) + "%"); GO.lcd.println("CPU: " + String(node.cpu * 100) + "%");
GO.lcd.println("Threads: " + String(node.threads)); GO.lcd.println("Threads: " + String(node.threads));
GO.lcd.println("RAM: " + convertBytes(node.mem)); GO.lcd.println("RAM: " + convertBytes(node.mem));
GO.lcd.println("Max RAM: " + convertBytes(node.maxmem)); GO.lcd.println("Max RAM: " + convertBytes(node.maxmem));
@ -55,13 +59,12 @@ void printNodeStats(Node node)
void printContainerStats(Container container) void printContainerStats(Container container)
{ {
GO.lcd.fillScreen(WHITE); GO.lcd.fillScreen(BACKGROUND_COLOR);
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(BLACK); GO.lcd.setTextColor(TEXT_COLOR);
GO.lcd.setTextSize(3); GO.lcd.setTextSize(TEXT_SIZE);
GO.lcd.println(String(container.id) + ": " + container.name); GO.lcd.println(String(container.id) + ": " + container.name);
GO.lcd.setTextSize(2);
GO.lcd.println("--------------------------"); GO.lcd.println("--------------------------");
GO.lcd.println("Status: " + container.onlineStatus); GO.lcd.println("Status: " + container.onlineStatus);
GO.lcd.println("Uptime: " + convertTime(container.uptime)); GO.lcd.println("Uptime: " + convertTime(container.uptime));
@ -72,13 +75,11 @@ void printContainerStats(Container container)
void printVMStats(VM vm) void printVMStats(VM vm)
{ {
GO.lcd.fillScreen(WHITE); GO.lcd.fillScreen(BACKGROUND_COLOR);
GO.lcd.setCursor(0, 0); GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(BLACK); GO.lcd.setTextColor(TEXT_COLOR);
GO.lcd.setTextSize(TEXT_SIZE);
GO.lcd.setTextSize(3);
GO.lcd.println(String(vm.id) + ": " + vm.name); GO.lcd.println(String(vm.id) + ": " + vm.name);
GO.lcd.setTextSize(2);
GO.lcd.println("--------------------------"); GO.lcd.println("--------------------------");
GO.lcd.println("Status: " + vm.onlineStatus); GO.lcd.println("Status: " + vm.onlineStatus);
GO.lcd.println("Uptime: " + convertTime(vm.uptime)); GO.lcd.println("Uptime: " + convertTime(vm.uptime));
@ -86,48 +87,161 @@ void printVMStats(VM vm)
GO.lcd.println("Max Disk: " + convertBytes(vm.maxdisk)); GO.lcd.println("Max Disk: " + convertBytes(vm.maxdisk));
} }
void printDiskStats(Disk disk)
{
GO.lcd.fillScreen(BACKGROUND_COLOR);
GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(TEXT_COLOR);
GO.lcd.setTextSize(TEXT_SIZE);
GO.lcd.println(disk.devpath);
GO.lcd.println("--------------------------");
GO.lcd.println("Vendor: " + disk.vendor);
GO.lcd.println("Model: " + disk.model);
GO.lcd.println("Serial: " + disk.serial);
GO.lcd.println("Size: " + convertBytes(disk.size));
GO.lcd.println("Used For: " + disk.used);
GO.lcd.println("Health: " + disk.health);
}
void printPoolStats(Pool pool)
{
GO.lcd.fillScreen(BACKGROUND_COLOR);
GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(TEXT_COLOR);
GO.lcd.setTextSize(TEXT_SIZE);
GO.lcd.println(pool.name);
GO.lcd.println("--------------------------");
GO.lcd.println("Free: " + convertBytes(pool.free));
GO.lcd.println("Size: " + convertBytes(pool.size));
GO.lcd.println("Health: " + pool.health);
}
void nodeInfo() void nodeInfo()
{ {
Serial.println("nodeinfo"); Serial.println("nodeinfo");
unsigned long lastUpdate = millis();
int updateInterval = 3000;
while (true) while (true)
{ {
if(lastUpdate + updateInterval < millis()) {
printNodeStats(getNode(selectedNode));
lastUpdate = millis();
}
printNodeStats(getNode(selectedNode)); GO.update();
delay(2000); if(GO.BtnB.isPressed()) {
break;
}
} }
mainMenu();
} }
void containerInfo() void containerInfo()
{ {
Serial.println("container info"); Serial.println("container info");
selectedItem = 0; selectedItem = 0;
selectedPage = 0;
int numContainers; int numContainers;
Container *containers = getContainerInfo(&numContainers, selectedNode); Container *containers = getContainerInfo(&numContainers, selectedNode);
listContainers(containers, numContainers); listContainers(containers, numContainers);
delete[] containers;
unsigned long lastUpdate = millis();
int updateInterval = 3000;
while (true) while (true)
{ {
printContainerStats(getContainer(selectedLXC, selectedNode)); if(lastUpdate + updateInterval < millis()) {
delay(5000); printContainerStats(getContainer(selectedLXC, selectedNode));
lastUpdate = millis();
}
GO.update();
if(GO.BtnB.isPressed()) {
mainMenu();
break;
}
} }
} }
void vmInfo() void vmInfo()
{ {
Serial.println("vm info"); Serial.println("vm info");
selectedItem = 0; selectedItem = 0;
selectedPage = 0;
int numVMs; int numVMs;
VM *vms = getVMInfo(&numVMs, selectedNode); VM *vms = getVMInfo(&numVMs, selectedNode);
if (vms != NULL) if (vms != NULL)
{ {
listVMs(vms, numVMs); listVMs(vms, numVMs);
delete[] vms;
unsigned long lastUpdate = millis();
int updateInterval = 3000;
while (true) while (true)
{ {
printVMStats(getVM(selectedVM, selectedNode)); if(lastUpdate + updateInterval < millis()) {
delay(5000); printVMStats(getVM(selectedVM, selectedNode));
lastUpdate = millis();
}
GO.update();
if(GO.BtnB.isPressed()) {
mainMenu();
break;
}
}
}
}
void diskInfo()
{
Serial.println("disk info");
selectedItem = 0;
selectedPage = 0;
int numDisks;
Disk *disks = getDiskInfo(&numDisks, selectedNode);
if (disks != NULL)
{
listDisks(disks, numDisks);
delete[] disks;
printDiskStats(getDisk(selectedDisk, selectedNode));
while (true)
{
GO.update();
if(GO.BtnB.isPressed()) {
mainMenu();
break;
}
} }
} }
} }
void poolInfo()
{
Serial.println("pool info");
selectedItem = 0;
selectedPage = 0;
int numPools;
Pool *pools = getPoolInfo(&numPools, selectedNode);
if (pools != NULL)
{
listPools(pools, numPools);
delete[] pools;
printPoolStats(getPool(selectedPool, selectedNode));
while (true)
{
GO.update();
if(GO.BtnB.isPressed()) {
mainMenu();
break;
}
}
}
}

@ -1,6 +1,7 @@
#include <odroid_go.h> #include <odroid_go.h>
#include <wifi_info.h> #include <wifi_info.h>
#include <WiFi.h> #include <WiFi.h>
#include <pin.h>
/** /**
Display an error on the screen Display an error on the screen
*/ */
@ -15,12 +16,129 @@ void displayError(String message) {
void connectWiFi() { void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASS); WiFi.begin(WIFI_SSID, WIFI_PASS);
GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0);
GO.lcd.print("Connecting"); GO.lcd.print("Connecting");
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) {
delay(500); delay(500);
Serial.print("."); Serial.print(".");
GO.lcd.print("."); GO.lcd.print(".");
} }
}
int pinListener()
{
delay(300);
while (true)
{
GO.update();
if (GO.BtnA.isPressed() == 1)
{
return 0;
}
if (GO.BtnB.isPressed() == 1)
{
return 1;
}
if (GO.JOY_Y.isAxisPressed() == 1)
{
return 2;
}
if (GO.JOY_Y.isAxisPressed() == 2)
{
return 3;
}
if (GO.JOY_X.isAxisPressed() == 1)
{
return 4;
}
if (GO.JOY_X.isAxisPressed() == 2)
{
return 5;
}
if (GO.BtnStart.isPressed() == 1)
{
return 6;
}
if (GO.BtnMenu.isPressed() == 1)
{
return 7;
}
delay(50);
}
return 7;
}
bool enterPin()
{
GO.lcd.clearDisplay();
GO.lcd.setCursor(0, 0);
GO.lcd.setTextColor(WHITE);
GO.lcd.setTextSize(2);
GO.lcd.println("Enter pin");
GO.lcd.println("--------------------------");
GO.lcd.setTextSize(1);
GO.lcd.println("Start to Confirm | Menu to Reset");
GO.lcd.setTextSize(2);
GO.lcd.println("--------------------------");
bool done = false;
String pin = "";
while (!done)
{
if (pin != ""){
GO.lcd.print("*");
}
Serial.println(pin);
switch (pinListener())
{
case 6:
done = true;
break;
case 0:
pin += "0";
break;
case 1:
pin += "1";
break;
case 2:
pin += "2";
break;
case 3:
pin += "3";
break;
case 4:
pin += "4";
break;
case 5:
pin += "5";
break;
default:
pin = "";
done = true;
break;
}
}
if (pin == LOCK_PIN) {
return true;
}
Serial.println("incorrect: " + pin);
if (pin != "") {
displayError("Incorrect Pin");
}
return false;
} }
Loading…
Cancel
Save