func main() {
	defaultRootPassword := defs.RootUserName

	secureKeyFileNamePath := flag.String("secure-key", "./secureKey", "secure key file path")
	loginFilePath := flag.String("storage-file", "./data.txt", "First storage file that includes the root user")
	rootPassword := flag.String("password", defaultRootPassword, "Root password")
	str := fmt.Sprintf("Generate RSA private/public files ('%s', '%s')", rsaPrivateKeyFileName, rsaPublicKeyFileName)
	generateRSA := flag.Bool("generate-rsa", false, str)
	flag.Parse()
	if flag.NArg() > 0 {
		usage()
	}

	if *rootPassword == defaultRootPassword {
		fmt.Printf("Error: The root password must be set (and not to '%v')\n", defaultRootPassword)
		usage()
	}
	err := password.CheckPasswordStrength(*rootPassword)
	if err != nil {
		log.Fatalf("Error: The root password must be more complex: %v", err)
	}

	key := ss.GetSecureKey(*secureKeyFileNamePath)
	createBasicFile(*loginFilePath, defs.RootUserName, *rootPassword, key)
	fmt.Println("The generated file name is:", *loginFilePath)
	if *generateRSA {
		generateRSAKeys(rsaPrivateKeyFileName, rsaPublicKeyFileName)
	}
}
func init() {
	logger.Init(ioutil.Discard, ioutil.Discard, ioutil.Discard, ioutil.Discard)
	privateKeyFilePath := flag.String("rsa-private", "./dist/key.private", "RSA private key file path")
	secureKeyFilePath := flag.String("secure-key", "./dist/secureKey", "password to encrypt the secure storage")
	usersDataPath := flag.String("data-file", "./dist/data.txt", "Login information file")
	flag.Parse()

	servicePath = cr.ServicePathPrefix + cr.Version + amPrefix
	resourcePath = listener + servicePath + usersPath

	usersList := en.New()
	signKey, verifyKey := app.SetupAToken(*privateKeyFilePath)
	loginKey := ss.GetSecureKey(*secureKeyFilePath)
	en.LoadInfo(*usersDataPath, loginKey, usersList)

	stRestful = libsecurityRestful.NewLibsecurityRestful()
	stRestful.SetData(usersList, loginKey, verifyKey, signKey, nil)

	rootCookieStr, _ := app.GenerateToken(defs.RootUserName, am.SuperUserPermission, false, clientIP, signKey)
	cr.TestSetCookie(rootCookieStr)

	for _, name := range usersName {
		stRestful.UsersList.AddUser(name)
	}

	go runServer()
	time.Sleep(100 * time.Millisecond)
}
func registerComponents(configFile string, secureKeyFilePath string, privateKeyFilePath string, usersDataPath string) {
	conf, err := readConfigFile(configFile)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Fatal error while reading configuration file '%v', error: %v\n", configFile, err)
		os.Exit(1)
	}
	wsContainer := restful.NewContainer()
	usersList := en.New()

	//	amUsers := am.NewAmUsersList()
	signKey, verifyKey = app.SetupAToken(privateKeyFilePath)
	loginKey = ss.GetSecureKey(secureKeyFilePath)

	st := libsecurityRestful.NewLibsecurityRestful()
	st.SetData(usersList, loginKey, verifyKey, signKey, nil)

	l := accountsRestful.NewAmRestful()
	l.SetData(st)
	if conf[amToken] == fullToken {
		l.RegisterFull(wsContainer)
	} else { // login is mandatory
		l.RegisterBasic(wsContainer)
	}

	um := enRestful.NewEnRestful()
	um.SetData(st)
	if conf[umToken] != noneToken {
		um.RegisterBasic(wsContainer)
	}

	a := aclRestful.NewAclRestful()
	a.SetData(st)
	if conf[aclToken] == basicToken || conf[appAclToken] == basicToken {
		a.RegisterBasic(wsContainer)
	}

	p := otpRestful.NewOtpRestful()
	p.SetData(st)
	if conf[otpToken] == basicToken {
		p.RegisterBasic(wsContainer)
	}

	o := ocraRestful.NewOcraRestful()
	o.SetData(st)
	if conf[ocraToken] == basicToken {
		o.RegisterBasic(wsContainer)
	}

	pwd := passwordRestful.NewPwdRestful()
	pwd.SetData(st)
	if conf[passwordToken] == basicToken {
		pwd.RegisterBasic(wsContainer)
	}

	ss := storageRestful.NewSsRestful()
	ss.SetData(st)
	if conf[secureStorageToken] == basicToken {
		ss.RegisterBasic(wsContainer)
	}

	st.RegisterBasic(wsContainer)

	err = en.LoadInfo(usersDataPath, loginKey, usersList)
	if err != nil {
		fmt.Println("Load info error:", err)
	}
	runRestAPI(wsContainer)
}