mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-10 09:52:20 +08:00
108 lines
2.3 KiB
Go
108 lines
2.3 KiB
Go
package daemon
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/json"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
|
|
ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
|
|
manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr/net"
|
|
|
|
u "github.com/jbenet/go-ipfs/util"
|
|
)
|
|
|
|
// ErrDaemonNotRunning is returned when attempting to retrieve the daemon's
|
|
// address and the daemon is not actually running.
|
|
var ErrDaemonNotRunning = errors.New("daemon not running")
|
|
|
|
func getDaemonAddr(confdir string) (string, error) {
|
|
var err error
|
|
confdir, err = u.TildeExpansion(confdir)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
fi, err := os.Open(confdir + "/rpcaddress")
|
|
if err != nil {
|
|
log.Debugf("getDaemonAddr failed: %s", err)
|
|
if err == os.ErrNotExist {
|
|
return "", ErrDaemonNotRunning
|
|
}
|
|
return "", err
|
|
}
|
|
|
|
read := bufio.NewReader(fi)
|
|
|
|
// TODO: operating system agostic line delim
|
|
line, err := read.ReadBytes('\n')
|
|
if err != nil && err != io.EOF {
|
|
return "", err
|
|
}
|
|
return string(line), nil
|
|
}
|
|
|
|
// SendCommand attempts to run the command over a currently-running daemon.
|
|
// If there is no running daemon, returns ErrDaemonNotRunning. This is done
|
|
// over network RPC API. The address of the daemon is retrieved from the config
|
|
// directory, where live daemons write their addresses to special files.
|
|
func SendCommand(command *Command, confdir string) error {
|
|
server := os.Getenv("IPFS_ADDRESS_RPC")
|
|
|
|
if server == "" {
|
|
//check if daemon is running
|
|
log.Info("Checking if daemon is running...")
|
|
if !serverIsRunning(confdir) {
|
|
return ErrDaemonNotRunning
|
|
}
|
|
|
|
log.Info("Daemon is running!")
|
|
|
|
var err error
|
|
server, err = getDaemonAddr(confdir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return serverComm(server, command)
|
|
}
|
|
|
|
func serverIsRunning(confdir string) bool {
|
|
var err error
|
|
confdir, err = u.TildeExpansion(confdir)
|
|
if err != nil {
|
|
log.Errorf("Tilde Expansion Failed: %s", err)
|
|
return false
|
|
}
|
|
lk, err := daemonLock(confdir)
|
|
if err == nil {
|
|
lk.Close()
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func serverComm(server string, command *Command) error {
|
|
log.Info("Daemon address: %s", server)
|
|
maddr, err := ma.NewMultiaddr(server)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
conn, err := manet.Dial(maddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
enc := json.NewEncoder(conn)
|
|
err = enc.Encode(command)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
io.Copy(os.Stdout, conn)
|
|
|
|
return nil
|
|
}
|