Adding Tor autostart
This commit is contained in:
parent
bdd8f9a5fd
commit
b4c1ac37c4
|
@ -9,6 +9,7 @@ import (
|
||||||
// Application is a facade over a cwtchPeer that provides some wrapping logic.
|
// Application is a facade over a cwtchPeer that provides some wrapping logic.
|
||||||
type Application struct {
|
type Application struct {
|
||||||
Peer peer.CwtchPeerInterface
|
Peer peer.CwtchPeerInterface
|
||||||
|
TorManager *tor.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewProfile creates a new cwtchPeer with a given name.
|
// NewProfile creates a new cwtchPeer with a given name.
|
||||||
|
@ -42,10 +43,11 @@ func (app *Application) SetProfile(filename string, password string) error {
|
||||||
app.Peer = profile
|
app.Peer = profile
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
||||||
_, err := tor.NewTorManager(9050, 9051)
|
tm, err := tor.NewTorManager(9050, 9051)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
app.TorManager = tm
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
err := app.Peer.Listen()
|
err := app.Peer.Listen()
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
|
"os"
|
||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -428,7 +429,16 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if profilefile != "" {
|
if profilefile != "" {
|
||||||
|
if app.Peer != nil {
|
||||||
app.Peer.Save(profilefile)
|
app.Peer.Save(profilefile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if app.TorManager != nil {
|
||||||
|
fmt.Println("Shutting down Tor process...")
|
||||||
|
app.TorManager.Shutdown()
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -4,9 +4,14 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/yawning/bulb"
|
"github.com/yawning/bulb"
|
||||||
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"os/user"
|
||||||
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -15,6 +20,7 @@ import (
|
||||||
type Manager struct {
|
type Manager struct {
|
||||||
socksPort int
|
socksPort int
|
||||||
controlPort int
|
controlPort int
|
||||||
|
process *exec.Cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTorManager Instantiates a new connection manager, returns non-nil error if it fails to connect to a tor daemon on the given ports.
|
// NewTorManager Instantiates a new connection manager, returns non-nil error if it fails to connect to a tor daemon on the given ports.
|
||||||
|
@ -23,6 +29,39 @@ func NewTorManager(socksPort int, controlPort int) (*Manager, error) {
|
||||||
torManager.socksPort = socksPort
|
torManager.socksPort = socksPort
|
||||||
torManager.controlPort = controlPort
|
torManager.controlPort = controlPort
|
||||||
err := torManager.TestConnection()
|
err := torManager.TestConnection()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
usr, err := user.Current()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
torrc := path.Join(usr.HomeDir, ".cwtch", "torrc")
|
||||||
|
if _, err := os.Stat(torrc); os.IsNotExist(err) {
|
||||||
|
|
||||||
|
os.MkdirAll(path.Join(usr.HomeDir, ".cwtch"), 0700)
|
||||||
|
|
||||||
|
file, err := os.Create(torrc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fmt.Fprintf(file, "SOCKSPort %d\nControlPort %d\n", socksPort, controlPort)
|
||||||
|
file.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command("tor", "-f", torrc)
|
||||||
|
err = cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
fmt.Printf("\nWaiting to connect to Tor Proxy...\n")
|
||||||
|
time.Sleep(time.Second * 5)
|
||||||
|
torManager.process = cmd
|
||||||
|
err = torManager.TestConnection()
|
||||||
|
return torManager, err
|
||||||
|
}
|
||||||
|
|
||||||
return torManager, err
|
return torManager, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +74,15 @@ const (
|
||||||
proxyStatusTimeout
|
proxyStatusTimeout
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Shutdown kills the managed Tor Process
|
||||||
|
func (tm *Manager) Shutdown() {
|
||||||
|
if tm.process != nil {
|
||||||
|
if err := tm.process.Process.Kill(); err != nil {
|
||||||
|
log.Fatal("failed to kill process: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Detect whether a proxy is connectable and is a Tor proxy
|
// Detect whether a proxy is connectable and is a Tor proxy
|
||||||
func checkTorProxy(proxyAddress string) proxyStatus {
|
func checkTorProxy(proxyAddress string) proxyStatus {
|
||||||
// A trick to do this without making an outward connection is,
|
// A trick to do this without making an outward connection is,
|
||||||
|
|
Loading…
Reference in New Issue