Files
zerobundle/launch.go
2020-07-29 13:45:44 -04:00

261 lines
4.9 KiB
Go

package zerobundle
import (
"context"
"fmt"
"io/ioutil"
"log"
"net"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"time"
)
import (
"github.com/eyedeekay/checki2cp"
)
var i2cpConf = `i2cp.tcp.host=127.0.0.1
i2cp.tcp.port=7654
`
func WriteI2CPConf() error {
dir, err := UnpackZeroDir()
if err != nil {
return err
}
os.Setenv("I2CP_HOME", dir)
os.Setenv("GO_I2CP_CONF", "/.i2cp.conf")
home := os.Getenv("I2CP_HOME")
conf := os.Getenv("GO_I2CP_CONF")
if err := ioutil.WriteFile(filepath.Join(home, conf), []byte(i2cpConf), 0644); err != nil {
return err
}
return nil
}
func ZeroMain() error {
if err := WriteI2CPConf(); err != nil {
return err
}
if ok, err := checki2p.ConditionallyLaunchI2P(); ok {
if err != nil {
return err
}
} else {
if err := UnpackZero(); err != nil {
log.Println(err)
}
latest := LatestZero()
log.Println("latest zero version is:", latest)
if err := StartZero(); err != nil {
return err
}
log.Println("Starting SAM")
if err := SAM(); err != nil {
return err
}
}
return nil
}
var cmd *exec.Cmd
func GetZeroCMD() *exec.Cmd {
return cmd
}
func GetZeroPID() int {
return cmd.Process.Pid
}
func GetZeroProcess() *os.Process {
return cmd.Process
}
func LatestZero() string {
if runtime.GOOS == "windows" {
return filepath.Join(LatestZeroBinDir(), "i2p-zero.exe")
} else {
return filepath.Join(LatestZeroBinDir(), "i2p-zero")
}
}
func LatestZeroJavaHome() string {
if runtime.GOOS == "windows" {
return filepath.Join(LatestZeroBinDirJavaHome(), "i2p-zero.exe")
} else {
return filepath.Join(LatestZeroBinDirJavaHome(), "i2p-zero")
}
}
func LatestZeroBinDir() string {
var dir string
var err error
if dir, err = UnpackZeroDir(); err == nil {
ks, er := ioutil.ReadDir(JAVA_I2P_OPT_DIR)
fs := []os.FileInfo{}
for _, k := range ks {
if k.IsDir() {
if strings.Contains(k.Name(), "i2p-zero-") {
fs = append(fs, k)
}
}
}
if er != nil {
log.Fatal(er)
}
if runtime.GOOS == "windows" {
return filepath.Join(dir, fs[len(fs)-1].Name(), "router")
} else {
return filepath.Join(dir, fs[len(fs)-1].Name(), "router", "bin")
}
} else {
log.Fatal(err)
}
return ""
}
func LatestZeroBinDirJavaHome() string {
ks, er := ioutil.ReadDir(JAVA_I2P_OPT_DIR)
fs := []os.FileInfo{}
for _, k := range ks {
if k.IsDir() {
if strings.Contains(k.Name(), "i2p-zero-") {
fs = append(fs, k)
}
}
}
if er != nil {
log.Fatal(er)
}
if runtime.GOOS == "windows" {
return filepath.Join(JAVA_I2P_OPT_DIR, fs[len(fs)-1].Name(), "router")
} else {
return filepath.Join(JAVA_I2P_OPT_DIR, fs[len(fs)-1].Name(), "router", "bin")
}
}
func StopZero() {
if runtime.GOOS == "windows" {
GetZeroProcess().Signal(os.Kill)
} else {
GetZeroProcess().Signal(os.Interrupt)
}
}
func CommandZero() (*exec.Cmd, error) {
if err := UnpackZero(); err != nil {
log.Println(err)
}
latest := LatestZero()
cmd = exec.Command(latest)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd, nil
}
func CommandZeroContext(ctx context.Context) (*exec.Cmd, error) {
if err := UnpackZero(); err != nil {
log.Println(err)
}
latest := LatestZero()
cmd = exec.CommandContext(ctx, latest)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd, nil
}
func RunZero() error {
var err error
cmd, err = CommandZero()
if err != nil {
return err
}
return cmd.Run()
}
func StartZero() error {
var err error
cmd, err = CommandZero()
if err != nil {
return err
}
return cmd.Start()
}
func CommandZeroJavaHome() (*exec.Cmd, error) {
if err := UnpackZeroJavaHome(); err != nil {
log.Println(err)
}
latest := LatestZeroJavaHome()
cmd = exec.Command(latest)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd, nil
}
func CommandZeroJavaHomeContext(ctx context.Context) (*exec.Cmd, error) {
if err := UnpackZeroJavaHome(); err != nil {
log.Println(err)
}
latest := LatestZeroJavaHome()
cmd = exec.CommandContext(ctx, latest)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd, nil
}
func RunZeroJavaHome() error {
var err error
cmd, err = CommandZeroJavaHome()
if err != nil {
return err
}
return cmd.Run()
}
func StartZeroJavaHome() error {
var err error
cmd, err = CommandZeroJavaHome()
if err != nil {
return err
}
return cmd.Start()
}
func Available() bool {
for i := 1; i < 5; i++ {
timeout := time.Second
conn, err := net.DialTimeout("tcp", net.JoinHostPort("127.0.0.1", "8051"), timeout)
if err != nil {
log.Println("Connecting error:", err)
}
if conn != nil {
defer conn.Close()
return true
}
}
return false
}
func SAM() error {
if Available() {
tcp, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 8051})
if err != nil {
return err
}
defer tcp.Close()
if runtime.GOOS == "windows" {
tcp.Write([]byte("sam.create\r\n"))
} else {
tcp.Write([]byte("sam.create\n"))
}
return nil
}
return fmt.Errorf("I2P Zero connection error")
}