github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/plugins/cgminer/bitmine/commander.go (about)

     1  // This file is part of the Smart Home
     2  // Program complex distribution https://github.com/e154/smart-home
     3  // Copyright (C) 2016-2023, Filippov Alex
     4  //
     5  // This library is free software: you can redistribute it and/or
     6  // modify it under the terms of the GNU Lesser General Public
     7  // License as published by the Free Software Foundation; either
     8  // version 3 of the License, or (at your option) any later version.
     9  //
    10  // This library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13  // Library General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Lesser General Public
    16  // License along with this library.  If not, see
    17  // <https://www.gnu.org/licenses/>.
    18  
    19  package bitmine
    20  
    21  import (
    22  	"bufio"
    23  	"bytes"
    24  	"encoding/json"
    25  	"fmt"
    26  	"net"
    27  	"time"
    28  )
    29  
    30  // Transport ...
    31  type Transport struct {
    32  	server  string
    33  	timeout time.Duration
    34  	device  DeviceType
    35  }
    36  
    37  // NewTransport ...
    38  func NewTransport(host string, port int, timeout int64) ITransport {
    39  	return &Transport{
    40  		server:  fmt.Sprintf("%s:%d", host, port),
    41  		timeout: time.Duration(timeout) * time.Second,
    42  	}
    43  }
    44  
    45  // RunCommand ...
    46  func (tr Transport) RunCommand(command, argument string) (res []byte, err error) {
    47  	var conn net.Conn
    48  	if conn, err = net.DialTimeout("tcp", tr.server, tr.timeout); err != nil {
    49  		return
    50  	}
    51  	defer conn.Close()
    52  	_ = conn.SetDeadline(time.Now().Add(tr.timeout))
    53  
    54  	request := &commandRequest{
    55  		Command:   command,
    56  		Parameter: argument,
    57  	}
    58  
    59  	requestBody, _ := json.Marshal(request)
    60  	if _, err = conn.Write(requestBody); err != nil {
    61  		return
    62  	}
    63  	var result []byte
    64  	if result, err = bufio.NewReader(conn).ReadBytes(0x00); err != nil {
    65  		return
    66  	}
    67  	res = bytes.TrimRight(result, "\x00")
    68  	return
    69  }