Files
i2p.plugins.tor-updater/supervise/supervise.go

282 lines
6.7 KiB
Go
Raw Normal View History

2022-01-16 21:23:00 -05:00
package tbsupervise
import (
2022-01-23 12:00:37 -05:00
"embed"
2022-01-16 22:04:35 -05:00
"fmt"
2022-01-23 12:00:37 -05:00
"io/fs"
"io/ioutil"
2022-01-16 22:04:35 -05:00
"log"
2022-01-22 01:13:30 -05:00
"net"
2022-01-16 21:23:00 -05:00
"os"
"os/exec"
"path/filepath"
"strings"
2022-01-16 21:23:00 -05:00
"github.com/mitchellh/go-ps"
2022-01-16 21:23:00 -05:00
tbget "i2pgit.org/idk/i2p.plugins.tor-manager/get"
)
var UNPACK_URL = tbget.UNPACK_PATH
var DEFAULT_TB_LANG = tbget.DefaultIETFLang
2022-01-16 21:23:00 -05:00
var (
OS = tbget.OS
ARCH = tbget.ARCH
)
type Supervisor struct {
UnpackPath string
Lang string
2022-01-22 01:09:18 -05:00
torcmd *exec.Cmd
tbcmd *exec.Cmd
ibcmd *exec.Cmd
2022-01-23 12:00:37 -05:00
Profile *embed.FS
}
func (s *Supervisor) TBPath() string {
return filepath.Join(s.UnpackPath, "Browser", "start-tor-browser")
}
func (s *Supervisor) FirefoxPath() string {
return filepath.Join(s.UnpackPath, "Browser", "firefox.real")
}
func (s *Supervisor) TBDirectory() string {
return filepath.Join(s.UnpackPath, "Browser")
}
func (s *Supervisor) TorPath() string {
return filepath.Join(s.UnpackPath, "Browser", "TorBrowser", "Tor", "tor")
}
func (s *Supervisor) TorDataPath() string {
return filepath.Join(s.UnpackPath, "Browser", "TorBrowser", "Data")
}
func (s *Supervisor) I2PDataPath() string {
fp := filepath.Join(filepath.Dir(s.UnpackPath), "i2p.firefox")
if tbget.FileExists(fp) {
return fp
2022-01-23 12:00:37 -05:00
} else {
//unpack the embedded profile
if s.Profile != nil {
if err := s.UnpackI2PData(); err != nil {
log.Fatal(err)
}
}
return fp
2022-01-23 12:00:37 -05:00
}
}
func (s *Supervisor) UnpackI2PData() error {
return fs.WalkDir(s.Profile, ".", func(path string, d fs.DirEntry, err error) error {
fp := filepath.Join(filepath.Dir(s.UnpackPath), "i2p.firefox")
2022-01-23 12:00:37 -05:00
if err != nil {
log.Fatal(err)
2022-01-23 12:00:37 -05:00
}
fmt.Println(path, filepath.Join(fp, strings.Replace(path, "tor-browser/unpack/i2p.firefox", "", -1)))
if d.IsDir() {
os.MkdirAll(filepath.Join(fp, strings.Replace(path, "tor-browser/unpack/i2p.firefox", "", -1)), 0755)
2022-01-23 12:00:37 -05:00
} else {
fullpath := filepath.Join(path)
bytes, err := s.Profile.ReadFile(fullpath)
if err != nil {
2022-01-23 12:00:37 -05:00
return err
}
unpack := filepath.Join(fp, strings.Replace(path, "tor-browser/unpack/i2p.firefox", "", -1))
if err := ioutil.WriteFile(unpack, bytes, 0644); err != nil {
return err
}
}
2022-01-23 12:00:37 -05:00
return nil
})
}
2022-01-22 01:09:18 -05:00
func (s *Supervisor) tbbail() error {
if s.tbcmd != nil && s.tbcmd.Process != nil && s.tbcmd.ProcessState != nil {
if s.tbcmd.ProcessState.Exited() {
return nil
}
return fmt.Errorf("Already running")
}
return nil
}
func (s *Supervisor) RunTBWithLang() error {
2022-01-16 21:23:00 -05:00
tbget.ARCH = ARCH
if s.Lang == "" {
s.Lang = DEFAULT_TB_LANG
2022-01-16 21:23:00 -05:00
}
if s.UnpackPath == "" {
s.UnpackPath = UNPACK_URL
}
2022-01-22 01:09:18 -05:00
if s.tbbail() != nil {
return nil
}
log.Println("running tor browser with lang", s.Lang, s.UnpackPath)
2022-01-16 21:23:00 -05:00
switch OS {
case "linux":
if tbget.FileExists(s.UnpackPath) {
log.Println("running tor browser with lang", s.Lang, s.UnpackPath)
2022-01-22 01:09:18 -05:00
s.tbcmd = exec.Command(s.TBPath())
s.tbcmd.Stdout = os.Stdout
s.tbcmd.Stderr = os.Stderr
return s.tbcmd.Run()
} else {
log.Println("tor browser not found at", s.TBPath())
return fmt.Errorf("tor browser not found at %s", s.TBPath())
}
case "darwin":
2022-01-22 01:09:18 -05:00
s.tbcmd = exec.Command("/usr/bin/env", "open", "-a", "\"Tor Browser.app\"")
s.tbcmd.Dir = s.TBDirectory()
return s.tbcmd.Run()
case "windows":
2022-01-22 01:09:18 -05:00
s.tbcmd = exec.Command("cmd", "/c", "start", "\""+s.TBDirectory()+"\"", "\"Tor Browser.exe\"")
s.tbcmd.Dir = s.TBDirectory()
return s.tbcmd.Run()
default:
}
return nil
}
2022-01-22 01:09:18 -05:00
func (s *Supervisor) ibbail() error {
if s.ibcmd != nil && s.ibcmd.Process != nil && s.ibcmd.ProcessState != nil {
if s.ibcmd.ProcessState.Exited() {
return nil
}
return fmt.Errorf("Already running")
}
return nil
}
func (s *Supervisor) RunI2PBWithLang() error {
tbget.ARCH = ARCH
if s.Lang == "" {
s.Lang = DEFAULT_TB_LANG
}
if s.UnpackPath == "" {
s.UnpackPath = UNPACK_URL
}
2022-01-22 01:09:18 -05:00
if s.ibbail() != nil {
return nil
}
log.Println("running tor browser with lang", s.Lang, s.UnpackPath)
switch OS {
case "linux":
if tbget.FileExists(s.UnpackPath) {
log.Println("running Tor browser with lang and I2P Profile", s.Lang, s.UnpackPath, s.FirefoxPath(), "--profile", s.I2PDataPath())
2022-01-22 01:09:18 -05:00
s.ibcmd = exec.Command(s.FirefoxPath(), "--profile", s.I2PDataPath())
s.ibcmd.Stdout = os.Stdout
s.ibcmd.Stderr = os.Stderr
return s.ibcmd.Run()
} else {
log.Println("tor browser not found at", s.FirefoxPath())
return fmt.Errorf("tor browser not found at %s", s.FirefoxPath())
}
case "darwin":
2022-01-22 01:09:18 -05:00
s.ibcmd = exec.Command("/usr/bin/env", "open", "-a", "\"Tor Browser.app\"")
s.ibcmd.Dir = s.TBDirectory()
return s.ibcmd.Run()
case "windows":
2022-01-22 01:09:18 -05:00
s.ibcmd = exec.Command("cmd", "/c", "start", "\""+s.TBDirectory()+"\"", "\"Tor Browser.exe\"")
s.ibcmd.Dir = s.TBDirectory()
return s.ibcmd.Run()
default:
}
return nil
}
2022-01-22 01:09:18 -05:00
func (s *Supervisor) torbail() error {
2022-01-22 01:13:30 -05:00
_, err := net.Listen("TCP", "127.0.0.1:9050")
if err != nil {
return fmt.Errorf("Already running")
}
2022-01-22 01:09:18 -05:00
if s.torcmd != nil && s.torcmd.Process != nil && s.torcmd.ProcessState != nil {
if s.torcmd.ProcessState.Exited() {
return nil
}
return fmt.Errorf("Already running")
}
return nil
}
func (s *Supervisor) RunTorWithLang() error {
tbget.ARCH = ARCH
if s.Lang == "" {
s.Lang = DEFAULT_TB_LANG
}
if s.UnpackPath == "" {
s.UnpackPath = UNPACK_URL
}
2022-01-22 01:09:18 -05:00
if err := s.torbail(); err != nil {
return nil
}
log.Println("running tor with lang", s.Lang, s.UnpackPath)
switch OS {
case "linux":
if tbget.FileExists(s.UnpackPath) {
log.Println("running tor with lang", s.Lang, s.UnpackPath)
2022-01-22 01:09:18 -05:00
s.torcmd = exec.Command(s.TorPath())
s.torcmd.Stdout = os.Stdout
s.torcmd.Stderr = os.Stderr
return s.torcmd.Run()
2022-01-16 22:04:35 -05:00
} else {
log.Println("tor not found at", s.TorPath())
return fmt.Errorf("tor not found at %s", s.TorPath())
2022-01-16 22:04:35 -05:00
}
2022-01-16 21:23:00 -05:00
case "darwin":
2022-01-22 01:09:18 -05:00
s.torcmd = exec.Command("/usr/bin/env", "open", "-a", "\"Tor Browser.app\"")
s.torcmd.Dir = s.TBDirectory()
return s.torcmd.Run()
2022-01-16 21:23:00 -05:00
case "windows":
2022-01-22 01:09:18 -05:00
s.torcmd = exec.Command("cmd", "/c", "start", "\""+s.TBDirectory()+"\"", "\"Tor Browser.exe\"")
s.torcmd.Dir = s.TBDirectory()
return s.torcmd.Run()
2022-01-16 21:23:00 -05:00
default:
}
return nil
}
2022-01-22 00:42:10 -05:00
func (s *Supervisor) StopTor() error {
2022-01-22 01:09:18 -05:00
return s.torcmd.Process.Kill()
2022-01-22 00:42:10 -05:00
}
func (s *Supervisor) TorIsAlive() (bool, bool) {
_, err := net.Listen("TCP", "127.0.0.1:9050")
if err != nil {
return true, false
}
if s.torcmd != nil && s.torcmd.Process != nil && s.torcmd.ProcessState != nil {
return !s.torcmd.ProcessState.Exited(), true
}
processes, err := ps.Processes()
if err != nil {
return false, true
}
for _, p := range processes {
if p.Executable() == s.TorPath() {
var err error
s.torcmd.Process, err = os.FindProcess(p.Pid())
if err == nil {
return true, true
}
}
}
return false, true
2022-01-22 22:04:30 -05:00
}
func NewSupervisor(tbPath, lang string) *Supervisor {
return &Supervisor{
UnpackPath: tbPath,
Lang: lang,
}
}