247 lines
6.4 KiB
Go
247 lines
6.4 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"html/template"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
func readHtml(res http.ResponseWriter, req *http.Request) {
|
|
g := template.CSS("./html/public/mod.css")
|
|
f, err := template.ParseFiles("./html/wsb.html")
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
err = f.Execute(res, g)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
}
|
|
|
|
func simpRequestResp(res http.ResponseWriter, req *http.Request) {
|
|
fmt.Fprint(res, "Hello, M'Lord", 153*4, " I'm here to serveè")
|
|
}
|
|
func getMsgFromDB(sqldb *sql.DB, id string, lang string) string {
|
|
var lngs []string
|
|
lngs = append(lngs, lang)
|
|
query := generateSQL("msgs", lngs, [2]string{"content", id})
|
|
res := sqldb.QueryRow(query)
|
|
lng := ""
|
|
dt := res.Scan(&lng)
|
|
if dt != nil {
|
|
return ""
|
|
}
|
|
return lng
|
|
}
|
|
func queryPacks(sqldb *sql.DB, element *elements) []packages {
|
|
pkg_list := getPkgIdFromDB(sqldb)
|
|
pkgs := make([]packages, 0)
|
|
for _, p := range pkg_list {
|
|
query := generateSQL("packs_all", []string{"*"}, [2]string{"id", p})
|
|
res, err := sqldb.Query(query)
|
|
defer res.Close()
|
|
err = res.Err()
|
|
if err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
for res.Next() {
|
|
npkg := packages{}
|
|
err := res.Scan(&npkg.Id, &npkg.Name, &npkg.Version, &npkg.ExtraCommand, &npkg.Tag, &npkg.Warning)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
npkg.Element = element
|
|
pkgs = append(pkgs, npkg)
|
|
}
|
|
}
|
|
return pkgs
|
|
}
|
|
func queryDatabase(sqldb *sql.DB, queryRow string) []string {
|
|
|
|
res := sqldb.QueryRow(queryRow)
|
|
var values []string
|
|
err := res.Scan(&values)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
return values
|
|
}
|
|
func generateSQL(table string, columns []string, arg ...[2]string) string {
|
|
cols := strings.Join(columns, ",")
|
|
table = "SELECT " + cols + " FROM " + table
|
|
if len(arg) > 0 {
|
|
table += " WHERE "
|
|
for i, a := range arg {
|
|
table += a[0] + " like '" + a[1] + "'"
|
|
if i+1 < len(arg) {
|
|
table += " and "
|
|
}
|
|
}
|
|
}
|
|
return table
|
|
}
|
|
func searchDownloads(sqldb *sql.DB, table string, columns ...string) []DownloadElements {
|
|
query := generateSQL(table, columns)
|
|
runquery, err := sqldb.Query(query)
|
|
defer runquery.Close()
|
|
err = runquery.Err()
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
var elems []DownloadElements
|
|
var e DownloadElements
|
|
for runquery.Next() {
|
|
if len(columns) > 2 {
|
|
err = runquery.Scan(&e.ID, &e.Version, &e.Counter)
|
|
} else {
|
|
err = runquery.Scan(&e.ID, &e.Counter)
|
|
}
|
|
elems = append(elems, e)
|
|
}
|
|
return elems
|
|
}
|
|
func stats(sqldb *sql.DB, lang string) http.Handler {
|
|
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
|
|
Counter := struct{
|
|
ElementsData elements
|
|
VersionStats []DownloadElements
|
|
TotalStats []DownloadElements
|
|
BodyClass string
|
|
Lang string
|
|
}{
|
|
ElementsData: elements{
|
|
Title: getMsgFromDB(sqldb, "title", lang),
|
|
Header: getMsgFromDB(sqldb, "header", lang),
|
|
Help: getMsgFromDB(sqldb, "help", lang),
|
|
Packagename: getMsgFromDB(sqldb, "packagename", lang),
|
|
Packageversion: getMsgFromDB(sqldb, "packageversion", lang),
|
|
Allow: getMsgFromDB(sqldb, "allow", lang),
|
|
Warning: getMsgFromDB(sqldb, "warning", lang),
|
|
Explain: getMsgFromDB(sqldb, "explain", lang),
|
|
},
|
|
BodyClass: "m",
|
|
VersionStats: searchDownloads(sqldb, "counterd", "program", "version","download_count"),
|
|
TotalStats: searchDownloads(sqldb, "count_all", "program","download_count"),
|
|
Lang: lang,
|
|
}
|
|
templates, err := template.ParseFiles("html/master.html", "html/statsitics.html")
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
err = templates.ExecuteTemplate(res, "master", Counter)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
res.WriteHeader(http.StatusOK)
|
|
})
|
|
}
|
|
func getPkgIdFromDB(sqldb *sql.DB) []string {
|
|
query, err := sqldb.Query("SELECT id FROM packs_all")
|
|
defer query.Close()
|
|
err = query.Err()
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
var pkgs []string
|
|
var tmpstr string
|
|
for query.Next() {
|
|
err = query.Scan(&tmpstr)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
pkgs = append(pkgs, tmpstr)
|
|
}
|
|
// query.Scan(&pkgs)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
return pkgs
|
|
}
|
|
func fullSearchPackagesDB(sqldb *sql.DB) []packages {
|
|
pkg_list := getPkgIdFromDB(sqldb)
|
|
var pkgs []packages
|
|
for _, p := range pkg_list {
|
|
query := generateSQL("packs_all", []string{"*"}, [2]string{"id", p})
|
|
res := queryDatabase(sqldb, query)
|
|
var pkg packages
|
|
pkg, _ = ConvertStringsToPackage(res)
|
|
pkgs = append(pkgs, pkg)
|
|
}
|
|
return pkgs
|
|
}
|
|
func index(sqldb *sql.DB, lang string) http.Handler {
|
|
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
|
|
pageDataFromDatabase := elements{
|
|
Title: getMsgFromDB(sqldb, "title", lang),
|
|
Header: getMsgFromDB(sqldb, "header", lang),
|
|
Help: getMsgFromDB(sqldb, "help", lang),
|
|
Packagename: getMsgFromDB(sqldb, "packagename", lang),
|
|
Packageversion: getMsgFromDB(sqldb, "packageversion", lang),
|
|
Allow: getMsgFromDB(sqldb, "allow", lang),
|
|
Warning: getMsgFromDB(sqldb, "warning", lang),
|
|
Explain: getMsgFromDB(sqldb, "explain", lang),
|
|
}
|
|
data := struct {
|
|
ElementsData elements
|
|
PackagesData []packages
|
|
Lang string
|
|
}{
|
|
ElementsData: pageDataFromDatabase,
|
|
PackagesData: queryPacks(sqldb, &pageDataFromDatabase),
|
|
Lang: lang,
|
|
}
|
|
templates, err := template.ParseFiles("html/master.html", "html/main.html")
|
|
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
err = templates.ExecuteTemplate(res, "master", data)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
res.WriteHeader(http.StatusOK)
|
|
})
|
|
|
|
}
|
|
func public() http.Handler {
|
|
return http.StripPrefix("/public/", http.FileServer(http.Dir("./public")))
|
|
}
|
|
func main() {
|
|
logfilename := "Logs/" + time.Now().Format("2006-01-02--15-04-05") + ".log"
|
|
file, err := os.OpenFile(logfilename, os.O_APPEND|os.O_CREATE, 0777)
|
|
if err != nil {
|
|
os.Exit(12)
|
|
}
|
|
|
|
log.SetOutput(file)
|
|
db, err := sql.Open("sqlite", "file:progs.db")
|
|
mux := http.NewServeMux()
|
|
mux.Handle("/public/", public())
|
|
mux.Handle("/", index(db, "heb"))
|
|
mux.Handle("/en", index(db, "eng"))
|
|
mux.Handle("/stats", stats(db,"eng"))
|
|
addr := fmt.Sprintf(":%s", "12312")
|
|
server := http.Server{
|
|
Addr: addr,
|
|
Handler: mux,
|
|
ReadTimeout: 15 * time.Second,
|
|
WriteTimeout: 15 * time.Second,
|
|
IdleTimeout: 15 * time.Second,
|
|
}
|
|
|
|
if err := server.ListenAndServe(); err != nil {
|
|
log.Fatalf("main: couldn't start simple server: %v\n", err)
|
|
}
|
|
lang := "heb"
|
|
|
|
log.Println(getMsgFromDB(db, "title", lang))
|
|
}
|