oh really?

This commit is contained in:
Tristan Smith 2024-09-29 23:07:45 -04:00
commit 029c1676e4
7 changed files with 156 additions and 0 deletions

23
Makefile Normal file
View file

@ -0,0 +1,23 @@
# Define the compiler and flags
CC = gcc
CFLAGS = -Wall -Wextra -std=c99
# Define the target executable and the source files
TARGET = caur
SRCS = $(wildcard src/*.c)
OBJS = $(SRCS:.c=.o)
# The default rule: build the target
all: $(TARGET)
# Link the object files into the target executable
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) -lcurl
# Compile the .c files into .o files
src/%.o: src/%.c
$(CC) $(CFLAGS) -c $< -o $@
# Clean up the build artifacts
clean:
rm -f $(TARGET) $(OBJS)

4
credentials.json Normal file
View file

@ -0,0 +1,4 @@
{
"creds": [["root", "root"], ["miner", "miner"]]
}

16
errors.json Normal file
View file

@ -0,0 +1,16 @@
{
"error_keywords": {
"ERROR_TEMP_TOO_HIGH": "Temperature Error",
"ERROR_NETWORK_DISCONNECTED": "probably doesn't exist",
"ERROR_POWER_LOST: power voltage rise or drop": "voltage drop",
"_pic_write_iic failed!": "PIC Error",
"PLL read exceeded wait time": "PLL Error",
"ERROR_SOC_INIT: soc init failed": "SoC failure",
"fail to read 0:1": "eeprom",
"fail to write 0:1": "eeprom",
"bitmain_get_power_status failed": "PSU",
"power voltage can not meet the target": "PSU",
"reg crc error": "black hole",
"ERROR_POWER_LOST: pic check voltage drop": "voltage drop"
}
}

BIN
failure Executable file

Binary file not shown.

1
ips.txt Normal file
View file

@ -0,0 +1 @@
10.0.20.152

4
readme.md Normal file
View file

@ -0,0 +1,4 @@
## Antminer error finder
Checks for specific strings in log files of Antminer machines. Currently works with stock firmware (and barely at that). Expand to Braiins & LuxOS potentially.

108
src/main.c Normal file
View file

@ -0,0 +1,108 @@
// Antminer log viewer with proposed fixes and possible log highlighting
// Currently only 'working' on stock firmware
// TODO: Find endpoint for custom firmware
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#define MAX_IPS 100
#define MAX_IP_LENGTH 16
#define MAX_LOG_LINE_LENGTH 1024
// Structure to hold memory
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(ptr == NULL) {
fprintf(stderr, "Not enough memory (realloc returned NULL - get rekt)\n");
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
void read_ips(const char *filename, char ips[][MAX_IP_LENGTH], int *ip_count) {
FILE *file = fopen(filename, "r");
if(file == NULL) {
fprintf(stderr, "Failed to open IP file %s\n", filename);
exit(EXIT_FAILURE);
}
char line[MAX_IP_LENGTH];
while (fgets(line, sizeof(line), file) != NULL && *ip_count < MAX_IPS) {
line[strcspn(line, "\n")] = '\0'; // Remove newline
strncpy(ips[*ip_count], line, MAX_IP_LENGTH);
(*ip_count)++;
}
fclose(file);
}
void fetch_logs(const char *ip, const char *username, const char *password) {
CURL *curl;
CURLcode res;
struct MemoryStruct chunk;
chunk.memory = malloc(1);
chunk.size = 0;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
char url[256];
snprintf(url, sizeof(url), "http://%s/cgi-bin/log.cgi", ip);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERNAME, username);
curl_easy_setopt(curl, CURLOPT_PASSWORD, password);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
} else {
printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
printf("%s\n", chunk.memory);
// TODO: Parse log lines and highlight(?) errors
}
curl_easy_cleanup(curl);
free(chunk.memory); // I hear this is important!
}
curl_global_cleanup();
}
int main() {
char ips[MAX_IPS][MAX_IP_LENGTH];
int ip_count = 0;
printf("Antminer log viewer\n");
read_ips("ips.txt", ips, &ip_count);
for(int i = 0; i < ip_count; i++) {
printf("Fetching logs for IP: %s\n", ips[i]);
fetch_logs(ips[i], "root", "root");
printf("Logs fetched for IP: %s\n", ips[i]);
printf("----------------------------------------\n");
}
printf("All logs fetched successfully!\n");
return 0;
}