summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/helsinki.at/rhimport/conf.go108
-rw-r--r--src/helsinki.at/rhimport/fetcher.go4
-rw-r--r--src/helsinki.at/rhimport/importer.go10
-rw-r--r--src/helsinki.at/rhimport/rddb.go131
-rw-r--r--src/helsinki.at/rhimportd/ctrlWeb.go11
-rw-r--r--src/helsinki.at/rhimportd/ctrlWebSimple.go8
-rw-r--r--src/helsinki.at/rhimportd/rhimportd.go10
7 files changed, 164 insertions, 118 deletions
diff --git a/src/helsinki.at/rhimport/conf.go b/src/helsinki.at/rhimport/conf.go
index 8e373c0..7288a89 100644
--- a/src/helsinki.at/rhimport/conf.go
+++ b/src/helsinki.at/rhimport/conf.go
@@ -25,37 +25,17 @@
package rhimport
import (
- "database/sql"
- "fmt"
- _ "github.com/go-sql-driver/mysql"
"github.com/vaughan0/go-ini"
)
-type getPasswordResult struct {
- password string
- err error
-}
-
-type getPasswordRequest struct {
- username string
- cached bool
- response chan getPasswordResult
-}
-
type Config struct {
- configfile string
- RDXportEndpoint string
- TempDir string
- db_host string
- db_user string
- db_passwd string
- db_db string
- dbh *sql.DB
- password_cache map[string]string
- getPasswordChan chan getPasswordRequest
- dbGetPasswordStmt *sql.Stmt
- quit chan bool
- done chan bool
+ configfile string
+ RDXportEndpoint string
+ TempDir string
+ db_host string
+ db_user string
+ db_passwd string
+ db_db string
}
func get_ini_value(file ini.File, section string, key string, dflt string) string {
@@ -79,87 +59,13 @@ func (self *Config) read_config_file() error {
return nil
}
-func (self *Config) init_database() (err error) {
- dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", self.db_user, self.db_passwd, self.db_host, self.db_db)
- if self.dbh, err = sql.Open("mysql", dsn); err != nil {
- return
- }
- if self.dbGetPasswordStmt, err = self.dbh.Prepare("select PASSWORD from USERS where LOGIN_NAME = ?"); err != nil {
- return
- }
-
- return
-}
-
-func (self *Config) getPassword(username string, cached bool) (pwd string, err error) {
-
- if cached {
- pwd = self.password_cache[username]
- }
-
- if pwd == "" {
- err = self.dbGetPasswordStmt.QueryRow(username).Scan(&pwd)
- if err != nil {
- if err == sql.ErrNoRows {
- err = fmt.Errorf("user '%s' not known by rivendell", username)
- }
- return
- }
- self.password_cache[username] = pwd
- }
-
- return
-}
-
-func (self *Config) dispatchRequests() {
- defer func() { self.done <- true }()
- for {
- select {
- case <-self.quit:
- return
- case req := <-self.getPasswordChan:
- if req.cached {
- rhdl.Println("Config: got getPassword request for", req.username, "(cached)")
- } else {
- rhdl.Println("Config: got getPassword request for", req.username, "(not cached)")
- }
- pwd, err := self.getPassword(req.username, req.cached)
- req.response <- getPasswordResult{pwd, err}
- }
- }
-}
-
-func (self *Config) Cleanup() {
- self.quit <- true
- <-self.done
- close(self.quit)
- close(self.done)
- close(self.getPasswordChan)
- if self.dbh != nil {
- self.dbh.Close()
- }
- if self.dbGetPasswordStmt != nil {
- self.dbGetPasswordStmt.Close()
- }
-}
-
func NewConfig(configfile, rdxport_endpoint, temp_dir *string) (conf *Config, err error) {
conf = new(Config)
conf.configfile = *configfile
if err = conf.read_config_file(); err != nil {
return
}
- conf.quit = make(chan bool)
- conf.done = make(chan bool)
conf.RDXportEndpoint = *rdxport_endpoint
conf.TempDir = *temp_dir
- conf.password_cache = make(map[string]string)
- conf.getPasswordChan = make(chan getPasswordRequest)
-
- if err = conf.init_database(); err != nil {
- return
- }
-
- go conf.dispatchRequests()
return
}
diff --git a/src/helsinki.at/rhimport/fetcher.go b/src/helsinki.at/rhimport/fetcher.go
index ead9f5f..1a5801b 100644
--- a/src/helsinki.at/rhimport/fetcher.go
+++ b/src/helsinki.at/rhimport/fetcher.go
@@ -26,9 +26,9 @@ package rhimport
func FetchFile(ctx *ImportContext) (err error) {
- // TODO: fetch file from ctx.SourceUri and put it into ctx.Conf.TempDir
+ // TODO: fetch file from ctx.SourceUri and put it into ctx.Config.TempDir
- ctx.SourceFile = ctx.Conf.TempDir + "/source-file.ogg"
+ ctx.SourceFile = ctx.Config.TempDir + "/source-file.ogg"
ctx.DeleteSourceFile = true
return
}
diff --git a/src/helsinki.at/rhimport/importer.go b/src/helsinki.at/rhimport/importer.go
index 95e3e73..5eea054 100644
--- a/src/helsinki.at/rhimport/importer.go
+++ b/src/helsinki.at/rhimport/importer.go
@@ -34,7 +34,8 @@ import (
)
type ImportContext struct {
- Conf *Config
+ *Config
+ *RDDB
UserName string
Password string
Trusted bool
@@ -50,9 +51,10 @@ type ImportContext struct {
DeleteSourceFile bool
}
-func NewImportContext(conf *Config, user string, group string) *ImportContext {
+func NewImportContext(conf *Config, rddb *RDDB, user string, group string) *ImportContext {
ctx := new(ImportContext)
- ctx.Conf = conf
+ ctx.Config = conf
+ ctx.RDDB = rddb
ctx.UserName = user
ctx.Password = ""
ctx.Trusted = false
@@ -74,7 +76,7 @@ func (ctx *ImportContext) getPassword(cached bool) (err error) {
req.username = ctx.UserName
req.cached = cached
req.response = make(chan getPasswordResult)
- ctx.Conf.getPasswordChan <- req
+ ctx.RDDB.getPasswordChan <- req
res := <-req.response
if res.err != nil {
diff --git a/src/helsinki.at/rhimport/rddb.go b/src/helsinki.at/rhimport/rddb.go
new file mode 100644
index 0000000..2a87388
--- /dev/null
+++ b/src/helsinki.at/rhimport/rddb.go
@@ -0,0 +1,131 @@
+//
+// rhimportd
+//
+// The Radio Helsinki Rivendell Import Daemon
+//
+//
+// Copyright (C) 2015 Christian Pointner <equinox@helsinki.at>
+//
+// This file is part of rhimportd.
+//
+// rhimportd is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// any later version.
+//
+// rhimportd is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with rhimportd. If not, see <http://www.gnu.org/licenses/>.
+//
+
+package rhimport
+
+import (
+ "database/sql"
+ "fmt"
+ _ "github.com/go-sql-driver/mysql"
+)
+
+type getPasswordResult struct {
+ password string
+ err error
+}
+
+type getPasswordRequest struct {
+ username string
+ cached bool
+ response chan getPasswordResult
+}
+
+type RDDB struct {
+ dbh *sql.DB
+ password_cache map[string]string
+ getPasswordChan chan getPasswordRequest
+ dbGetPasswordStmt *sql.Stmt
+ quit chan bool
+ done chan bool
+}
+
+func (self *RDDB) init(conf *Config) (err error) {
+ dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", conf.db_user, conf.db_passwd, conf.db_host, conf.db_db)
+ if self.dbh, err = sql.Open("mysql", dsn); err != nil {
+ return
+ }
+ if self.dbGetPasswordStmt, err = self.dbh.Prepare("select PASSWORD from USERS where LOGIN_NAME = ?"); err != nil {
+ return
+ }
+
+ return
+}
+
+func (self *RDDB) getPassword(username string, cached bool) (pwd string, err error) {
+
+ if cached {
+ pwd = self.password_cache[username]
+ }
+
+ if pwd == "" {
+ err = self.dbGetPasswordStmt.QueryRow(username).Scan(&pwd)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ err = fmt.Errorf("user '%s' not known by rivendell", username)
+ }
+ return
+ }
+ self.password_cache[username] = pwd
+ }
+
+ return
+}
+
+func (self *RDDB) dispatchRequests() {
+ defer func() { self.done <- true }()
+ for {
+ select {
+ case <-self.quit:
+ return
+ case req := <-self.getPasswordChan:
+ if req.cached {
+ rhdl.Println("RDDB: got getPassword request for", req.username, "(cached)")
+ } else {
+ rhdl.Println("RDDB: got getPassword request for", req.username, "(not cached)")
+ }
+ pwd, err := self.getPassword(req.username, req.cached)
+ req.response <- getPasswordResult{pwd, err}
+ }
+ }
+}
+
+func (self *RDDB) Cleanup() {
+ self.quit <- true
+ <-self.done
+ close(self.quit)
+ close(self.done)
+ close(self.getPasswordChan)
+ if self.dbh != nil {
+ self.dbh.Close()
+ }
+ if self.dbGetPasswordStmt != nil {
+ self.dbGetPasswordStmt.Close()
+ }
+}
+
+func NewRDDB(conf *Config) (db *RDDB, err error) {
+ db = new(RDDB)
+
+ db.quit = make(chan bool)
+ db.done = make(chan bool)
+ db.password_cache = make(map[string]string)
+ db.getPasswordChan = make(chan getPasswordRequest)
+
+ if err = db.init(conf); err != nil {
+ return
+ }
+
+ go db.dispatchRequests()
+ return
+}
diff --git a/src/helsinki.at/rhimportd/ctrlWeb.go b/src/helsinki.at/rhimportd/ctrlWeb.go
index 5a76f15..e5f74b7 100644
--- a/src/helsinki.at/rhimportd/ctrlWeb.go
+++ b/src/helsinki.at/rhimportd/ctrlWeb.go
@@ -32,17 +32,18 @@ import (
type webHandler struct {
*rhimport.Config
+ *rhimport.RDDB
trusted bool
- H func(*rhimport.Config, bool, http.ResponseWriter, *http.Request)
+ H func(*rhimport.Config, *rhimport.RDDB, bool, http.ResponseWriter, *http.Request)
}
func (self webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- self.H(self.Config, self.trusted, w, r)
+ self.H(self.Config, self.RDDB, self.trusted, w, r)
}
-func StartControlWeb(addr_s string, conf *rhimport.Config) {
- http.Handle("/public/simple", webHandler{conf, false, webSimpleHandler})
- http.Handle("/trusted/simple", webHandler{conf, true, webSimpleHandler})
+func StartControlWeb(addr_s string, conf *rhimport.Config, rddb *rhimport.RDDB) {
+ http.Handle("/public/simple", webHandler{conf, rddb, false, webSimpleHandler})
+ http.Handle("/trusted/simple", webHandler{conf, rddb, true, webSimpleHandler})
rhl.Println("listening on", addr_s)
http.ListenAndServe(addr_s, nil)
diff --git a/src/helsinki.at/rhimportd/ctrlWebSimple.go b/src/helsinki.at/rhimportd/ctrlWebSimple.go
index 8080514..f4c64ee 100644
--- a/src/helsinki.at/rhimportd/ctrlWebSimple.go
+++ b/src/helsinki.at/rhimportd/ctrlWebSimple.go
@@ -67,7 +67,7 @@ func webSimpleResponse(w http.ResponseWriter) {
encoder.Encode(respdata)
}
-func webSimpleParseRequest(conf *rhimport.Config, trusted bool, r *http.Request) (ctx *rhimport.ImportContext, err error) {
+func webSimpleParseRequest(conf *rhimport.Config, rddb *rhimport.RDDB, trusted bool, r *http.Request) (ctx *rhimport.ImportContext, err error) {
decoder := json.NewDecoder(r.Body)
var reqdata webSimpleRequestData
@@ -80,7 +80,7 @@ func webSimpleParseRequest(conf *rhimport.Config, trusted bool, r *http.Request)
if trusted {
username = r.Header.Get("X-Forwarded-User")
}
- ctx = rhimport.NewImportContext(conf, username, reqdata.GroupName)
+ ctx = rhimport.NewImportContext(conf, rddb, username, reqdata.GroupName)
ctx.Password = reqdata.Password
ctx.Trusted = trusted
ctx.Cart = reqdata.Cart
@@ -93,12 +93,12 @@ func webSimpleParseRequest(conf *rhimport.Config, trusted bool, r *http.Request)
return
}
-func webSimpleHandler(conf *rhimport.Config, trusted bool, w http.ResponseWriter, r *http.Request) {
+func webSimpleHandler(conf *rhimport.Config, rddb *rhimport.RDDB, trusted bool, w http.ResponseWriter, r *http.Request) {
rhdl.Printf("SimpleHandler: request for '%s'", html.EscapeString(r.URL.Path))
var ctx *rhimport.ImportContext
var err error
- if ctx, err = webSimpleParseRequest(conf, trusted, r); err != nil {
+ if ctx, err = webSimpleParseRequest(conf, rddb, trusted, r); err != nil {
webSimpleErrorResponse(w, http.StatusInternalServerError, err.Error())
return
}
diff --git a/src/helsinki.at/rhimportd/rhimportd.go b/src/helsinki.at/rhimportd/rhimportd.go
index 03d0340..7cdc67b 100644
--- a/src/helsinki.at/rhimportd/rhimportd.go
+++ b/src/helsinki.at/rhimportd/rhimportd.go
@@ -50,7 +50,13 @@ func main() {
rhl.Println("Error reading configuration:", err)
return
}
- defer conf.Cleanup()
+
+ rddb, err := rhimport.NewRDDB(conf)
+ if err != nil {
+ rhl.Println("Error initializing Rivdenll DB:", err)
+ return
+ }
+ defer rddb.Cleanup()
var wg sync.WaitGroup
@@ -58,7 +64,7 @@ func main() {
go func() {
defer wg.Done()
rhl.Println("start web-ctrl")
- StartControlWeb(*web_addr_s, conf)
+ StartControlWeb(*web_addr_s, conf, rddb)
rhl.Println("web-ctrl finished")
}()