update
This commit is contained in:
BIN
bin/client_linux
Normal file
BIN
bin/client_linux
Normal file
Binary file not shown.
BIN
bin/mining_task.db
Normal file
BIN
bin/mining_task.db
Normal file
Binary file not shown.
@@ -5,7 +5,7 @@
|
|||||||
1,请您根据您的GPU所在主机的操作系统,下载正确系统版本的客户端,windows或linux(ubuntu等)
|
1,请您根据您的GPU所在主机的操作系统,下载正确系统版本的客户端,windows或linux(ubuntu等)
|
||||||
2,必须通过官网且在正确的卖家账号下下载本客户端,因为里面包含您的卖家信息,如果通过非官方渠道或错误的卖家账号下载了客户端,您的GPU信息无法同步到云算力平台
|
2,必须通过官网且在正确的卖家账号下下载本客户端,因为里面包含您的卖家信息,如果通过非官方渠道或错误的卖家账号下载了客户端,您的GPU信息无法同步到云算力平台
|
||||||
3,下载并解压后,请确定您的客户端包含以下文件:
|
3,下载并解压后,请确定您的客户端包含以下文件:
|
||||||
执行文件(client.exe或client)
|
执行文件(client_windows.exe或client_linux)
|
||||||
auth
|
auth
|
||||||
mining.linux.conf
|
mining.linux.conf
|
||||||
mining.windows.conf
|
mining.windows.conf
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
|
:: 设置目标平台为 Windows 和 amd64(64位)
|
||||||
|
set GOOS=windows
|
||||||
|
set GOARCH=amd64
|
||||||
|
|
||||||
cd /d %~dp0
|
cd /d %~dp0
|
||||||
go build -o ../bin/client.exe main.go
|
go build -o ../bin/client_windows.exe main.go
|
||||||
if %errorlevel% equ 0 (
|
if %errorlevel% equ 0 (
|
||||||
echo 编译成功!可执行文件位于: ..\bin\client.exe
|
echo 编译成功!可执行文件位于: ..\bin\client_windows.exe
|
||||||
) else (
|
) else (
|
||||||
echo 编译失败!
|
echo 编译失败!
|
||||||
exit /b %errorlevel%
|
exit /b %errorlevel%
|
||||||
|
|||||||
28
cmd/build.windows_linux.bat
Normal file
28
cmd/build.windows_linux.bat
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal
|
||||||
|
|
||||||
|
:: 设置目标平台为 Linux 和 amd64
|
||||||
|
set GOOS=linux
|
||||||
|
set GOARCH=amd64
|
||||||
|
|
||||||
|
:: 可选:设置编译输出目录
|
||||||
|
set OUTPUT_DIR=../bin
|
||||||
|
|
||||||
|
:: 确保输出目录存在
|
||||||
|
if not exist %OUTPUT_DIR% (
|
||||||
|
mkdir %OUTPUT_DIR%
|
||||||
|
)
|
||||||
|
|
||||||
|
:: 编译 Go 程序
|
||||||
|
go build -o %OUTPUT_DIR%/client_linux main.go
|
||||||
|
|
||||||
|
:: 检查编译结果
|
||||||
|
if %ERRORLEVEL% NEQ 0 (
|
||||||
|
echo 编译失败!
|
||||||
|
exit /b %ERRORLEVEL%
|
||||||
|
)
|
||||||
|
|
||||||
|
echo 编译成功!可执行文件位于 %OUTPUT_DIR%/client_linux
|
||||||
|
|
||||||
|
endlocal
|
||||||
|
pause
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
message "client/internal/msg"
|
message "client/internal/msg"
|
||||||
"client/internal/src"
|
"client/internal/src"
|
||||||
"client/internal/src/linux"
|
"client/internal/src/linux"
|
||||||
@@ -39,6 +40,7 @@ type Client struct {
|
|||||||
MachineCode string
|
MachineCode string
|
||||||
ServerConn net.Conn // 服务连接
|
ServerConn net.Conn // 服务连接
|
||||||
GPUs map[int]message.GPU // {"gpu编号": message.GPU{}, ...}
|
GPUs map[int]message.GPU // {"gpu编号": message.GPU{}, ...}
|
||||||
|
MiningSofts []string
|
||||||
os *src.SystemServer
|
os *src.SystemServer
|
||||||
osName string
|
osName string
|
||||||
serverURL string // 服务器地址
|
serverURL string // 服务器地址
|
||||||
@@ -58,7 +60,7 @@ func newClient(url string) *Client {
|
|||||||
// 读取身份文件
|
// 读取身份文件
|
||||||
auth, err := utils.ReadFile("./auth")
|
auth, err := utils.ReadFile("./auth")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("获取客户端身份失败:%v", err)
|
log.Printf("获取客户端身份失败:%v", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,31 +103,32 @@ func newClient(url string) *Client {
|
|||||||
} else {
|
} else {
|
||||||
confFile = "mining.linux.conf"
|
confFile = "mining.linux.conf"
|
||||||
}
|
}
|
||||||
|
var softs = make([]string, 0)
|
||||||
// 读取挖矿配置
|
// 读取挖矿配置
|
||||||
cfg, err := ini.Load(confFile)
|
cfg, err := ini.Load(confFile)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
sectionBzMiner := cfg.Section("bzminer")
|
|
||||||
miningConfig.BzMinerPath = sectionBzMiner.Key("path").String()
|
|
||||||
|
|
||||||
sectionLolMiner := cfg.Section("lolminer")
|
sectionLolMiner := cfg.Section("lolminer")
|
||||||
miningConfig.LolMinerPath = sectionLolMiner.Key("path").String()
|
miningConfig.LolMinerPath = sectionLolMiner.Key("path").String()
|
||||||
|
if miningConfig.LolMinerPath != "" {
|
||||||
|
softs = append(softs, "lolminer")
|
||||||
|
}
|
||||||
sectionRigel := cfg.Section("rigel")
|
sectionRigel := cfg.Section("rigel")
|
||||||
miningConfig.RigelPath = sectionRigel.Key("path").String()
|
miningConfig.RigelPath = sectionRigel.Key("path").String()
|
||||||
|
if miningConfig.RigelPath != "" {
|
||||||
|
softs = append(softs, "rigel")
|
||||||
|
}
|
||||||
sectionProxy := cfg.Section("proxy")
|
sectionProxy := cfg.Section("proxy")
|
||||||
miningConfig.ProxyEnabled, _ = sectionProxy.Key("proxy").Bool()
|
miningConfig.ProxyEnabled, _ = sectionProxy.Key("proxy").Bool()
|
||||||
}
|
}
|
||||||
|
client.MiningSofts = softs
|
||||||
client.sustainMiner = sustain.NewSustainMiner(systemServer, sys, miningConfig)
|
client.sustainMiner = sustain.NewSustainMiner(systemServer, sys, miningConfig)
|
||||||
|
|
||||||
// 读取主机MAC地址信息
|
// 读取主机MAC地址信息
|
||||||
var machine_code string
|
var machine_code string
|
||||||
machine_code, err = systemServer.GetMACAddress(sys)
|
machine_code, err = systemServer.GetMACAddress(sys)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Println(err)
|
||||||
panic("获取当前主机信息失败,程序已退出,请检查网络后重新启动本客户端。")
|
log.Fatalln("获取当前主机信息失败,程序已退出,请检查网络后重新启动本客户端。")
|
||||||
}
|
}
|
||||||
// utils.WirteFile("./machinecode", machine_code)
|
// utils.WirteFile("./machinecode", machine_code)
|
||||||
|
|
||||||
@@ -133,8 +136,8 @@ func newClient(url string) *Client {
|
|||||||
|
|
||||||
gpus, err := systemServer.GetGPUInfo(sys)
|
gpus, err := systemServer.GetGPUInfo(sys)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Println(err)
|
||||||
panic("获取当前主机GPU数据失败,程序已退出,请检查GPU驱动等程序后重新启动本客户端。")
|
log.Fatalln("获取当前主机GPU数据失败,程序已退出,请检查GPU驱动等程序后重新启动本客户端。")
|
||||||
}
|
}
|
||||||
client.GPUs = gpus
|
client.GPUs = gpus
|
||||||
client.serverURL = url
|
client.serverURL = url
|
||||||
@@ -144,7 +147,7 @@ func newClient(url string) *Client {
|
|||||||
// 连接服务端
|
// 连接服务端
|
||||||
server_conn, err := net.Dial("tcp", url)
|
server_conn, err := net.Dial("tcp", url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("客户端连接到服务器失败:%v", err)
|
log.Printf("客户端连接到服务器失败:%v", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,14 +174,18 @@ func (c *Client) Stop() {
|
|||||||
|
|
||||||
func (c *Client) sendMachineCode() {
|
func (c *Client) sendMachineCode() {
|
||||||
var msg message.ServerMsg
|
var msg message.ServerMsg
|
||||||
msg.ID = c.Auth + "." + c.MachineCode
|
msg.ID = c.Auth + "::" + c.MachineCode
|
||||||
msg.Method = "auth.machineCode"
|
msg.Method = "auth.machineCode"
|
||||||
msg.Params = c.GPUs
|
var params = make(map[string]any)
|
||||||
|
params["gpus"] = c.GPUs
|
||||||
|
params["miningsofts"] = c.MiningSofts
|
||||||
|
msg.Params = params
|
||||||
msgByte, err := json.Marshal(msg)
|
msgByte, err := json.Marshal(msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("消息(%v)序列化失败:%v", msg, err)
|
log.Printf("消息(%v)序列化失败:%v", msg, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Println(string(msgByte))
|
||||||
c.send(msgByte)
|
c.send(msgByte)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +199,8 @@ func (c *Client) receiveMsg() {
|
|||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
buffer := make([]byte, 1024)
|
// 使用 bufio.Reader 读取数据
|
||||||
|
reader := bufio.NewReader(c.ServerConn)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
@@ -206,26 +214,29 @@ func (c *Client) receiveMsg() {
|
|||||||
|
|
||||||
// 设置读取超时,用于检测连接是否存活
|
// 设置读取超时,用于检测连接是否存活
|
||||||
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
|
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
|
||||||
n, err := conn.Read(buffer)
|
|
||||||
|
// 读取一行数据,直到遇到换行符
|
||||||
|
msgByte, err := reader.ReadString('\n')
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
|
|
||||||
log.Println("读取超时,连接可能已断开")
|
|
||||||
c.reconnect()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err.Error() == "EOF" {
|
if err.Error() == "EOF" {
|
||||||
// 服务端关闭连接时,退出接收循环
|
// 服务端关闭连接时,退出接收循环
|
||||||
log.Println("服务端关闭了连接")
|
log.Println("服务端关闭了连接")
|
||||||
c.reconnect()
|
c.reconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
|
||||||
|
log.Println("读取超时,连接可能已断开")
|
||||||
|
c.reconnect()
|
||||||
|
return
|
||||||
|
}
|
||||||
log.Printf("接收数据失败: %v", err)
|
log.Printf("接收数据失败: %v", err)
|
||||||
c.reconnect()
|
c.reconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
msgByte := buffer[:n]
|
// 输出接收到的消息
|
||||||
go c.handleReceiveMsg(msgByte)
|
log.Printf("收到新消息:%s", msgByte)
|
||||||
|
go c.handleReceiveMsg([]byte(msgByte)) // 处理消息
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +248,7 @@ func (c *Client) send(msg []byte) error {
|
|||||||
return fmt.Errorf("连接已断开")
|
return fmt.Errorf("连接已断开")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := c.ServerConn.Write(msg)
|
_, err := c.ServerConn.Write(append(msg, '\n'))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("发送消息失败:%v\n消息内容:%s", err, string(msg))
|
log.Printf("发送消息失败:%v\n消息内容:%s", err, string(msg))
|
||||||
return err
|
return err
|
||||||
@@ -249,26 +260,43 @@ func (c *Client) handleReceiveMsg(msg []byte) {
|
|||||||
var data message.ServerMsg
|
var data message.ServerMsg
|
||||||
err := json.Unmarshal(msg, &data)
|
err := json.Unmarshal(msg, &data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("解析接收到的消息失败:%v", err)
|
log.Printf("解析接收到的消息失败:%v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
parts := strings.Split(data.ID, ".")
|
parts := strings.Split(data.ID, "::")
|
||||||
if len(parts) != 2 {
|
if len(parts) != 2 {
|
||||||
log.Fatalf("解析通信协议(server->client)失败")
|
log.Printf("解析通信协议(server->client)失败")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
auth, machine_code := parts[0], parts[1]
|
auth, machine_code := parts[0], parts[1]
|
||||||
if c.Auth != auth || c.MachineCode != machine_code {
|
if c.Auth != auth || c.MachineCode != machine_code {
|
||||||
log.Fatalf("客户端接收到错误的服务端消息")
|
log.Printf("客户端接收到错误的服务端消息")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch data.Method {
|
switch data.Method {
|
||||||
case "pong":
|
case "ping":
|
||||||
// 收到心跳响应,更新最后pong时间
|
// 收到服务端心跳,更新最后ping时间并回复pong
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
c.lastPong = time.Now()
|
c.lastPong = time.Now()
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
log.Println("收到心跳响应")
|
log.Println("收到服务端心跳")
|
||||||
|
|
||||||
|
// 回复pong
|
||||||
|
pongMsg := message.ServerMsg{
|
||||||
|
ID: c.Auth + "::" + c.MachineCode,
|
||||||
|
Method: "pong",
|
||||||
|
Params: nil,
|
||||||
|
}
|
||||||
|
msgByte, err := json.Marshal(pongMsg)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("序列化pong消息失败:%v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := c.send(msgByte); err != nil {
|
||||||
|
log.Printf("发送pong响应失败:%v", err)
|
||||||
|
} else {
|
||||||
|
log.Println("已回复pong")
|
||||||
|
}
|
||||||
return
|
return
|
||||||
case "mining.req":
|
case "mining.req":
|
||||||
// 将 data.Params 重新序列化为 JSON,然后反序列化为 ConfigurationMiningMsg
|
// 将 data.Params 重新序列化为 JSON,然后反序列化为 ConfigurationMiningMsg
|
||||||
@@ -277,7 +305,7 @@ func (c *Client) handleReceiveMsg(msg []byte) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("序列化 Params 失败:%v", err)
|
log.Printf("序列化 Params 失败:%v", err)
|
||||||
sendMsg_str := message.ServerMsgResp{
|
sendMsg_str := message.ServerMsgResp{
|
||||||
ID: c.Auth + "." + c.MachineCode,
|
ID: c.Auth + "::" + c.MachineCode,
|
||||||
Result: false,
|
Result: false,
|
||||||
Data: fmt.Errorf("序列化 Params 失败:%v", err),
|
Data: fmt.Errorf("序列化 Params 失败:%v", err),
|
||||||
}
|
}
|
||||||
@@ -291,7 +319,7 @@ func (c *Client) handleReceiveMsg(msg []byte) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("解析挖矿配置消息失败:%v, Params: %s", err, string(paramsJSON))
|
log.Printf("解析挖矿配置消息失败:%v, Params: %s", err, string(paramsJSON))
|
||||||
sendMsg_str := message.ServerMsgResp{
|
sendMsg_str := message.ServerMsgResp{
|
||||||
ID: c.Auth + "." + c.MachineCode,
|
ID: c.Auth + "::" + c.MachineCode,
|
||||||
Result: false,
|
Result: false,
|
||||||
Data: fmt.Errorf("解析挖矿配置消息失败:%v", err),
|
Data: fmt.Errorf("解析挖矿配置消息失败:%v", err),
|
||||||
}
|
}
|
||||||
@@ -309,15 +337,16 @@ func (c *Client) handleReceiveMsg(msg []byte) {
|
|||||||
err = c.os.Mining(c.osName, mining_msg)
|
err = c.os.Mining(c.osName, mining_msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendMsg_str := message.ServerMsgResp{
|
sendMsg_str := message.ServerMsgResp{
|
||||||
ID: c.Auth + "." + c.MachineCode,
|
ID: c.Auth + "::" + c.MachineCode,
|
||||||
Result: false,
|
Result: false,
|
||||||
Data: err.Error(),
|
Data: err.Error(),
|
||||||
}
|
}
|
||||||
sendMsg_byte, err := json.Marshal(sendMsg_str)
|
sendMsg_byte, err := json.Marshal(sendMsg_str)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("序列化%v失败:%v", sendMsg_str, err)
|
log.Printf("序列化%v失败:%v", sendMsg_str, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Println(string(sendMsg_byte))
|
||||||
c.send(sendMsg_byte) // 返回失败消息
|
c.send(sendMsg_byte) // 返回失败消息
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -332,13 +361,14 @@ func (c *Client) handleReceiveMsg(msg []byte) {
|
|||||||
WatchUrl: "", // 这里需要根据矿池自动生成
|
WatchUrl: "", // 这里需要根据矿池自动生成
|
||||||
}
|
}
|
||||||
sendMsg_str := message.ServerMsgResp{
|
sendMsg_str := message.ServerMsgResp{
|
||||||
ID: c.Auth + "." + c.MachineCode,
|
ID: c.Auth + "::" + c.MachineCode,
|
||||||
Result: true,
|
Result: true,
|
||||||
Data: respData,
|
Data: respData,
|
||||||
|
Method: "mining.resp",
|
||||||
}
|
}
|
||||||
sendMsg_byte, err := json.Marshal(sendMsg_str)
|
sendMsg_byte, err := json.Marshal(sendMsg_str)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("序列化%v失败:%v", sendMsg_str, err)
|
log.Printf("序列化%v失败:%v", sendMsg_str, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.send(sendMsg_byte) // 返回成功消息
|
c.send(sendMsg_byte) // 返回成功消息
|
||||||
@@ -379,45 +409,24 @@ func (c *Client) monitorMiningTask(cfg message.ConfigurationMiningMsg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// startHeartbeat 启动心跳检查
|
// startHeartbeat 启动心跳检查(监控是否收到服务端的ping)
|
||||||
func (c *Client) startHeartbeat() {
|
func (c *Client) startHeartbeat() {
|
||||||
ticker := time.NewTicker(30 * time.Second) // 每30秒发送一次心跳
|
ticker := time.NewTicker(30 * time.Second) // 每30秒检查一次
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
// 检查是否超过60秒未收到pong响应
|
// 检查是否超过60秒未收到服务端的ping
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
lastPong := c.lastPong
|
lastPong := c.lastPong
|
||||||
conn := c.ServerConn
|
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
if time.Since(lastPong) > 60*time.Second {
|
if time.Since(lastPong) > 60*time.Minute {
|
||||||
log.Println("超过60秒未收到心跳响应,连接可能已断开")
|
log.Println("超过60分钟未收到服务端心跳,连接可能已断开")
|
||||||
c.reconnect()
|
c.reconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送心跳
|
|
||||||
if conn != nil {
|
|
||||||
pingMsg := message.ServerMsg{
|
|
||||||
ID: c.Auth + "." + c.MachineCode,
|
|
||||||
Method: "ping",
|
|
||||||
Params: nil,
|
|
||||||
}
|
|
||||||
msgByte, err := json.Marshal(pingMsg)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("序列化心跳消息失败:%v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err := c.send(msgByte); err != nil {
|
|
||||||
log.Printf("发送心跳失败:%v", err)
|
|
||||||
c.reconnect()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Println("发送心跳")
|
|
||||||
}
|
|
||||||
case <-c.stopHeartbeat:
|
case <-c.stopHeartbeat:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func NewSQLiteServer() *SQLiteServer {
|
|||||||
// Open (or create) the SQLite database
|
// Open (or create) the SQLite database
|
||||||
db, err := sql.Open("sqlite3", "./mining_task.db")
|
db, err := sql.Open("sqlite3", "./mining_task.db")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ func NewSQLiteServer() *SQLiteServer {
|
|||||||
|
|
||||||
// Initialize the 'task' table
|
// Initialize the 'task' table
|
||||||
if err := s.initTaskTable(); err != nil {
|
if err := s.initTaskTable(); err != nil {
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ func (s *SQLiteServer) LoadMiningTask() (bool, message.ConfigurationMiningMsg) {
|
|||||||
// Query the database
|
// Query the database
|
||||||
rows, err := s.DB.Query(str, params...)
|
rows, err := s.DB.Query(str, params...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ func (s *SQLiteServer) LoadMiningTask() (bool, message.ConfigurationMiningMsg) {
|
|||||||
// Scan the row into the task structure
|
// Scan the row into the task structure
|
||||||
err := rows.Scan(&task.Coin, &task.Algo, &task.Pool, &task.WalletMining, &task.PoolUrl, &task.WalletAddress, &task.PoolUser, &task.WorkerID, &task.EndTimestamp)
|
err := rows.Scan(&task.Coin, &task.Algo, &task.Pool, &task.WalletMining, &task.PoolUrl, &task.WalletAddress, &task.PoolUser, &task.WorkerID, &task.EndTimestamp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there's more than one row
|
// Check if there's more than one row
|
||||||
|
|||||||
5
internal/proxy/ali/config.conf
Normal file
5
internal/proxy/ali/config.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[url]
|
||||||
|
# 消息进来的端口,即监听端口
|
||||||
|
in=:3333
|
||||||
|
# 消息发出去的端口,即转发端口
|
||||||
|
out=47.129.22.53:21000
|
||||||
BIN
internal/proxy/ali/main
Normal file
BIN
internal/proxy/ali/main
Normal file
Binary file not shown.
80
internal/proxy/ali/main.go
Normal file
80
internal/proxy/ali/main.go
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func readConfig() (string, string) {
|
||||||
|
cfg, err := ini.Load("config.conf")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("无法读取配置文件: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
section := cfg.Section("url")
|
||||||
|
|
||||||
|
minerPort := strings.Trim(section.Key("in").String(), `""`)
|
||||||
|
minerPoolAddr := strings.Trim(section.Key("out").String(), `""`)
|
||||||
|
|
||||||
|
return minerPort, minerPoolAddr
|
||||||
|
}
|
||||||
|
|
||||||
|
var minerPort, minerPoolAddr = readConfig()
|
||||||
|
|
||||||
|
// 处理矿机请求的函数
|
||||||
|
func handleMinerConnection(minerConn net.Conn) {
|
||||||
|
defer minerConn.Close()
|
||||||
|
log.Println("有矿机接入")
|
||||||
|
// 连接到矿池
|
||||||
|
poolConn, err := net.Dial("tcp", minerPoolAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("无法连接到矿池: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer poolConn.Close()
|
||||||
|
|
||||||
|
// 启动两个 goroutine:一个从矿机接收数据并转发到矿池,另一个从矿池接收数据并转发回矿机
|
||||||
|
go transferData(minerConn, poolConn)
|
||||||
|
go transferData(poolConn, minerConn)
|
||||||
|
|
||||||
|
// 保持服务运行,直到矿机或矿池关闭连接
|
||||||
|
select {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据转发函数:从源连接读取数据并写入到目标连接
|
||||||
|
func transferData(src net.Conn, dest net.Conn) {
|
||||||
|
_, err := io.Copy(dest, src)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("数据转发失败: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 设置代理服务监听端口
|
||||||
|
listener, err := net.Listen("tcp", minerPort)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("无法启动监听服务: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer listener.Close()
|
||||||
|
|
||||||
|
log.Printf("代理服务启动,监听端口 %s\n", minerPort)
|
||||||
|
|
||||||
|
// 不断接收来自矿机的连接
|
||||||
|
for {
|
||||||
|
// 接受矿机连接
|
||||||
|
minerConn, err := listener.Accept()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("接受连接失败: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 为每个矿机连接启动一个新的 goroutine 来处理
|
||||||
|
go handleMinerConnection(minerConn)
|
||||||
|
}
|
||||||
|
}
|
||||||
5
internal/proxy/aws/config.conf
Normal file
5
internal/proxy/aws/config.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[url]
|
||||||
|
# 消息进来的端口,即监听端口
|
||||||
|
in=:21000
|
||||||
|
# 消息发出去的端口,即转发端口
|
||||||
|
out=stratum+tcp://nexa.m2pool.com:33333
|
||||||
80
internal/proxy/aws/main.go
Normal file
80
internal/proxy/aws/main.go
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func readConfig() (string, string) {
|
||||||
|
cfg, err := ini.Load("config.conf")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("无法读取配置文件: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
section := cfg.Section("url")
|
||||||
|
|
||||||
|
minerPort := strings.Trim(section.Key("in").String(), `""`)
|
||||||
|
minerPoolAddr := strings.Trim(section.Key("out").String(), `""`)
|
||||||
|
|
||||||
|
return minerPort, minerPoolAddr
|
||||||
|
}
|
||||||
|
|
||||||
|
var minerPort, minerPoolAddr = readConfig()
|
||||||
|
|
||||||
|
// 处理矿机请求的函数
|
||||||
|
func handleMinerConnection(minerConn net.Conn) {
|
||||||
|
defer minerConn.Close()
|
||||||
|
log.Println("有矿机接入")
|
||||||
|
// 连接到矿池
|
||||||
|
poolConn, err := net.Dial("tcp", minerPoolAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("无法连接到矿池: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer poolConn.Close()
|
||||||
|
|
||||||
|
// 启动两个 goroutine:一个从矿机接收数据并转发到矿池,另一个从矿池接收数据并转发回矿机
|
||||||
|
go transferData(minerConn, poolConn)
|
||||||
|
go transferData(poolConn, minerConn)
|
||||||
|
|
||||||
|
// 保持服务运行,直到矿机或矿池关闭连接
|
||||||
|
select {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据转发函数:从源连接读取数据并写入到目标连接
|
||||||
|
func transferData(src net.Conn, dest net.Conn) {
|
||||||
|
_, err := io.Copy(dest, src)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("数据转发失败: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// 设置代理服务监听端口
|
||||||
|
listener, err := net.Listen("tcp", minerPort)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("无法启动监听服务: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer listener.Close()
|
||||||
|
|
||||||
|
log.Printf("代理服务启动,监听端口 %s\n", minerPort)
|
||||||
|
|
||||||
|
// 不断接收来自矿机的连接
|
||||||
|
for {
|
||||||
|
// 接受矿机连接
|
||||||
|
minerConn, err := listener.Accept()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("接受连接失败: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 为每个矿机连接启动一个新的 goroutine 来处理
|
||||||
|
go handleMinerConnection(minerConn)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -50,15 +50,12 @@ func CheckPermission() error {
|
|||||||
func NewLinuxClient(auth string) *LinuxClient {
|
func NewLinuxClient(auth string) *LinuxClient {
|
||||||
cfg, err := ini.Load("mining.linux.conf")
|
cfg, err := ini.Load("mining.linux.conf")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("获取挖矿配置失败: %v", err)
|
log.Printf("获取挖矿配置失败: %v", err)
|
||||||
log.Printf("客户端已退出,请重新检查配置文件(%s)是否存在", "mining.linux.conf")
|
log.Printf("客户端已退出,请重新检查配置文件(%s)是否存在", "mining.linux.conf")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// 解析配置
|
// 解析配置
|
||||||
var miningConfig message.MiningConfig
|
var miningConfig message.MiningConfig
|
||||||
// 解析 [bzminer] 部分
|
|
||||||
sectionBzMiner := cfg.Section("bzminer")
|
|
||||||
miningConfig.BzMinerPath = sectionBzMiner.Key("path").String()
|
|
||||||
|
|
||||||
// 解析 [lolminer] 部分
|
// 解析 [lolminer] 部分
|
||||||
sectionLolMiner := cfg.Section("lolminer")
|
sectionLolMiner := cfg.Section("lolminer")
|
||||||
@@ -72,20 +69,11 @@ func NewLinuxClient(auth string) *LinuxClient {
|
|||||||
sectionProxy := cfg.Section("proxy")
|
sectionProxy := cfg.Section("proxy")
|
||||||
miningConfig.ProxyEnabled, _ = sectionProxy.Key("proxy").Bool()
|
miningConfig.ProxyEnabled, _ = sectionProxy.Key("proxy").Bool()
|
||||||
|
|
||||||
if miningConfig.BzMinerPath != "" {
|
|
||||||
result := utils.CheckFileExists(miningConfig.BzMinerPath)
|
|
||||||
if !result {
|
|
||||||
log.Fatalf("未检测到bzminer挖矿软件的存在,请确认是否已经安装bzminer,并核对下列路径:%s", miningConfig.BzMinerPath)
|
|
||||||
log.Println("客户端已退出,确认路径后请重启客户端")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if miningConfig.LolMinerPath != "" {
|
if miningConfig.LolMinerPath != "" {
|
||||||
result := utils.CheckFileExists(miningConfig.LolMinerPath)
|
result := utils.CheckFileExists(miningConfig.LolMinerPath)
|
||||||
if !result {
|
if !result {
|
||||||
log.Fatalf("未检测到lolminer挖矿软件的存在,请确认是否已经安装lolminer,并核对下列路径:%s", miningConfig.LolMinerPath)
|
log.Printf("未检测到lolminer挖矿软件的存在,请确认是否已经安装lolminer,并核对下列路径:%s", miningConfig.LolMinerPath)
|
||||||
log.Println("客户端已退出,确认路径后请重启客户端")
|
log.Fatalln("客户端已退出,确认路径后请重启客户端")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,8 +81,8 @@ func NewLinuxClient(auth string) *LinuxClient {
|
|||||||
if miningConfig.RigelPath != "" {
|
if miningConfig.RigelPath != "" {
|
||||||
result := utils.CheckFileExists(miningConfig.RigelPath)
|
result := utils.CheckFileExists(miningConfig.RigelPath)
|
||||||
if !result {
|
if !result {
|
||||||
log.Fatalf("未检测到rigel挖矿软件的存在,请确认是否已经安装rigel,并核对下列路径:%s", miningConfig.RigelPath)
|
log.Printf("未检测到rigel挖矿软件的存在,请确认是否已经安装rigel,并核对下列路径:%s", miningConfig.RigelPath)
|
||||||
log.Println("客户端已退出,确认路径后请重启客户端")
|
log.Fatalln("客户端已退出,确认路径后请重启客户端")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,8 +98,8 @@ func NewLinuxClient(auth string) *LinuxClient {
|
|||||||
// 获取主机身份
|
// 获取主机身份
|
||||||
mac, err := client.GetMACAddress()
|
mac, err := client.GetMACAddress()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Println(err)
|
||||||
panic("获取当前主机信息失败,程序已退出,请检查网络后重新启动本客户端。")
|
log.Fatalln("获取当前主机信息失败,程序已退出,请检查网络后重新启动本客户端。")
|
||||||
}
|
}
|
||||||
client.MachineCode = mac
|
client.MachineCode = mac
|
||||||
client.ID = auth + "." + mac
|
client.ID = auth + "." + mac
|
||||||
@@ -129,7 +117,7 @@ func (l *LinuxClient) initHistoryTask() {
|
|||||||
l.mu.Unlock()
|
l.mu.Unlock()
|
||||||
err := l.Mining(task)
|
err := l.Mining(task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("重新开启挖矿任务失败,请手动检查:%v", err)
|
log.Printf("重新开启挖矿任务失败,请手动检查:%v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -279,7 +267,7 @@ ALGO=NEXA
|
|||||||
func (l *LinuxClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
func (l *LinuxClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
if l.Status != 2 {
|
if l.Status != 2 {
|
||||||
log.Fatalf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
log.Printf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
l.Status = 1
|
l.Status = 1
|
||||||
@@ -303,14 +291,14 @@ func (l *LinuxClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
// 启动进程
|
// 启动进程
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error starting lolMiner: %v", err)
|
log.Printf("Error starting lolMiner: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 添加执行记录
|
// 添加执行记录
|
||||||
go func() {
|
go func() {
|
||||||
err := l.db.InsertMiningTask(cfg)
|
err := l.db.InsertMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("本次挖矿任务记录失败:%v", err)
|
log.Printf("本次挖矿任务记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 获取 lolMiner 的进程 ID
|
// 获取 lolMiner 的进程 ID
|
||||||
@@ -344,7 +332,7 @@ func (l *LinuxClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := l.db.FinishMiningTask(cfg)
|
err := l.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 输出进程被杀死的信息
|
// 输出进程被杀死的信息
|
||||||
@@ -370,7 +358,7 @@ ALGO=NEXA
|
|||||||
func (l *LinuxClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
func (l *LinuxClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
if l.Status != 2 {
|
if l.Status != 2 {
|
||||||
log.Fatalf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
log.Printf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
l.Status = 1
|
l.Status = 1
|
||||||
@@ -392,14 +380,14 @@ func (l *LinuxClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
// 启动进程
|
// 启动进程
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error starting bzminer: %v", err)
|
log.Printf("Error starting bzminer: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 添加执行记录
|
// 添加执行记录
|
||||||
go func() {
|
go func() {
|
||||||
err := l.db.InsertMiningTask(cfg)
|
err := l.db.InsertMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("本次挖矿任务记录失败:%v", err)
|
log.Printf("本次挖矿任务记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 获取 bzminer 的进程 ID
|
// 获取 bzminer 的进程 ID
|
||||||
@@ -432,7 +420,7 @@ func (l *LinuxClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := l.db.FinishMiningTask(cfg)
|
err := l.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 输出进程被杀死的信息
|
// 输出进程被杀死的信息
|
||||||
@@ -458,7 +446,7 @@ ALGO=nexapow
|
|||||||
func (l *LinuxClient) rigel(cfg message.ConfigurationMiningMsg) {
|
func (l *LinuxClient) rigel(cfg message.ConfigurationMiningMsg) {
|
||||||
l.mu.Lock()
|
l.mu.Lock()
|
||||||
if l.Status != 2 {
|
if l.Status != 2 {
|
||||||
log.Fatalf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
log.Printf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
l.Status = 1
|
l.Status = 1
|
||||||
@@ -481,14 +469,14 @@ func (l *LinuxClient) rigel(cfg message.ConfigurationMiningMsg) {
|
|||||||
// 启动进程
|
// 启动进程
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error starting rigel: %v", err)
|
log.Printf("Error starting rigel: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 添加执行记录
|
// 添加执行记录
|
||||||
go func() {
|
go func() {
|
||||||
err := l.db.InsertMiningTask(cfg)
|
err := l.db.InsertMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("本次挖矿任务记录失败:%v", err)
|
log.Printf("本次挖矿任务记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 获取 rigel 的进程 ID
|
// 获取 rigel 的进程 ID
|
||||||
@@ -522,7 +510,7 @@ func (l *LinuxClient) rigel(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := l.db.FinishMiningTask(cfg)
|
err := l.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 输出进程被结束的信息
|
// 输出进程被结束的信息
|
||||||
|
|||||||
77
internal/src/miningSoft/linux.go
Normal file
77
internal/src/miningSoft/linux.go
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
package miningsoft
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"log"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
XTM - Cuckaroo29 - lolMiner.exe --algo CR29 --pool xtm-c29.kryptex.network:7040 --user WALLET_ADDRESS/WORKER_NAME
|
||||||
|
CFX - Conflux - lolMiner.exe --algo OCTOPUS --pool cfx.kryptex.network:7027 --user WALLET_ADDRESS/WORKER_NAME
|
||||||
|
IRON - IronFish - lolMiner.exe --algo FISHHASH --pool iron.kryptex.network:7017 --user WALLET_ADDRESS.WORKER_NAME
|
||||||
|
NEXA - NexaPow - lolMiner.exe --algo NEXA --pool nexa.kryptex.network:7026 --user WALLET_ADDRESS/WORKER_NAME
|
||||||
|
KLS - Karlsen - lolMiner.exe --algo KARLSENV2 --pool kls.kryptex.network:7022 --user WALLET_ADDRESS/WORKER_NAME
|
||||||
|
ERG - Autolykos - lolMiner.exe --algo AUTOLYKOS2 --pool erg.kryptex.network:7021 --user WALLET_ADDRESS/WORKER_NAME
|
||||||
|
XEL - Xelishashv2 - rigel.exe -a xelishashv2 -o stratum+tcp://xel.kryptex.network:7019 -u WALLET_ADDRESS/WORKER_NAME
|
||||||
|
QUAI - QUAI - rigel.exe -a quai -o stratum+tcp://quai.kryptex.network:7035 -u WALLET_ADDRESS/WORKER_NAME
|
||||||
|
XNA - Neurai - rigel.exe -a kawpow --coin xna -o stratum+tcp://xna.kryptex.network:7024 -u WALLET_ADDRESS/WORKER_NAME
|
||||||
|
CLORE - KawPow - rigel.exe -a kawpow --coin clore -o stratum+tcp://clore.kryptex.network:7025 -u WALLET_ADDRESS/WORKER_NAME
|
||||||
|
RVN - Ravencoin - rigel.exe -a kawpow --coin rvn -o stratum+tcp://rvn.kryptex.network:7031 -u WALLET_ADDRESS/WORKER_NAME
|
||||||
|
*/
|
||||||
|
|
||||||
|
const SOFTNAME = "lolMiner"
|
||||||
|
|
||||||
|
func StartMiner(soft_path, algo, pool, user, worker_id string, ch chan string) {
|
||||||
|
name := filepath.Join(soft_path, SOFTNAME)
|
||||||
|
args := []string{"--algo", algo, "--pool", pool, "--user", user + "/" + worker_id}
|
||||||
|
|
||||||
|
cmd := exec.Command(name, args...)
|
||||||
|
cmd.Dir = soft_path
|
||||||
|
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("获取 lolMiner 标准输出失败: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// stderr, err := cmd.StderrPipe()
|
||||||
|
// if err != nil {
|
||||||
|
// log.Printf("获取 lolMiner 错误输出失败: %v", err)
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
log.Printf("执行命令:%s %s", name, strings.Join(args, " "))
|
||||||
|
// 启动lolminer
|
||||||
|
err = cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting lolMiner: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理标准输出
|
||||||
|
go func() {
|
||||||
|
scanner := bufio.NewScanner(stdout)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
switch {
|
||||||
|
case strings.Contains(line, "Lost connection to stratum"):
|
||||||
|
log.Printf("lolMiner 检测到矿池断开连接: %s", line)
|
||||||
|
case strings.Contains(line, "Average speed (15s)"):
|
||||||
|
if strings.Contains(line, "Average speed (15s): 0.00 Mh/s") {
|
||||||
|
log.Printf("lolMiner 检测到没有算力: %s", line)
|
||||||
|
} else {
|
||||||
|
// 有算力
|
||||||
|
}
|
||||||
|
case strings.Contains(line, "defect stratum message"):
|
||||||
|
log.Printf("lolMiner 检测到 stratum 协议错误: %s", line)
|
||||||
|
|
||||||
|
default:
|
||||||
|
log.Printf("lolMiner 输出: %s", line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
log.Printf("读取 lolMiner 标准输出失败: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
1
internal/src/miningSoft/windows.go
Normal file
1
internal/src/miningSoft/windows.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package miningsoft
|
||||||
@@ -68,6 +68,6 @@ func (s *SystemServer) StopMining(osName string) {
|
|||||||
if srv, ok := s.systems[osName]; ok {
|
if srv, ok := s.systems[osName]; ok {
|
||||||
srv.StopMining()
|
srv.StopMining()
|
||||||
} else {
|
} else {
|
||||||
log.Fatalf("错误的操作系统:%s", osName)
|
log.Printf("错误的操作系统:%s", osName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ func CheckPermission() error {
|
|||||||
func NewWindowsClient(auth string) *WindowsClient {
|
func NewWindowsClient(auth string) *WindowsClient {
|
||||||
cfg, err := ini.Load("mining.windows.conf")
|
cfg, err := ini.Load("mining.windows.conf")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("获取挖矿配置失败: %v", err)
|
log.Printf("获取挖矿配置失败: %v", err)
|
||||||
log.Printf("客户端已退出,请重新检查配置文件(%s)是否存在", "mining.windows.conf")
|
log.Printf("客户端已退出,请重新检查配置文件(%s)是否存在", "mining.windows.conf")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -68,20 +68,11 @@ func NewWindowsClient(auth string) *WindowsClient {
|
|||||||
sectionProxy := cfg.Section("proxy")
|
sectionProxy := cfg.Section("proxy")
|
||||||
miningConfig.ProxyEnabled, _ = sectionProxy.Key("proxy").Bool()
|
miningConfig.ProxyEnabled, _ = sectionProxy.Key("proxy").Bool()
|
||||||
|
|
||||||
if miningConfig.BzMinerPath != "" {
|
|
||||||
result := utils.CheckFileExists(miningConfig.BzMinerPath)
|
|
||||||
if !result {
|
|
||||||
log.Fatalf("未检测到bzminer挖矿软件的存在,请确认是否已经安装bzminer,并核对下列路径:%s", miningConfig.BzMinerPath)
|
|
||||||
log.Println("客户端已退出,确认路径后请重启客户端")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if miningConfig.LolMinerPath != "" {
|
if miningConfig.LolMinerPath != "" {
|
||||||
result := utils.CheckFileExists(miningConfig.LolMinerPath)
|
result := utils.CheckFileExists(miningConfig.LolMinerPath)
|
||||||
if !result {
|
if !result {
|
||||||
log.Fatalf("未检测到lolminer挖矿软件的存在,请确认是否已经安装lolminer,并核对下列路径:%s", miningConfig.LolMinerPath)
|
log.Printf("未检测到lolminer挖矿软件的存在,请确认是否已经安装lolminer,并核对下列路径:%s", miningConfig.LolMinerPath)
|
||||||
log.Println("客户端已退出,确认路径后请重启客户端")
|
log.Fatalln("客户端已退出,确认路径后请重启客户端")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,8 +80,8 @@ func NewWindowsClient(auth string) *WindowsClient {
|
|||||||
if miningConfig.RigelPath != "" {
|
if miningConfig.RigelPath != "" {
|
||||||
result := utils.CheckFileExists(miningConfig.RigelPath)
|
result := utils.CheckFileExists(miningConfig.RigelPath)
|
||||||
if !result {
|
if !result {
|
||||||
log.Fatalf("未检测到rigel挖矿软件的存在,请确认是否已经安装rigel,并核对下列路径:%s", miningConfig.RigelPath)
|
log.Printf("未检测到rigel挖矿软件的存在,请确认是否已经安装rigel,并核对下列路径:%s", miningConfig.RigelPath)
|
||||||
log.Println("客户端已退出,确认路径后请重启客户端")
|
log.Fatalln("客户端已退出,确认路径后请重启客户端")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,8 +96,8 @@ func NewWindowsClient(auth string) *WindowsClient {
|
|||||||
|
|
||||||
mac, err := client.GetMACAddress()
|
mac, err := client.GetMACAddress()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Println(err)
|
||||||
panic("获取当前主机信息失败,程序已退出,请检查网络后重新启动本客户端。")
|
log.Fatalln("获取当前主机信息失败,程序已退出,请检查网络后重新启动本客户端。")
|
||||||
}
|
}
|
||||||
|
|
||||||
client.MachineCode = mac
|
client.MachineCode = mac
|
||||||
@@ -125,7 +116,7 @@ func (w *WindowsClient) initHistoryTask() {
|
|||||||
w.mu.Unlock()
|
w.mu.Unlock()
|
||||||
err := w.Mining(task)
|
err := w.Mining(task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("重新开启挖矿任务失败,请手动检查:%v", err)
|
log.Printf("重新开启挖矿任务失败,请手动检查:%v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -257,6 +248,9 @@ func (w *WindowsClient) GetMACAddress() (string, error) {
|
|||||||
return "", fmt.Errorf("获取到的主机 UUID 无效: %q", uuid)
|
return "", fmt.Errorf("获取到的主机 UUID 无效: %q", uuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 将 UUID 中的 "." 替换成 "::"
|
||||||
|
// uuid = strings.Replace(uuid, ".", "::", -1)
|
||||||
|
|
||||||
// 统一转换为大写,去掉花括号
|
// 统一转换为大写,去掉花括号
|
||||||
uuid = strings.Trim(uuid, "{}")
|
uuid = strings.Trim(uuid, "{}")
|
||||||
uuid = strings.ToUpper(uuid)
|
uuid = strings.ToUpper(uuid)
|
||||||
@@ -271,7 +265,7 @@ Windows 下使用 lolMiner.exe
|
|||||||
func (w *WindowsClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
func (w *WindowsClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
if w.Status != 2 {
|
if w.Status != 2 {
|
||||||
log.Fatalf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
log.Printf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Status = 1
|
w.Status = 1
|
||||||
@@ -295,14 +289,14 @@ func (w *WindowsClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
// 启动进程
|
// 启动进程
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error starting lolMiner: %v", err)
|
log.Printf("Error starting lolMiner: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 添加执行记录
|
// 添加执行记录
|
||||||
go func() {
|
go func() {
|
||||||
err := w.db.InsertMiningTask(cfg)
|
err := w.db.InsertMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("本次挖矿任务记录失败:%v", err)
|
log.Printf("本次挖矿任务记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 获取 lolMiner 的进程 ID
|
// 获取 lolMiner 的进程 ID
|
||||||
@@ -327,7 +321,7 @@ func (w *WindowsClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := w.db.FinishMiningTask(cfg)
|
err := w.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
} else {
|
} else {
|
||||||
@@ -343,7 +337,7 @@ func (w *WindowsClient) lolminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := w.db.FinishMiningTask(cfg)
|
err := w.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@@ -360,7 +354,7 @@ Windows 下使用 bzminer.exe
|
|||||||
func (w *WindowsClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
func (w *WindowsClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
if w.Status != 2 {
|
if w.Status != 2 {
|
||||||
log.Fatalf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
log.Printf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Status = 1
|
w.Status = 1
|
||||||
@@ -382,14 +376,14 @@ func (w *WindowsClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
// 启动进程
|
// 启动进程
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error starting bzminer: %v", err)
|
log.Printf("Error starting bzminer: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 添加执行记录
|
// 添加执行记录
|
||||||
go func() {
|
go func() {
|
||||||
err := w.db.InsertMiningTask(cfg)
|
err := w.db.InsertMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("本次挖矿任务记录失败:%v", err)
|
log.Printf("本次挖矿任务记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 获取 bzminer 的进程 ID
|
// 获取 bzminer 的进程 ID
|
||||||
@@ -425,7 +419,7 @@ func (w *WindowsClient) bzminer(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := w.db.FinishMiningTask(cfg)
|
err := w.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 输出进程被结束的信息
|
// 输出进程被结束的信息
|
||||||
@@ -444,7 +438,7 @@ Windows 下使用 rigel.exe
|
|||||||
func (w *WindowsClient) rigel(cfg message.ConfigurationMiningMsg) {
|
func (w *WindowsClient) rigel(cfg message.ConfigurationMiningMsg) {
|
||||||
w.mu.Lock()
|
w.mu.Lock()
|
||||||
if w.Status != 2 {
|
if w.Status != 2 {
|
||||||
log.Fatalf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
log.Printf("当前还有挖矿任务正在进行中:币=%s, 算法=%s, 矿池=%s, 截止时间=%d", cfg.Coin, cfg.Algo, cfg.Pool, cfg.EndTimestamp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Status = 1
|
w.Status = 1
|
||||||
@@ -467,14 +461,14 @@ func (w *WindowsClient) rigel(cfg message.ConfigurationMiningMsg) {
|
|||||||
// 启动进程
|
// 启动进程
|
||||||
err := cmd.Start()
|
err := cmd.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error starting rigel: %v", err)
|
log.Printf("Error starting rigel: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 添加执行记录
|
// 添加执行记录
|
||||||
go func() {
|
go func() {
|
||||||
err := w.db.InsertMiningTask(cfg)
|
err := w.db.InsertMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("本次挖矿任务记录失败:%v", err)
|
log.Printf("本次挖矿任务记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 获取 rigel 的进程 ID
|
// 获取 rigel 的进程 ID
|
||||||
@@ -510,7 +504,7 @@ func (w *WindowsClient) rigel(cfg message.ConfigurationMiningMsg) {
|
|||||||
go func() {
|
go func() {
|
||||||
err := w.db.FinishMiningTask(cfg)
|
err := w.db.FinishMiningTask(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("修改执行记录失败:%v", err)
|
log.Printf("修改执行记录失败:%v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 输出进程被结束的信息
|
// 输出进程被结束的信息
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func CheckAndUpdate(remoteBaseURL string, currentVersion string) (bool, error) {
|
|||||||
|
|
||||||
// fetchRemoteVersion 从远程获取版本号
|
// fetchRemoteVersion 从远程获取版本号
|
||||||
func fetchRemoteVersion(remoteBaseURL string) (string, error) {
|
func fetchRemoteVersion(remoteBaseURL string) (string, error) {
|
||||||
versionURL := fmt.Sprintf("%s/current_version", remoteBaseURL)
|
versionURL := fmt.Sprintf("%s/user/getClientVersion", remoteBaseURL)
|
||||||
|
|
||||||
resp, err := http.Get(versionURL)
|
resp, err := http.Get(versionURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user