2014-02-12 23:54:09 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2014-03-08 02:22:15 +04:00
package base
2014-02-12 23:54:09 +04:00
import (
"fmt"
"os"
2014-02-19 13:50:53 +04:00
"os/exec"
"path"
"path/filepath"
2014-03-19 12:48:45 +04:00
"strings"
2014-02-12 23:54:09 +04:00
2014-03-11 07:03:17 +04:00
"github.com/Unknwon/com"
2014-02-12 23:54:09 +04:00
"github.com/Unknwon/goconfig"
2014-03-18 09:33:53 +04:00
"github.com/gogits/gogs/modules/log"
2014-02-12 23:54:09 +04:00
)
2014-03-18 09:33:53 +04:00
// Mailer represents a mail service.
type Mailer struct {
Name string
Host string
User , Passwd string
}
2014-03-15 15:01:50 +04:00
var (
2014-03-18 09:33:53 +04:00
AppVer string
AppName string
2014-03-19 15:21:23 +04:00
AppLogo string
AppUrl string
2014-03-18 09:33:53 +04:00
Domain string
2014-03-19 15:21:23 +04:00
SecretKey string
2014-03-18 09:33:53 +04:00
Cfg * goconfig . ConfigFile
MailService * Mailer
2014-03-15 15:01:50 +04:00
)
2014-02-12 23:54:09 +04:00
2014-03-19 15:21:23 +04:00
var Service struct {
2014-03-19 16:27:27 +04:00
RegisterEmailConfirm bool
2014-03-19 15:21:23 +04:00
ActiveCodeLives int
ResetPwdCodeLives int
}
2014-02-19 13:50:53 +04:00
func exeDir ( ) ( string , error ) {
file , err := exec . LookPath ( os . Args [ 0 ] )
if err != nil {
return "" , err
}
p , err := filepath . Abs ( file )
if err != nil {
return "" , err
}
return path . Dir ( p ) , nil
}
2014-03-19 12:08:25 +04:00
var logLevels = map [ string ] string {
"Trace" : "0" ,
"Debug" : "1" ,
"Info" : "2" ,
"Warn" : "3" ,
"Error" : "4" ,
"Critical" : "5" ,
}
2014-03-19 15:21:23 +04:00
func newService ( ) {
Service . ActiveCodeLives = Cfg . MustInt ( "service" , "ACTIVE_CODE_LIVE_MINUTES" , 180 )
Service . ResetPwdCodeLives = Cfg . MustInt ( "service" , "RESET_PASSWD_CODE_LIVE_MINUTES" , 180 )
}
2014-03-19 11:24:17 +04:00
func newLogService ( ) {
2014-03-19 12:08:25 +04:00
// Get and check log mode.
mode := Cfg . MustValue ( "log" , "MODE" , "console" )
modeSec := "log." + mode
if _ , err := Cfg . GetSection ( modeSec ) ; err != nil {
fmt . Printf ( "Unknown log mode: %s\n" , mode )
os . Exit ( 2 )
}
// Log level.
2014-03-19 12:48:45 +04:00
levelName := Cfg . MustValue ( "log." + mode , "LEVEL" , "Trace" )
level , ok := logLevels [ levelName ]
2014-03-19 12:08:25 +04:00
if ! ok {
2014-03-19 12:48:45 +04:00
fmt . Printf ( "Unknown log level: %s\n" , levelName )
2014-03-19 12:08:25 +04:00
os . Exit ( 2 )
}
// Generate log configuration.
var config string
switch mode {
case "console" :
config = fmt . Sprintf ( ` { "level":%s} ` , level )
case "file" :
2014-03-20 05:05:48 +04:00
logPath := Cfg . MustValue ( modeSec , "FILE_NAME" , "log/gogs.log" )
os . MkdirAll ( path . Dir ( logPath ) , os . ModePerm )
2014-03-19 12:08:25 +04:00
config = fmt . Sprintf (
` { "level":%s,"filename":%s,"rotate":%v,"maxlines":%d,"maxsize",%d,"daily":%v,"maxdays":%d} ` , level ,
2014-03-20 05:05:48 +04:00
logPath ,
2014-03-19 12:08:25 +04:00
Cfg . MustBool ( modeSec , "LOG_ROTATE" , true ) ,
Cfg . MustInt ( modeSec , "MAX_LINES" , 1000000 ) ,
1 << uint ( Cfg . MustInt ( modeSec , "MAX_SIZE_SHIFT" , 28 ) ) ,
Cfg . MustBool ( modeSec , "DAILY_ROTATE" , true ) ,
Cfg . MustInt ( modeSec , "MAX_DAYS" , 7 ) )
case "conn" :
config = fmt . Sprintf ( ` { "level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":%s,"addr":%s} ` , level ,
Cfg . MustBool ( modeSec , "RECONNECT_ON_MSG" , false ) ,
Cfg . MustBool ( modeSec , "RECONNECT" , false ) ,
Cfg . MustValue ( modeSec , "PROTOCOL" , "tcp" ) ,
Cfg . MustValue ( modeSec , "ADDR" , ":7020" ) )
case "smtp" :
config = fmt . Sprintf ( ` { "level":%s,"username":%s,"password":%s,"host":%s,"sendTos":%s,"subject":%s} ` , level ,
Cfg . MustValue ( modeSec , "USER" , "example@example.com" ) ,
Cfg . MustValue ( modeSec , "PASSWD" , "******" ) ,
Cfg . MustValue ( modeSec , "HOST" , "127.0.0.1:25" ) ,
Cfg . MustValue ( modeSec , "RECEIVERS" , "[]" ) ,
Cfg . MustValue ( modeSec , "SUBJECT" , "Diagnostic message from serve" ) )
}
log . NewLogger ( Cfg . MustInt64 ( "log" , "BUFFER_LEN" , 10000 ) , mode , config )
2014-03-19 12:48:45 +04:00
log . Info ( "Log Mode: %s(%s)" , strings . Title ( mode ) , levelName )
2014-03-19 11:24:17 +04:00
}
func newMailService ( ) {
// Check mailer setting.
if Cfg . MustBool ( "mailer" , "ENABLED" ) {
MailService = & Mailer {
Name : Cfg . MustValue ( "mailer" , "NAME" , AppName ) ,
Host : Cfg . MustValue ( "mailer" , "HOST" , "127.0.0.1:25" ) ,
User : Cfg . MustValue ( "mailer" , "USER" , "example@example.com" ) ,
Passwd : Cfg . MustValue ( "mailer" , "PASSWD" , "******" ) ,
}
log . Info ( "Mail Service Enabled" )
}
}
2014-03-19 20:50:44 +04:00
func newRegisterMailService ( ) {
2014-03-19 15:21:23 +04:00
if ! Cfg . MustBool ( "service" , "REGISTER_EMAIL_CONFIRM" ) {
return
} else if MailService == nil {
2014-03-19 20:50:44 +04:00
log . Warn ( "Register Mail Service: Mail Service is not enabled" )
2014-03-19 15:21:23 +04:00
return
}
2014-03-19 16:27:27 +04:00
Service . RegisterEmailConfirm = true
2014-03-19 20:50:44 +04:00
log . Info ( "Register Mail Service Enabled" )
2014-03-19 15:21:23 +04:00
}
2014-02-12 23:54:09 +04:00
func init ( ) {
var err error
2014-02-19 13:50:53 +04:00
workDir , err := exeDir ( )
if err != nil {
fmt . Printf ( "Fail to get work directory: %s\n" , err )
os . Exit ( 2 )
}
2014-03-13 05:40:18 +04:00
cfgPath := filepath . Join ( workDir , "conf/app.ini" )
2014-02-19 13:50:53 +04:00
Cfg , err = goconfig . LoadConfigFile ( cfgPath )
2014-02-12 23:54:09 +04:00
if err != nil {
2014-02-19 13:50:53 +04:00
fmt . Printf ( "Cannot load config file '%s'\n" , cfgPath )
2014-02-12 23:54:09 +04:00
os . Exit ( 2 )
}
2014-03-17 22:03:58 +04:00
Cfg . BlockMode = false
2014-03-11 07:03:17 +04:00
2014-03-13 05:40:18 +04:00
cfgPath = filepath . Join ( workDir , "custom/conf/app.ini" )
2014-03-11 07:03:17 +04:00
if com . IsFile ( cfgPath ) {
if err = Cfg . AppendFiles ( cfgPath ) ; err != nil {
fmt . Printf ( "Cannot load config file '%s'\n" , cfgPath )
os . Exit ( 2 )
}
}
2014-03-15 15:01:50 +04:00
2014-03-18 09:33:53 +04:00
AppName = Cfg . MustValue ( "" , "APP_NAME" , "Gogs: Go Git Service" )
2014-03-19 15:21:23 +04:00
AppLogo = Cfg . MustValue ( "" , "APP_LOGO" , "img/favicon.png" )
AppUrl = Cfg . MustValue ( "server" , "ROOT_URL" )
2014-03-17 14:13:07 +04:00
Domain = Cfg . MustValue ( "server" , "DOMAIN" )
2014-03-19 15:21:23 +04:00
SecretKey = Cfg . MustValue ( "security" , "SECRET_KEY" )
2014-03-19 21:24:46 +04:00
}
2014-03-18 09:33:53 +04:00
2014-03-19 21:24:46 +04:00
func NewServices ( ) {
2014-03-19 18:46:48 +04:00
newService ( )
2014-03-19 11:24:17 +04:00
newLogService ( )
newMailService ( )
2014-03-19 20:50:44 +04:00
newRegisterMailService ( )
2014-02-12 23:54:09 +04:00
}