github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/kbfsfuse/main.go (about)

     1  // Copyright 2016 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build !windows
     6  // +build !windows
     7  
     8  // Keybase file system
     9  
    10  package main
    11  
    12  import (
    13  	"flag"
    14  	"fmt"
    15  	"os"
    16  
    17  	"bazil.org/fuse"
    18  
    19  	"github.com/keybase/client/go/kbfs/env"
    20  	"github.com/keybase/client/go/kbfs/libfs"
    21  	"github.com/keybase/client/go/kbfs/libfuse"
    22  	"github.com/keybase/client/go/kbfs/libkbfs"
    23  	"github.com/keybase/client/go/libkb"
    24  	"github.com/keybase/client/go/logger"
    25  )
    26  
    27  var runtimeDir = flag.String("runtime-dir", os.Getenv("KEYBASE_RUNTIME_DIR"), "runtime directory")
    28  var label = flag.String("label", os.Getenv("KEYBASE_LABEL"), "label to help identify if running as a service")
    29  var mountType = flag.String("mount-type", defaultMountType, "mount type: default, force, none")
    30  var version = flag.Bool("version", false, "Print version")
    31  
    32  const usageFormatStr = `Usage:
    33    kbfsfuse -version
    34  
    35  To run against remote KBFS servers:
    36    kbfsfuse
    37      [-runtime-dir=path/to/dir] [-label=label] [-mount-type=default|force|required|none]
    38  %s
    39      %s[/path/to/mountpoint]
    40  
    41  To run in a local testing environment:
    42    kbfsfuse
    43      [-runtime-dir=path/to/dir] [-label=label] [-mount-type=default|force|required|none]
    44  %s
    45      %s[/path/to/mountpoint]
    46  
    47  Defaults:
    48  %s `
    49  
    50  func getUsageString(ctx libkbfs.Context) string {
    51  	remoteUsageStr := libkbfs.GetRemoteUsageString()
    52  	localUsageStr := libkbfs.GetLocalUsageString()
    53  	platformUsageStr := libfuse.GetPlatformUsageString()
    54  	defaultUsageStr := libkbfs.GetDefaultsUsageString(ctx)
    55  	return fmt.Sprintf(usageFormatStr,
    56  		remoteUsageStr, platformUsageStr,
    57  		localUsageStr, platformUsageStr, defaultUsageStr)
    58  }
    59  
    60  func start() *libfs.Error {
    61  	ctx := env.NewContextWithPerfLog(libkb.KBFSPerfLogFileName)
    62  
    63  	kbfsParams := libkbfs.AddFlags(flag.CommandLine, ctx)
    64  	platformParams := libfuse.AddPlatformFlags(flag.CommandLine)
    65  
    66  	flag.Parse()
    67  
    68  	if *version {
    69  		fmt.Printf("%s\n", libkbfs.VersionString())
    70  		return nil
    71  	}
    72  
    73  	mountDir := ""
    74  	if len(flag.Args()) < 1 {
    75  		var err error
    76  		mountDir, err = ctx.GetMountDir()
    77  		if err != nil {
    78  			return libfs.InitError(err.Error())
    79  		}
    80  		// If a mountdir was not set by `keybase config set mountdir`, the
    81  		// service returns a default value which may or may not exist yet.
    82  		if len(mountDir) == 0 {
    83  			fmt.Print(getUsageString(ctx))
    84  			return libfs.InitError("no mount specified")
    85  		}
    86  	} else {
    87  		mountDir = flag.Arg(0)
    88  	}
    89  
    90  	if len(flag.Args()) > 1 {
    91  		fmt.Print(getUsageString(ctx))
    92  		return libfs.InitError("extra arguments specified (flags go before the first argument)")
    93  	}
    94  
    95  	if kbfsParams.Debug {
    96  		// Temporary, until we make a config and can make a vlogger.
    97  		fuseLog := logger.NewWithCallDepth("FUSE", 1)
    98  		fuseLog.Configure("", true, "")
    99  		fuse.Debug = libfuse.MakeFuseDebugFn(
   100  			fuseLog, false /* superVerbose */)
   101  	}
   102  
   103  	logger.EnableBufferedLogging()
   104  	defer logger.Shutdown()
   105  
   106  	options := libfuse.StartOptions{
   107  		KbfsParams:        *kbfsParams,
   108  		PlatformParams:    *platformParams,
   109  		RuntimeDir:        *runtimeDir,
   110  		Label:             *label,
   111  		ForceMount:        *mountType == "force" || *mountType == "required",
   112  		MountErrorIsFatal: *mountType == "required",
   113  		SkipMount:         *mountType == "none",
   114  		MountPoint:        mountDir,
   115  	}
   116  
   117  	return libfuse.Start(options, ctx)
   118  }
   119  
   120  func main() {
   121  	err := start()
   122  	if err != nil {
   123  		fmt.Fprintf(os.Stderr, "kbfsfuse error: (%d) %s\n", err.Code, err.Message)
   124  
   125  		os.Exit(err.Code)
   126  	}
   127  	os.Exit(0)
   128  }