shiori/internal/cmd/root.go

141 lines
3.2 KiB
Go
Raw Normal View History

2019-05-21 03:31:40 +00:00
package cmd
import (
2019-09-22 01:25:34 +00:00
"fmt"
2019-08-09 03:19:43 +00:00
"os"
fp "path/filepath"
2019-05-21 16:24:11 +00:00
"github.com/go-shiori/shiori/internal/database"
2019-08-09 03:19:43 +00:00
apppaths "github.com/muesli/go-app-paths"
2019-05-21 03:31:40 +00:00
"github.com/spf13/cobra"
)
2019-05-21 16:24:11 +00:00
var (
2019-08-09 03:19:43 +00:00
db database.DB
dataDir string
developmentMode bool
2019-05-21 16:24:11 +00:00
)
2019-05-21 03:31:40 +00:00
// ShioriCmd returns the root command for shiori
func ShioriCmd() *cobra.Command {
rootCmd := &cobra.Command{
Use: "shiori",
Short: "Simple command-line bookmark manager built with Go",
}
2019-08-09 03:19:43 +00:00
rootCmd.PersistentPreRun = preRunRootHandler
rootCmd.PersistentFlags().Bool("portable", false, "run shiori in portable mode")
2019-05-21 03:31:40 +00:00
rootCmd.AddCommand(
addCmd(),
printCmd(),
updateCmd(),
deleteCmd(),
openCmd(),
importCmd(),
exportCmd(),
pocketCmd(),
serveCmd(),
2019-09-21 09:30:39 +00:00
checkCmd(),
2019-05-21 03:31:40 +00:00
)
return rootCmd
}
2019-08-09 03:19:43 +00:00
func preRunRootHandler(cmd *cobra.Command, args []string) {
// Read flag
var err error
portableMode, _ := cmd.Flags().GetBool("portable")
// Get and create data dir
dataDir, err = getDataDir(portableMode)
if err != nil {
cError.Printf("Failed to get data dir: %v\n", err)
os.Exit(1)
}
err = os.MkdirAll(dataDir, os.ModePerm)
if err != nil {
cError.Printf("Failed to create data dir: %v\n", err)
os.Exit(1)
}
// Open database
2019-08-10 01:13:13 +00:00
db, err = openDatabase()
2019-08-09 03:19:43 +00:00
if err != nil {
cError.Printf("Failed to open database: %v\n", err)
os.Exit(1)
}
}
func getDataDir(portableMode bool) (string, error) {
// If in portable mode, uses directory of executable
if portableMode {
exePath, err := os.Executable()
if err != nil {
return "", err
}
exeDir := fp.Dir(exePath)
return fp.Join(exeDir, "shiori-data"), nil
}
if developmentMode {
return "dev-data", nil
}
// Try to look at environment variables
dataDir, found := os.LookupEnv("SHIORI_DIR")
if found {
return dataDir, nil
}
// Try to use platform specific app path
2022-01-23 10:46:14 +00:00
userScope := apppaths.NewScope(apppaths.User, "shiori")
dataDir, err := userScope.DataPath("shiori")
2019-08-09 03:19:43 +00:00
if err == nil {
return dataDir, nil
}
2022-01-23 10:46:14 +00:00
// TODO: Log warn
2019-08-09 03:19:43 +00:00
// When all fail, use current working directory
return ".", nil
}
2019-08-10 01:13:13 +00:00
func openDatabase() (database.DB, error) {
2019-09-25 23:24:49 +00:00
switch dbms, _ := os.LookupEnv("SHIORI_DBMS"); dbms {
case "mysql":
return openMySQLDatabase()
case "postgresql":
return openPostgreSQLDatabase()
default:
return openSQLiteDatabase()
2019-08-10 01:13:13 +00:00
}
2019-09-25 23:24:49 +00:00
}
func openSQLiteDatabase() (database.DB, error) {
2019-08-10 01:13:13 +00:00
dbPath := fp.Join(dataDir, "shiori.db")
return database.OpenSQLiteDatabase(dbPath)
}
2019-09-25 23:24:49 +00:00
func openMySQLDatabase() (database.DB, error) {
user, _ := os.LookupEnv("SHIORI_MYSQL_USER")
password, _ := os.LookupEnv("SHIORI_MYSQL_PASS")
dbName, _ := os.LookupEnv("SHIORI_MYSQL_NAME")
dbAddress, _ := os.LookupEnv("SHIORI_MYSQL_ADDRESS")
2019-12-13 07:52:26 +00:00
connString := fmt.Sprintf("%s:%s@%s/%s?charset=utf8mb4", user, password, dbAddress, dbName)
2019-09-25 23:24:49 +00:00
return database.OpenMySQLDatabase(connString)
}
func openPostgreSQLDatabase() (database.DB, error) {
host, _ := os.LookupEnv("SHIORI_PG_HOST")
port, _ := os.LookupEnv("SHIORI_PG_PORT")
user, _ := os.LookupEnv("SHIORI_PG_USER")
password, _ := os.LookupEnv("SHIORI_PG_PASS")
dbName, _ := os.LookupEnv("SHIORI_PG_NAME")
connString := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
host, port, user, password, dbName)
return database.OpenPGDatabase(connString)
}