2
This commit is contained in:
57
app.go
57
app.go
@@ -24,6 +24,8 @@ type CommandRunner interface {
|
||||
Run(name string, args ...string) error
|
||||
}
|
||||
|
||||
type LookPathFunc func(file string) (string, error)
|
||||
|
||||
type RealUserManager struct{}
|
||||
|
||||
func (RealUserManager) UserExists(name string) bool {
|
||||
@@ -49,14 +51,18 @@ func (OSCommandRunner) Run(name string, args ...string) error {
|
||||
type App struct {
|
||||
configPath string
|
||||
users UserManager
|
||||
runner CommandRunner
|
||||
lookPath LookPathFunc
|
||||
reader *bufio.Reader
|
||||
writer *bufio.Writer
|
||||
}
|
||||
|
||||
func NewApp(configPath string, users UserManager) *App {
|
||||
func NewApp(configPath string, users UserManager, runner CommandRunner, lookPath LookPathFunc) *App {
|
||||
return &App{
|
||||
configPath: configPath,
|
||||
users: users,
|
||||
runner: runner,
|
||||
lookPath: lookPath,
|
||||
reader: bufio.NewReader(os.Stdin),
|
||||
writer: bufio.NewWriter(os.Stdout),
|
||||
}
|
||||
@@ -65,9 +71,17 @@ func NewApp(configPath string, users UserManager) *App {
|
||||
func (a *App) Run() error {
|
||||
doc, err := ParseConfigFile(a.configPath)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
doc, err = a.handleMissingConfig()
|
||||
if err == nil {
|
||||
goto loaded
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("read config: %w", err)
|
||||
}
|
||||
|
||||
loaded:
|
||||
for {
|
||||
shareSections := doc.ShareSections()
|
||||
a.println("")
|
||||
@@ -118,6 +132,47 @@ func (a *App) Run() error {
|
||||
}
|
||||
}
|
||||
|
||||
func (a *App) handleMissingConfig() (*Document, error) {
|
||||
a.println("")
|
||||
a.println("Samba is not set up yet on this computer.")
|
||||
a.printf("I couldn't find the Samba config file at %s.\n", a.configPath)
|
||||
|
||||
plan, ok := DetectSambaInstallPlan(a.lookPath, os.Geteuid() == 0)
|
||||
if !ok {
|
||||
a.println("I also couldn't find a supported package manager automatically.")
|
||||
a.println("Install the Samba server package for your Linux distribution, then run this tool again.")
|
||||
a.flush()
|
||||
return nil, os.ErrNotExist
|
||||
}
|
||||
|
||||
a.println("")
|
||||
a.printf("I found %s and can try to install the Samba server for you.\n", plan.ManagerName)
|
||||
a.printf("This would run: %s\n", plan.DisplayCommand())
|
||||
a.println("You may be asked for your administrator password.")
|
||||
a.flush()
|
||||
|
||||
install, err := a.confirm("Install Samba server now", true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !install {
|
||||
return nil, os.ErrNotExist
|
||||
}
|
||||
|
||||
if err := a.runner.Run(plan.Command[0], plan.Command[1:]...); err != nil {
|
||||
return nil, fmt.Errorf("install Samba with %s: %w", plan.ManagerName, err)
|
||||
}
|
||||
|
||||
doc, err := ParseConfigFile(a.configPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Samba installation finished, but the config file is still missing at %s: %w", a.configPath, err)
|
||||
}
|
||||
|
||||
a.println("Samba was installed and the config file is now available.")
|
||||
a.flush()
|
||||
return doc, nil
|
||||
}
|
||||
|
||||
func (a *App) addShare(doc *Document) error {
|
||||
cfg, err := a.collectShareConfig(ShareConfig{})
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user