Browse Source

Use Cobra for command parsing.

Frederic G. MARAND 6 years ago
parent
commit
23641875e3
7 changed files with 158 additions and 70 deletions
  1. 3 3
      cmd/kurz/kurz.go
  2. 19 0
      cmd/kurzd/export.go
  3. 66 0
      cmd/kurzd/export_content.go
  4. 5 67
      cmd/kurzd/kurzd.go
  5. 32 0
      cmd/kurzd/rootCmd.go
  6. 4 0
      go.mod
  7. 29 0
      go.sum

+ 3 - 3
cmd/kurz/kurz.go

@@ -1,5 +1,5 @@
 // Package kurz contains the Kurz client command.
 // Package kurz contains the Kurz client command.
-package kurz
+package main
 
 
 /*
 /*
 kurz
 kurz
@@ -24,7 +24,7 @@ kurz
 A Kurz URL created for a Kurz URL
 A Kurz URL created for a Kurz URL
 	- for the same user: the same URL.
 	- for the same user: the same URL.
 	- for a different user: a different URL.
 	- for a different user: a different URL.
- */
+*/
 func main() {
 func main() {
-	
+
 }
 }

+ 19 - 0
cmd/kurzd/export.go

@@ -0,0 +1,19 @@
+package main
+
+import (
+	"fmt"
+	"github.com/spf13/cobra"
+)
+
+var cmdExport = &cobra.Command{
+	Use:   "export",
+	Short: "Export configuration or content",
+	Long:  "Provides subcommands to export configuration as Kurz gets it or content found in the database",
+	Run: func(cmd *cobra.Command, args []string) {
+		fmt.Println("Please use one of the export subcommands")
+	},
+}
+
+func init() {
+	cmd.AddCommand(cmdExport)
+}

+ 66 - 0
cmd/kurzd/export_content.go

