func testfn(t *testing.T, fn func(t fstest.Fataler, fss ...zx.Tree)) { fstest.Repeats = 1 fs, err := mfs.New("example mfs") if err != nil { dbg.Fatal("lfs: %s", err) } xfs, _ := fs.AuthFor(&auth.Info{Uid: dbg.Usr, SpeaksFor: dbg.Usr, Ok: true}) tr := New(xfs) tc := make(chan string) dc := make(chan bool) go func() { for x := range tc { printf("%s\n", x) } dc <- true }() fstest.MkZXTree(t, tr) fs.Dbg = testing.Verbose() if fs.Dbg { defer fs.Dump(os.Stdout) } tr.C = tc if fn != nil { fn(t, tr) } tr.Close(nil) close(tc) <-dc }
func mfscache(t zx.Tree, fn func()) (zx.Tree, func(), error) { m, err := mfs.New("cmfs") if err != nil { return nil, nil, fmt.Errorf("mfs: %s", err) } m.IOstats = &zx.IOstats{} m.Dbg = zdebug ncfs.Debug = zdebug xfs, err := ncfs.New("cfs", m, t, rflag) if err != nil { return nil, nil, fmt.Errorf("cfs: %s", err) } st := &zx.IOstats{} xfs.IOstats = st if xaddr != "" { serve(xfs, xaddr) } if sflag { xfn := func() { st.Averages() dbg.Warn("%s iostats:\n%s\n", xfs.Name(), st) if fn != nil { fn() } } return xfs, xfn, nil } return xfs, fn, nil }
// on-memory cache func mcache() (zx.RWTree, *zx.Flags, error) { m, err := mfs.New("cmfs") if err != nil { return nil, nil, fmt.Errorf("mfs: %s", err) } m.IOstats = &zx.IOstats{} m.Dbg = lfsdebug m.WstatAll = true // cfs must be able to write it all return m, m.Flags, nil }
func mkmfstrees(t *testing.T) (zx.RWTree, zx.RWTree) { lfs1, err := mfs.New(tdir) if err != nil { t.Fatalf("mfs: %s", err) } fstest.MkZXTree(t, lfs1) d, err := zx.Stat(lfs1, "/") if err != nil { t.Fatalf("mfs: %s", err) } zx.RegisterProcTree(lfs1, d["tpath"]) lfs1.Dbg = testing.Verbose() && moreverb return lfs1, lfs1 }
func main() { defer dbg.Exits("") os.Args[0] = "zx" port = "8002" opts.NewFlag("p", "port: tcp server port (8002 by default)", &port) wport = "9002" opts.NewFlag("w", "port: wax http server port", &wport) svc = "zx" opts.NewFlag("s", "srv: service name (zx by default)", &svc) addr = "*!*!zx" opts.NewFlag("a", "addr: service address (*!*!zx by default)", &addr) opts.NewFlag("v", "report users logged in/out (verbose)", &Verbose) opts.NewFlag("D", "debug", &Debug) opts.NewFlag("Z", "verbose debug", &Zdebug) opts.NewFlag("M", "debug mutexes", &cfs.DebugLocks) nopings := false opts.NewFlag("k", "do not use zx keep alives", &nopings) args, err := opts.Parse(os.Args) if err != nil { usage(err) } if len(args) == 0 { usage(errors.New("missing arguments")) } Debug = Debug || Zdebug auth.Debug = Debug cfs.Debug = Debug rfs.Verb = Verbose var trs []zx.Tree var ros = map[bool]string{false: "rw", true: "ro"} for i := 0; i < len(args); i++ { al := strings.Split(args[i], "!") if len(al) == 1 { al = append(al, al[0]) al[0] = path.Base(al[0]) } ronly := false caching := true if len(al) == 3 && strings.Contains(al[2], "ro") { ronly = true } if len(al) == 3 && strings.Contains(al[2], "nc") { caching = false } t, err := lfs.New(al[0], al[1], ronly && !caching) if err != nil { dbg.Warn("%s: %s", al[0], err) continue } t.ReadAttrs(true) t.SaveAttrs(caching) t.IOstats = &zx.IOstats{} fp, _ := filepath.Abs(al[1]) if caching { dbg.Warn("%s mfs + lfs %s caching", al[0], ros[ronly]) cache, err := mfs.New("mfs:" + al[0]) if err != nil { dbg.Warn("%s: mfs: %s", al[0], err) continue } cache.IOstats = &zx.IOstats{} cache.Dbg = Zdebug cache.WstatAll = true // cfs must be able to write it all x, err := cfs.New(al[0], cache, t, ronly) if err != nil { dbg.Warn("%s: cfs: %s", al[0], err) continue } x.IOstats = &zx.IOstats{} zxw[al[0]] = fp trs = append(trs, x) } else { dbg.Warn("%s lfs %s uncached", al[0], ros[ronly]) zxw[al[0]] = fp t.Dbg = Debug trs = append(trs, t) } } if len(trs) == 0 { dbg.Fatal("no trees to serve") } ds.DefSvc(svc, port) Vprintf("%s: serve %s...\n", os.Args[0], addr) cc, _, err := ds.Serve(os.Args[0], addr) if err != nil { dbg.Fatal("%s: serve: %s", os.Args[0], err) } go zxwax() for c := range cc { go func(c nchan.Conn) { ai, err := auth.AtServer(c, "", "zx", "finder") if err != nil && err != auth.ErrDisabled { Vprintf("%s: auth %s: %s\n", os.Args[0], c.Tag, err) close(c.In, err) close(c.Out, err) return } srv := rfs.Serve("rfs:"+c.Tag, c, ai, rfs.RW, trs...) if false { srv.Debug = Debug } srv.Pings = !nopings }(*c) } if err := cerror(cc); err != nil { dbg.Fatal("%s: serve: %s", os.Args[0], err) } }
func main() { defer dbg.Exits("") os.Args[0] = "zx" port = "8002" opts.NewFlag("p", "port: tcp server port", &port) wport = "9002" opts.NewFlag("w", "port: wax http server port", &wport) svc = "zx" opts.NewFlag("s", "srv: service name", &svc) addr = "*!*!zx" opts.NewFlag("a", "addr: service address", &addr) opts.NewFlag("D", "debug", &Debug) opts.NewFlag("Z", "verbose debug", &Zdebug) opts.NewFlag("k", "make cfg entries persist in the ns", &Persist) opts.NewFlag("N", "use new cfs", &New) args, err := opts.Parse(os.Args) if err != nil { usage(err) } if len(args) == 0 { usage(nil) } Debug = Debug || Zdebug auth.Debug = Debug ncfs.Debug = Debug cfs.Debug = Debug cfs.Cdebug = Zdebug cfs.Zdebug = Zdebug rfs.Verb = Verbose var trs []zx.Tree var ros = map[bool]string{false: "rw", true: "ro"} for i := 0; i < len(args); i++ { al := strings.Split(args[i], "!") if len(al) == 1 { al = append(al, al[0]) al[0] = path.Base(al[0]) } ronly := false caching := true if len(al) == 3 && strings.Contains(al[2], "ro") { ronly = true } if len(al) == 3 && strings.Contains(al[2], "nc") { caching = false } t, err := lfs.New(al[0], al[1], ronly && !caching) if err != nil { dbg.Warn("%s: %s", al[0], err) continue } t.ReadAttrs(true) t.SaveAttrs(caching) t.IOstats = &zx.IOstats{} fp, _ := filepath.Abs(al[1]) if New && caching { dbg.Warn("%s mfs + lfs %s caching", al[0], ros[ronly]) cache, err := mfs.New("mfs:" + al[0]) if err != nil { dbg.Warn("%s: mfs: %s", al[0], err) continue } cache.IOstats = &zx.IOstats{} cache.Dbg = Zdebug x, err := ncfs.New("cfs", cache, t, ronly) if err != nil { dbg.Warn("%s: cfs: %s", al[0], err) continue } x.IOstats = &zx.IOstats{} zxw[al[0]] = fp trs = append(trs, x) } else if !New && caching { dbg.Warn("%s old cfs + lfs %s caching", al[0], ros[ronly]) x, err := cfs.New("", t, ronly) if err != nil { dbg.Warn("%s: cfs: %s", al[0], err) continue } x.IOstats = &zx.IOstats{} zxw[al[0]] = fp trs = append(trs, x) } else { dbg.Warn("%s lfs %s uncached", al[0], ros[ronly]) zxw[al[0]] = fp t.Dbg = Debug trs = append(trs, t) } } if len(trs) == 0 { dbg.Fatal("no trees to serve") } ds.DefSvc(svc, port) Vprintf("%s: serve %s...\n", os.Args[0], addr) cc, _, err := ds.Serve(os.Args[0], addr) if err != nil { dbg.Fatal("%s: serve: %s", os.Args[0], err) } go zxwax() for c := range cc { go func(c nchan.Conn) { ai, err := auth.AtServer(c, "", "zx", "finder") if err != nil && err != auth.ErrDisabled { Vprintf("%s: auth %s: %s\n", os.Args[0], c.Tag, err) close(c.In, err) close(c.Out, err) return } srv := rfs.Serve("rfs:"+c.Tag, c, ai, rfs.RW, trs...) if false { srv.Debug = Debug } }(*c) } if err := cerror(cc); err != nil { dbg.Fatal("%s: serve: %s", os.Args[0], err) } }