Skip to content

Commit

Permalink
Restore the backup command
Browse files Browse the repository at this point in the history
  • Loading branch information
xwjdsh committed Jun 20, 2018
1 parent 37e6657 commit b02b68d
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 12 deletions.
27 changes: 25 additions & 2 deletions cmd/manssh/actions.go
Expand Up @@ -3,6 +3,8 @@ package main
import (
"errors"
"fmt"
"os"
"os/exec"
"path/filepath"

"github.com/xwjdsh/manssh"
Expand Down Expand Up @@ -96,7 +98,7 @@ func updateCmd(c *cli.Context) error {
return cli.NewExitError(err, 1)
}

fmt.Printf("%s updated successfully.\n\n", utils.SuccessFlag)
fmt.Printf("%s updated successfully\n\n", utils.SuccessFlag)
printHost(c.Bool("path"), host)
return nil
}
Expand All @@ -110,7 +112,28 @@ func deleteCmd(c *cli.Context) error {
fmt.Printf(utils.ErrorFlag)
return cli.NewExitError(err, 1)
}
fmt.Printf("%s deleted successfully.\n\n", utils.SuccessFlag)
fmt.Printf("%s deleted successfully\n\n", utils.SuccessFlag)
printHosts(c.Bool("path"), hosts)
return nil
}

func backupCmd(c *cli.Context) error {
if err := utils.ArgumentsCheck(c.NArg(), 1, 1); err != nil {
return printErrorWithHelp(c, err)
}
backupPath := c.Args().First()
os.MkdirAll(backupPath, os.ModePerm)

paths, err := manssh.GetFilePaths(path)
if err != nil {
return cli.NewExitError(err, 1)
}
for _, path := range paths {
np := filepath.Join(backupPath, filepath.Base(path))
if err := exec.Command("cp", path, np).Run(); err != nil {
return cli.NewExitError(err, 1)
}
}
fmt.Printf("%s backup ssh config to [%s] successfully\n", utils.SuccessFlag, backupPath)
return nil
}
6 changes: 6 additions & 0 deletions cmd/manssh/commands.go
Expand Up @@ -44,5 +44,11 @@ func commands() []cli.Command {
Action: deleteCmd,
Aliases: []string{"d"},
},
{
Name: "backup",
Usage: "Backup SSH config files",
Action: backupCmd,
Aliases: []string{"b"},
},
}
}
6 changes: 3 additions & 3 deletions cmd/manssh/print.go
Expand Up @@ -19,8 +19,8 @@ func printErrorWithHelp(c *cli.Context, err error) error {
}

func printHosts(showPath bool, hosts []*manssh.HostConfig) {
var aliases []string
var noConnectAliases []string
var aliases []string
var noConnectAliases []string
hostMap := map[string]*manssh.HostConfig{}

for _, host := range hosts {
Expand All @@ -47,7 +47,7 @@ func printHost(showPath bool, host *manssh.HostConfig) {
fmt.Printf("\t%s", color.MagentaString(host.Alias))
if showPath && len(host.PathMap) > 0 {

var paths []string
var paths []string
for path := range host.PathMap {
if homeDir := utils.GetHomeDir(); strings.HasPrefix(path, homeDir) {
path = strings.Replace(path, homeDir, "~", 1)
Expand Down
26 changes: 19 additions & 7 deletions sshconfig.go
Expand Up @@ -25,7 +25,7 @@ func readFile(p string) (*ssh_config.Config, error) {
}

func deleteHostFromConfig(config *ssh_config.Config, host *ssh_config.Host) {
var hs []*ssh_config.Host
var hs []*ssh_config.Host
for _, h := range config.Hosts {
if h == host {
continue
Expand Down Expand Up @@ -150,7 +150,7 @@ func List(p string, lo ListOption) ([]*HostConfig, error) {
return nil, err
}

var result []*HostConfig
var result []*HostConfig
for _, host := range aliasMap {
values := []string{host.Alias}
for _, v := range host.OwnConfig {
Expand Down Expand Up @@ -202,7 +202,7 @@ func Add(p string, ao *AddOption) (*HostConfig, error) {
return nil, err
}
}
var nodes []ssh_config.Node
var nodes []ssh_config.Node
for k, v := range ao.Config {
nodes = append(nodes, ssh_config.NewKV(strings.ToLower(k), v))
}
Expand Down Expand Up @@ -308,7 +308,7 @@ func Update(p string, uo *UpdateOption) (*HostConfig, error) {
if i == 0 {
configMap[fp].Hosts = append(configMap[fp].Hosts, newHost)
}
var patterns []*ssh_config.Pattern
var patterns []*ssh_config.Pattern
for _, pattern := range host.Patterns {
if pattern.String() != uo.NewAlias {
patterns = append(patterns, pattern)
Expand All @@ -320,7 +320,7 @@ func Update(p string, uo *UpdateOption) (*HostConfig, error) {
if len(host.Patterns) == 1 {
deleteHostFromConfig(configMap[fp], host)
} else {
var patterns []*ssh_config.Pattern
var patterns []*ssh_config.Pattern
for _, pattern := range host.Patterns {
if pattern.String() != uo.NewAlias {
patterns = append(patterns, pattern)
Expand Down Expand Up @@ -351,7 +351,7 @@ func Delete(p string, aliases ...string) ([]*HostConfig, error) {
return nil, err
}

var deleteHosts []*HostConfig
var deleteHosts []*HostConfig
for _, alias := range aliases {
deleteHost := aliasMap[alias]
deleteHosts = append(deleteHosts, deleteHost)
Expand All @@ -360,7 +360,7 @@ func Delete(p string, aliases ...string) ([]*HostConfig, error) {
if len(host.Patterns) == 1 {
deleteHostFromConfig(configMap[fp], host)
} else {
var patterns []*ssh_config.Pattern
var patterns []*ssh_config.Pattern
for _, pattern := range host.Patterns {
if pattern.String() != alias {
patterns = append(patterns, pattern)
Expand All @@ -378,6 +378,18 @@ func Delete(p string, aliases ...string) ([]*HostConfig, error) {
return deleteHosts, nil
}

func GetFilePaths(p string) ([]string, error) {
configMap, _, err := parseConfig(p)
if err != nil {
return nil, err
}
paths := make([]string, 0, len(configMap))
for path := range configMap {
paths = append(paths, path)
}
return paths, nil
}

func checkAlias(aliasMap map[string]*HostConfig, expectExist bool, aliases ...string) error {
for _, alias := range aliases {
ok := aliasMap[alias] != nil
Expand Down
8 changes: 8 additions & 0 deletions sshconfig_test.go
Expand Up @@ -210,3 +210,11 @@ func TestDelete(t *testing.T) {
require.NotNil(t, hostMap["*"])
require.Equal(t, "22", hostMap["main1"].ImplicitConfig["port"])
}

func TestGetFilePaths(t *testing.T) {
initConfig()
defer os.Remove(configRootDir)
paths, err := GetFilePaths(mainConfigPath)
require.Nil(t, err)
require.Equal(t, 3, len(paths))
}

0 comments on commit b02b68d

Please sign in to comment.