135 lines
2.8 KiB
Go
135 lines
2.8 KiB
Go
// Package main is the command-line entrypoint.
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"os/user"
|
|
"path"
|
|
|
|
"d1.hackers.moe/cairde/ui"
|
|
|
|
openPrivacyLog "git.openprivacy.ca/openprivacy/log"
|
|
_ "github.com/mutecomm/go-sqlcipher/v4"
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
var (
|
|
// Version is the current version of Cairde (LDFLAGS).
|
|
Version string
|
|
|
|
// Commit is the current git commit of Cairde (LDFLAGS).
|
|
Commit string
|
|
|
|
// help is the command-line help output.
|
|
help = `cairde [options]
|
|
|
|
_________ ________ ____ ______
|
|
/ ____/ | / _/ __ \/ __ \/ ____/
|
|
/ / / /| | / // /_/ / / / / __/
|
|
/ /___/ ___ |_/ // _, _/ /_/ / /___
|
|
\____/_/ |_/___/_/ |_/_____/_____/
|
|
|
|
Metadata resistant messaging
|
|
%s
|
|
|
|
Options:
|
|
-a turn on the Tor ACN immediately
|
|
-d turn on debug logging
|
|
-v output version
|
|
-h output help
|
|
`
|
|
)
|
|
|
|
func main() {
|
|
if Version == "" {
|
|
Version = "pre-alpha"
|
|
}
|
|
if Commit == "" {
|
|
Commit = " "
|
|
}
|
|
cairdeVersion := fmt.Sprintf("%s commit %s", Version, Commit[:7])
|
|
|
|
var (
|
|
acnFlag bool
|
|
debugFlag bool
|
|
versionFlag bool
|
|
helpFlag bool
|
|
)
|
|
|
|
flag.BoolVar(&helpFlag, "h", false, "output help")
|
|
flag.BoolVar(&acnFlag, "a", false, "turn on the Tor ACN immediately")
|
|
flag.BoolVar(&debugFlag, "d", false, "turn on debug logging")
|
|
flag.BoolVar(&versionFlag, "v", false, "output version")
|
|
flag.Parse()
|
|
|
|
if helpFlag {
|
|
fmt.Print(fmt.Sprintf(help, cairdeVersion))
|
|
os.Exit(0)
|
|
}
|
|
|
|
if versionFlag {
|
|
fmt.Printf("%s\n", cairdeVersion)
|
|
os.Exit(0)
|
|
}
|
|
|
|
_, err := exec.LookPath("tor")
|
|
// NOTE(d1): pending https://git.coopcloud.tech/decentral1se/cairde/issues/1
|
|
if err != nil {
|
|
log.Fatal("main: could not find 'tor' command, is it installed?")
|
|
}
|
|
|
|
user, err := user.Current()
|
|
if err != nil {
|
|
log.Fatalf("main: unable to determine current user: %s", err)
|
|
}
|
|
|
|
cairdeHomeDir := path.Join(user.HomeDir, ".cairde")
|
|
cairdeLogsDir := path.Join(cairdeHomeDir, "logs")
|
|
for _, baseDir := range []string{cairdeHomeDir, cairdeLogsDir} {
|
|
if err := os.Mkdir(baseDir, 0760); err != nil {
|
|
if !os.IsExist(err) {
|
|
log.Fatalf("main: unable to create directory %s: %s", baseDir, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
cairdeLogPath := path.Join(cairdeLogsDir, "cairde.log")
|
|
f, err := tea.LogToFile(cairdeLogPath, "debug")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer f.Close()
|
|
|
|
cwtchLogPath := path.Join(cairdeLogsDir, "cwtch.log")
|
|
filelogger, err := openPrivacyLog.NewFile(openPrivacyLog.LevelInfo, cwtchLogPath)
|
|
if err == nil {
|
|
openPrivacyLog.SetStd(filelogger)
|
|
}
|
|
|
|
p := tea.NewProgram(
|
|
ui.NewModel(
|
|
user.Username,
|
|
user.HomeDir,
|
|
cairdeVersion,
|
|
debugFlag,
|
|
),
|
|
tea.WithAltScreen(),
|
|
tea.WithMouseAllMotion(),
|
|
)
|
|
|
|
if acnFlag {
|
|
go func() {
|
|
p.Send(ui.AcnOnMsg{})
|
|
}()
|
|
}
|
|
|
|
if _, err := p.Run(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|