-
-
Save tperalta82/6e11253cd4b9cf9c5c6fa15bbf046d4f to your computer and use it in GitHub Desktop.
#!/usr/bin/php | |
<?php | |
$hosts = array("antminer1","antminer2"); | |
$minercreds = array( "user" => "root", "pass" => "becauseIAmHigh"); | |
$failhashboard = "oxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxx"; | |
/* I'm too stoned to try and detect how many hashboards are there*/ | |
$possiblehashboards = 4; | |
foreach($hosts as $host) | |
{ | |
$r = request("stats",$host); | |
for( $i = 1; $i <= $possiblehashboards; $i++ ) | |
{ | |
//var_dump(array_keys($r)); | |
if( isset( $r["STATS0"]["chain_acs".$i]) && trim($r["STATS0"]["chain_acs".$i]) === $failhashboard ) | |
{ | |
echo "errors on chain $i on $host, sending reboot".PHP_EOL; | |
$out = rebootMinerWget($host, $minercreds['user'], $minercreds['pass']); | |
echo $out.PHP_EOL; | |
break; | |
} | |
} | |
} | |
function rebootMinerWget( $host, $user, $pass ) | |
{ | |
$cmd = "/usr/bin/wget -qO- --http-user=".$user." --http-password=".$pass." http://".$host."/cgi-bin/reboot.cgi"; | |
return shell_exec($cmd); | |
} | |
function rebootMinerCurl( $host, $user, $pass ) | |
{ | |
$url = "http://".$host."/cgi-bin/reboot.cgi"; | |
$ch = curl_init($url); | |
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass" ); | |
$reboot = curl_exec($ch); | |
return $reboot; | |
} | |
function rebootMiner($host, $user, $pass) | |
{ | |
$conn = ssh2_connect($host, 22); | |
if(!$conn ) | |
{ | |
echo "Could not connect to $host".PHP_EOL; | |
return false; | |
} | |
if(!ssh2_auth_password( $conn, $user, $pass ) ) | |
{ | |
echo "Failed to authenticate on ssh $host".PHP_EOL; | |
return false; | |
} | |
$out = ssh2_exec($conn , "reboot"); | |
stream_set_blocking($out, true); | |
$result = stream_get_contents($out); | |
fclose($out); | |
return $result; | |
} | |
function getsock($addr, $port) | |
{ | |
$socket = null; | |
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); | |
if ($socket === false || $socket === null) { | |
$error = socket_strerror(socket_last_error()); | |
$msg = "socket create(TCP) failed"; | |
echo "ERR: $msg '$error'\n"; | |
return null; | |
} | |
$res = socket_connect($socket, $addr, $port); | |
if ($res === false) { | |
$error = socket_strerror(socket_last_error()); | |
$msg = "socket connect($addr,$port) failed"; | |
echo "ERR: $msg '$error'\n"; | |
socket_close($socket); | |
return null; | |
} | |
return $socket; | |
} | |
# | |
# Slow ... | |
function readsockline($socket) | |
{ | |
$line = ''; | |
while (true) { | |
$byte = socket_read($socket, 1); | |
if ($byte === false || $byte === '') break; | |
if ($byte === "\0") break; | |
$line .= $byte; | |
} | |
return $line; | |
} | |
# | |
function request($cmd, $host) | |
{ | |
$socket = getsock($host, 4028); | |
if ($socket != null) { | |
socket_write($socket, $cmd, strlen($cmd)); | |
$line = readsockline($socket); | |
socket_close($socket); | |
if (strlen($line) == 0) { | |
echo "WARN: '$cmd' returned nothing\n"; | |
return $line; | |
} | |
//print "$cmd returned '$line'\n"; | |
if (substr($line, 0, 1) == '{') { | |
return json_decode($line, true); | |
} | |
$data = array(); | |
$objs = explode('|', $line); | |
foreach ($objs as $obj) { | |
if (strlen($obj) > 0) { | |
$items = explode(',', $obj); | |
$item = $items[0]; | |
$id = explode('=', $items[0], 2); | |
if (count($id) == 1 or ! ctype_digit($id[1])) { | |
$name = $id[0]; | |
} else { | |
$name = $id[0].$id[1]; | |
} | |
if (strlen($name) == 0) { | |
$name = 'null'; | |
} | |
if (isset($data[$name])) { | |
$num = 1; | |
while (isset($data[$name.$num])) { | |
$num++; | |
} | |
$name .= $num; | |
} | |
$counter = 0; | |
foreach ($items as $item) { | |
$id = explode('=', $item, 2); | |
if (count($id) == 2) { | |
$data[$name][$id[0]] = $id[1]; | |
} else { | |
$data[$name][$counter] = $id[0]; | |
} | |
$counter++; | |
} | |
} | |
} | |
return $data; | |
} | |
return null; | |
} |
Hi. Why does it say $failhashboard = "oxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxx";****
Theres other ways hashboards can be displayed and not working.. it can be oxxxooo xxxxxxx oooo and so on. and also
$possiblehashboards = 4; the D3 has 3 hashboards and L3+ 4 ... does it matter?
I would like to use this script but i have 0 experience.. i have a linux server i can add this to crontab but what values to change i dont understand..
THx
STATS gives you a "miner_count" which holds the amount how much time you need to check "chain_acs" and the failed count is simply
substr_count($current_chain_acs_string, 'x') which is ideally ZERO, but i have to mention, lots of time, the restart of cgminer.sh is enough, to get the working chains back(this works only over SSH with /etc/init.d/cgminer.sh restart (shame on me, you already use SSH)). But sometimes the chains fail, then you have a hardware failure....
already done this in php
also you can have an issue with the chips per chain. Which is 60 for D3, and maybe 72 for L3+, so if you start to get less chips than the specs, that is also a misteriuos issue
i wish you had included a module to scan all subnets for D3 miners, i was working on some kind of script but your is better so i will improve it