olliesrv: add TCP listener and mount subcommand
- -tcp <addr> flag on start/fgstart listens on TCP in addition to the Unix socket - mount <address> [mountpoint] mounts a remote olliesrv namespace locally via 9pfuse Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
90428a7017
commit
3b5f494aef
61
main.go
61
main.go
|
|
@ -19,15 +19,22 @@ import (
|
|||
const serviceName = "ollie"
|
||||
|
||||
var mountPath = flag.String("mount", "", "FUSE mount path (default: $HOME/mnt/ollie)")
|
||||
var tcpAddr = flag.String("tcp", "", "also listen on TCP address (e.g. :564)")
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
if flag.NArg() < 1 {
|
||||
fmt.Fprintln(os.Stderr, "usage: olliesrv <start|fgstart|stop|status>")
|
||||
fmt.Fprintln(os.Stderr, "usage: olliesrv <start|fgstart|stop|status|mount>")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
switch flag.Arg(0) {
|
||||
case "mount":
|
||||
cmdMount()
|
||||
return
|
||||
}
|
||||
|
||||
ns := client.Namespace()
|
||||
if ns == "" {
|
||||
fmt.Fprintln(os.Stderr, "no namespace")
|
||||
|
|
@ -60,11 +67,36 @@ func main() {
|
|||
os.Exit(1)
|
||||
}
|
||||
default:
|
||||
fmt.Fprintln(os.Stderr, "usage: olliesrv <start|fgstart|stop|status>")
|
||||
fmt.Fprintln(os.Stderr, "usage: olliesrv <start|fgstart|stop|status|mount>")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func cmdMount() {
|
||||
if flag.NArg() < 2 {
|
||||
fmt.Fprintln(os.Stderr, "usage: olliesrv mount <address> [mountpoint]")
|
||||
os.Exit(1)
|
||||
}
|
||||
addr := flag.Arg(1)
|
||||
mnt := flag.Arg(2)
|
||||
if mnt == "" {
|
||||
home, _ := os.UserHomeDir()
|
||||
mnt = filepath.Join(home, "mnt", addr)
|
||||
}
|
||||
if err := os.MkdirAll(mnt, 0755); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "cannot create mount dir: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
cmd := exec.Command("9pfuse", addr, mnt)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "9pfuse: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Printf("mounted %s at %s\n", addr, mnt)
|
||||
}
|
||||
|
||||
func isRunning(sockPath string) bool {
|
||||
conn, err := net.Dial("unix", sockPath)
|
||||
if err == nil {
|
||||
|
|
@ -80,6 +112,9 @@ func daemonize(pidPath string) {
|
|||
if *mountPath != "" {
|
||||
args = append(args, "-mount", *mountPath)
|
||||
}
|
||||
if *tcpAddr != "" {
|
||||
args = append(args, "-tcp", *tcpAddr)
|
||||
}
|
||||
cmd := exec.Command(exe, args...)
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
|
||||
if err := cmd.Start(); err != nil {
|
||||
|
|
@ -152,6 +187,25 @@ func runServer(sockPath, pidPath string) {
|
|||
|
||||
fmt.Printf("olliesrv listening on %s\n", sockPath)
|
||||
|
||||
var tcpListener net.Listener
|
||||
if *tcpAddr != "" {
|
||||
tcpListener, err = net.Listen("tcp", *tcpAddr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "tcp listen: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
go func() {
|
||||
for {
|
||||
conn, err := tcpListener.Accept()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
go srv.Serve(conn)
|
||||
}
|
||||
}()
|
||||
fmt.Printf("olliesrv listening on tcp %s\n", *tcpAddr)
|
||||
}
|
||||
|
||||
// Optional FUSE mount
|
||||
mnt := *mountPath
|
||||
if mnt == "" {
|
||||
|
|
@ -185,6 +239,9 @@ func runServer(sockPath, pidPath string) {
|
|||
fuseCmd.Wait() //nolint:errcheck
|
||||
}
|
||||
listener.Close() //nolint:errcheck
|
||||
if tcpListener != nil {
|
||||
tcpListener.Close() //nolint:errcheck
|
||||
}
|
||||
os.Remove(sockPath)
|
||||
os.Remove(pidPath)
|
||||
olog.Flush()
|
||||
|
|
|
|||
Reference in New Issue