@@ -0,0 +1,66 @@
+package main
+
+import (
+	"database/sql"
+	"fmt"
+
+	"github.com/spf13/cobra"
+	"gopkg.in/yaml.v2"
+)
+
+var cmdExportContent = &cobra.Command{
+	Use:   "content",
+	Short: "Export the database contents",
+	Long:  "Export the whole list of Kurz URLs in the database",
+	Run:   exportContentHandler,
+}
+
+func init() {
+	cmdExport.AddCommand(cmdExportContent)
+}
+
+func exportContentLoader(db *sql.DB) ([]MapEntry, error) {
+	stmt, err := db.Prepare(`
+SELECT Hash, url, Date1, Date2, Date3, RefCount
+FROM map
+ORDER BY url`)
+	if err != nil {
+		panic(err.Error())
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query()
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	entry := MapEntry{}
+	var entries []MapEntry
+	for rows.Next() {
+		err = rows.Scan(&entry.Hash, &entry.Url, &entry.Date1, &entry.Date2, &entry.Date3, &entry.RefCount)
+		if err != nil {
+			return nil, err
+		}
+		entries = append(entries, entry)
+	}
+
+	return entries, nil
+}
+
+func exportContentHandler(cmd *cobra.Command, args []string) {
+	dbDriver, dbDsn := parseDbCred()
+	db, err := dbDial(dbDriver, dbDsn)
+	if err != nil {
+		panic("Could not open database")
+	}
+	defer db.Close()
+	entries, err := exportContentLoader(db)
+	if err != nil {
+		panic(err.Error())
+	}
+	y, err := yaml.Marshal(&entries)
+	if err != nil {
+		panic(err.Error())
+	}
+	fmt.Println(string(y))
+}

+ 5 - 67
cmd/kurzd/kurzd.go

@@ -2,12 +2,11 @@
 package main
 package main
 
 
 import (
 import (
-	"fmt"
-	"gopkg.in/yaml.v2"
 	"os"
 	"os"
 	"time"
 	"time"
 
 
 	"database/sql"
 	"database/sql"
+
 	_ "github.com/go-sql-driver/mysql"
 	_ "github.com/go-sql-driver/mysql"
 )
 )
 
 
@@ -30,38 +29,12 @@ kurzd
 		schema							Uninstall the curz database schema.
 		schema							Uninstall the curz database schema.
 	status                          Report on kurzd status
 	status                          Report on kurzd status
 	stop                            Stop all instances of kurzd on the current server (restricted)
 	stop                            Stop all instances of kurzd on the current server (restricted)
- */
+*/
 func main() {
 func main() {
-	command, subCommand, options, err := parseCommand()
-	if err != nil {
-		panic(err.Error())
-	}
-
-	switch command {
-	case "export":
-		switch subCommand {
-		case "content":
-			dbDriver, dbDsn := parseDbCred(options)
-			db, err := dbDial(dbDriver, dbDsn)
-			if err != nil {
-				panic("Could not open database")
-			}
-			defer db.Close()
-			entries, err := exportContent(db)
-			if err != nil {
-				panic(err.Error())
-			}
-			y, err := yaml.Marshal(&entries)
-			if err != nil {
-				panic(err.Error())
-			}
-			fmt.Println(string(y))
-		}
-	}
+	Execute()
+	os.Exit(0)
 }
 }
 
 
-type stringMap map[string]string
-
 type MapEntry struct {
 type MapEntry struct {
 	Hash                uint64
 	Hash                uint64
 	Url                 string
 	Url                 string
@@ -77,7 +50,7 @@ func dbDial(dbDriver, dbDsn string) (*sql.DB, error) {
 	return db, nil
 	return db, nil
 }
 }
 
 
-func parseDbCred(_ stringMap) (driver, dsn string) {
+func parseDbCred() (driver, dsn string) {
 	const DefaultDriver = "mysql"
 	const DefaultDriver = "mysql"
 	const DefaultDsn = "root:root@tcp(localhost:3306)/kurz"
 	const DefaultDsn = "root:root@tcp(localhost:3306)/kurz"
 
 
@@ -94,38 +67,3 @@ func parseDbCred(_ stringMap) (driver, dsn string) {
 
 
 	return envDriver, envDsn
 	return envDriver, envDsn
 }
 }
-
-/* parseCommand returns a valid command/subCommand/options triplet and nil, or
-   an error, in which case the values for the other results are not defined.
- */
-func parseCommand() (command, subCommand string, options stringMap, err error) {
-	return "export", "content", stringMap{}, nil
-}
-
-func exportContent(db *sql.DB) ([]MapEntry, error) {
-	stmt, err := db.Prepare(`
-SELECT Hash, url, Date1, Date2, Date3, RefCount
-FROM map
-ORDER BY url`)
-	if err != nil {
-		panic(err.Error())
-	}
-	defer stmt.Close()
-
-	rows, err := stmt.Query()
-	if err != nil {
-		return nil, err
-	}
-	defer rows.Close()
-	entry := MapEntry{}
-	var entries []MapEntry
-	for rows.Next() {
-		err = rows.Scan(&entry.Hash, &entry.Url, &entry.Date1, &entry.Date2, &entry.Date3, &entry.RefCount)
-		if err != nil {
-			return nil, err
-		}
-		entries = append(entries, entry)
-	}
-
-	return entries, nil
-}

+ 32 - 0
cmd/kurzd/rootCmd.go

@@ -0,0 +1,32 @@
+package main
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/spf13/cobra"
+)
+
+var cmd = &cobra.Command{
+	Use:   "kurzd",
+	Short: "kurzd is the Kurz daemon and back-office command",
+	Long:  "kurzd is the actual engine for Kurz. Use it as the server for your Kurz clients",
+	Run: func(cmd *cobra.Command, args []string) {
+		panic("Not yet implemented")
+	},
+}
+
+func initConfig() {
+
+}
+
+func init() {
+	cobra.OnInitialize(initConfig)
+}
+
+func Execute() {
+	if err := cmd.Execute(); err != nil {
+		fmt.Println(err)
+		os.Exit(1)
+	}
+}

+ 4 - 0
go.mod

@@ -2,6 +2,10 @@ module code.osinet.fr/fgm/kurz
 
 
 require (
 require (
 	github.com/go-sql-driver/mysql v1.4.0
 	github.com/go-sql-driver/mysql v1.4.0
+	github.com/mitchellh/go-homedir v1.0.0 // indirect
+	github.com/spf13/cobra v0.0.3
+	github.com/spf13/pflag v1.0.3 // indirect
+	github.com/spf13/viper v1.2.1 // indirect
 	google.golang.org/appengine v1.3.0 // indirect
 	google.golang.org/appengine v1.3.0 // indirect
 	gopkg.in/yaml.v2 v2.2.1
 	gopkg.in/yaml.v2 v2.2.1
 )
 )

+ 29 - 0
go.sum

@@ -1,7 +1,36 @@
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
 github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I=
+github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg=
+github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
+github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.2.1 h1:bIcUwXqLseLF3BDAZduuNfekWG87ibtFxi59Bq+oI9M=
+github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992 h1:BH3eQWeGbwRU2+wxxuuPOdFBmaiBH81O8BugSjHeTFg=
+golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk=
 google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk=
 google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=