2022-11-30 12:07:36 +07:00
//go:generate bash -c "mkdir -p codegen/user_service && go run github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.12.2 -generate types,server,spec -package codegen api/user-service/openapi.yaml > codegen/user_service/user_service_api.go"
2022-11-30 11:16:11 +07:00
//go:generate bash -c "mkdir -p codegen/message_bus && go run github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.12.2 -package message_bus https://raw.githubusercontent.com/IceWhaleTech/CasaOS-MessageBus/main/api/message_bus/openapi.yaml > codegen/message_bus/api.go"
2022-08-05 06:14:53 +07:00
package main
import (
2022-11-30 11:16:11 +07:00
_ "embed"
2022-08-05 06:14:53 +07:00
"flag"
"fmt"
"net"
"net/http"
2022-08-07 09:52:14 +07:00
"os"
2022-09-29 04:30:34 +07:00
"time"
2022-08-05 06:14:53 +07:00
2022-10-29 04:28:04 +07:00
"github.com/IceWhaleTech/CasaOS-Common/model"
2022-11-30 11:16:11 +07:00
util_http "github.com/IceWhaleTech/CasaOS-Common/utils/http"
2022-08-05 06:14:53 +07:00
"github.com/IceWhaleTech/CasaOS-Common/utils/logger"
2022-09-29 04:38:35 +07:00
"github.com/IceWhaleTech/CasaOS-UserService/common"
2022-08-05 06:14:53 +07:00
"github.com/IceWhaleTech/CasaOS-UserService/pkg/config"
"github.com/IceWhaleTech/CasaOS-UserService/pkg/sqlite"
"github.com/IceWhaleTech/CasaOS-UserService/pkg/utils/encryption"
"github.com/IceWhaleTech/CasaOS-UserService/pkg/utils/random"
"github.com/IceWhaleTech/CasaOS-UserService/route"
"github.com/IceWhaleTech/CasaOS-UserService/service"
2022-09-07 06:13:00 +07:00
"github.com/coreos/go-systemd/daemon"
2022-08-26 04:36:24 +07:00
"go.uber.org/zap"
2022-08-05 06:14:53 +07:00
)
2022-09-02 06:09:54 +07:00
const localhost = "127.0.0.1"
2022-08-05 06:14:53 +07:00
2022-11-30 11:16:11 +07:00
var (
//go:embed api/index.html
_docHTML string
//go:embed api/user-service/openapi.yaml
_docYAML string
)
2022-08-05 06:14:53 +07:00
func init ( ) {
2022-08-07 09:52:14 +07:00
configFlag := flag . String ( "c" , "" , "config address" )
dbFlag := flag . String ( "db" , "" , "db path" )
resetUserFlag := flag . Bool ( "ru" , false , "reset user" )
userFlag := flag . String ( "user" , "" , "user name" )
versionFlag := flag . Bool ( "v" , false , "version" )
2022-08-05 06:14:53 +07:00
flag . Parse ( )
2022-08-07 09:52:14 +07:00
if * versionFlag {
2022-08-31 11:29:50 +07:00
fmt . Printf ( "v%s\n" , common . Version )
2022-08-07 09:52:14 +07:00
os . Exit ( 0 )
}
2022-08-05 06:14:53 +07:00
config . InitSetup ( * configFlag )
logger . LogInit ( config . AppInfo . LogPath , config . AppInfo . LogSaveName , config . AppInfo . LogFileExt )
if len ( * dbFlag ) == 0 {
2022-08-29 07:40:51 +07:00
* dbFlag = config . AppInfo . DBPath
2022-08-05 06:14:53 +07:00
}
2022-08-07 09:52:14 +07:00
sqliteDB := sqlite . GetDb ( * dbFlag )
2022-08-05 06:14:53 +07:00
service . MyService = service . NewService ( sqliteDB , config . CommonInfo . RuntimePath )
2022-08-07 09:52:14 +07:00
if * resetUserFlag {
if userFlag == nil || len ( * userFlag ) == 0 {
2022-08-05 06:14:53 +07:00
fmt . Println ( "user is empty" )
return
}
2022-08-07 09:52:14 +07:00
userData := service . MyService . User ( ) . GetUserAllInfoByName ( * userFlag )
2022-08-05 06:14:53 +07:00
if userData . Id == 0 {
fmt . Println ( "user not exist" )
return
}
2022-08-07 09:52:14 +07:00
2022-08-05 06:14:53 +07:00
password := random . RandomString ( 6 , false )
userData . Password = encryption . GetMD5ByStr ( password )
service . MyService . User ( ) . UpdateUserPassword ( userData )
fmt . Println ( "User reset successful" )
fmt . Println ( "UserName:" + userData . Username )
fmt . Println ( "Password:" + password )
}
2022-08-07 09:52:14 +07:00
}
func main ( ) {
2022-11-30 11:16:11 +07:00
go route . EventListen ( )
v1Router := route . InitRouter ( )
v2Router := route . InitV2Router ( )
v2DocRouter := route . InitV2DocRouter ( _docHTML , _docYAML )
mux := & util_http . HandlerMultiplexer {
HandlerMap : map [ string ] http . Handler {
"v1" : v1Router ,
"v2" : v2Router ,
"doc" : v2DocRouter ,
} ,
}
2022-08-05 06:14:53 +07:00
listener , err := net . Listen ( "tcp" , net . JoinHostPort ( localhost , "0" ) )
if err != nil {
panic ( err )
}
2022-11-30 11:16:11 +07:00
apiPaths := [ ] string {
"/v1/users" ,
route . V2APIPath ,
route . V2DocPath ,
}
for _ , v := range apiPaths {
err = service . MyService . Gateway ( ) . CreateRoute ( & model . Route {
Path : v ,
Target : "http://" + listener . Addr ( ) . String ( ) ,
} )
if err != nil {
panic ( err )
}
2022-08-05 06:14:53 +07:00
}
2022-09-07 06:13:00 +07:00
if supported , err := daemon . SdNotify ( false , daemon . SdNotifyReady ) ; err != nil {
logger . Error ( "Failed to notify systemd that user service is ready" , zap . Any ( "error" , err ) )
} else if supported {
logger . Info ( "Notified systemd that user service is ready" )
} else {
logger . Info ( "This process is not running as a systemd service." )
}
2022-08-26 04:36:24 +07:00
logger . Info ( "User service is listening..." , zap . Any ( "address" , listener . Addr ( ) . String ( ) ) )
2022-09-29 04:30:34 +07:00
s := & http . Server {
2022-11-30 11:16:11 +07:00
Handler : mux ,
2022-09-29 04:30:34 +07:00
ReadHeaderTimeout : 5 * time . Second , // fix G112: Potential slowloris attack (see https://github.com/securego/gosec)
}
err = s . Serve ( listener ) // not using http.serve() to fix G114: Use of net/http serve function that has no support for setting timeouts (see https://github.com/securego/gosec)
2022-08-05 06:14:53 +07:00
if err != nil {
panic ( err )
}
}