forked from ProjectSegfault/publapi
don't depend on wc for online user count; wip meta info in json
This commit is contained in:
parent
4321c7230b
commit
d1c36f7af4
1
go.mod
1
go.mod
@ -19,4 +19,5 @@ require (
|
|||||||
go.uber.org/atomic v1.10.0 // indirect
|
go.uber.org/atomic v1.10.0 // indirect
|
||||||
go.uber.org/multierr v1.9.0 // indirect
|
go.uber.org/multierr v1.9.0 // indirect
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
2
go.sum
2
go.sum
@ -245,4 +245,6 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
116
main.go
116
main.go
@ -1,19 +1,90 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"fmt"
|
||||||
"os/exec"
|
|
||||||
|
|
||||||
"github.com/ProjectSegfault/publapi/pages"
|
"github.com/ProjectSegfault/publapi/pages"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Userstruct struct {
|
||||||
|
Status int
|
||||||
|
Online int
|
||||||
|
Users []Userinfo
|
||||||
|
}
|
||||||
|
type Userinfo struct {
|
||||||
|
name string
|
||||||
|
fullname string
|
||||||
|
loc string
|
||||||
|
email string
|
||||||
|
desc string
|
||||||
|
website string
|
||||||
|
capsule string
|
||||||
|
online string
|
||||||
|
}
|
||||||
|
|
||||||
|
func Dedup(input string) string {
|
||||||
|
unique := []string{}
|
||||||
|
|
||||||
|
words := strings.Split(input, " ")
|
||||||
|
for _, word := range words {
|
||||||
|
// If we alredy have this word, skip.
|
||||||
|
if contains(unique, word) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
unique = append(unique, word)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(unique, " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func contains(strs []string, str string) bool {
|
||||||
|
for _, s := range strs {
|
||||||
|
if s == str {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func confparse(username, item string) string {
|
||||||
|
filename := "/home/" + username + "/meta-info.yaml"
|
||||||
|
file, err := ioutil.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
}
|
||||||
|
parsedData := make(map[interface{}]interface{})
|
||||||
|
err2 := yaml.Unmarshal(file, &parsedData)
|
||||||
|
if err2 != nil {
|
||||||
|
log.Error(err2)
|
||||||
|
}
|
||||||
|
val, err3 := parsedData[item].(string)
|
||||||
|
if !err3 {
|
||||||
|
log.Error(err3)
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
func userdata(username string) Userinfo {
|
||||||
|
var user Userinfo
|
||||||
|
user.name = confparse(username, "name")
|
||||||
|
user.fullname = confparse(username, "fullname")
|
||||||
|
user.capsule = confparse(username, "capsule")
|
||||||
|
user.website = confparse(username, "website")
|
||||||
|
user.desc = confparse(username, "desc")
|
||||||
|
user.email = confparse(username, "email")
|
||||||
|
user.loc = confparse(username, "loc")
|
||||||
|
//fmt.Println(user)
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
|
||||||
// publapi is a simple API for Project Segfault's public shared server (pubnix).
|
// publapi is a simple API for Project Segfault's public shared server (pubnix).
|
||||||
func main() {
|
func main() {
|
||||||
app := fiber.New()
|
app := fiber.New()
|
||||||
@ -33,19 +104,34 @@ func main() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
// Get the number of users online
|
// Get the number of users online
|
||||||
out, err := exec.Command("bash", "-c", "/usr/bin/users | /usr/bin/wc -l").Output()
|
usersonline, err := exec.Command("bash", "-c", "/usr/bin/users").Output()
|
||||||
log.Info(string(out))
|
usersonlinestr := string(usersonline)
|
||||||
|
usersonlinededup := Dedup(usersonlinestr)
|
||||||
|
outputa := int(strings.Count(usersonlinededup, " "))
|
||||||
|
var output int = 0
|
||||||
|
output = outputa + 1
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
return c.SendStatus(fiber.StatusInternalServerError)
|
|
||||||
}
|
}
|
||||||
|
users, err2 := exec.Command("bash", "-c", "/usr/bin/ls /home").Output()
|
||||||
output := string(out)
|
if err2 != nil {
|
||||||
|
log.Error(err2)
|
||||||
return c.JSON(fiber.Map{
|
}
|
||||||
"users": strings.TrimSuffix(output, "\n"),
|
userstr := string(users)
|
||||||
"status": c.Response().StatusCode(),
|
userstr2 := strings.TrimSuffix(userstr, "\n")
|
||||||
})
|
usersarr := strings.Split(userstr2, "\n")
|
||||||
|
//var userinfoarr []interface{}
|
||||||
|
var userinfostruct []Userinfo
|
||||||
|
for i := 0; i < len(usersarr); i++ {
|
||||||
|
uname := string(usersarr[i])
|
||||||
|
userinfostruct = append(userinfostruct, userdata(uname))
|
||||||
|
}
|
||||||
|
data := Userstruct{
|
||||||
|
Status: c.Response().StatusCode(),
|
||||||
|
Online: output,
|
||||||
|
Users: userinfostruct,
|
||||||
|
}
|
||||||
|
return c.JSON(data)
|
||||||
})
|
})
|
||||||
|
|
||||||
app.Post("/signup", pages.SignupPage)
|
app.Post("/signup", pages.SignupPage)
|
||||||
|
Loading…
Reference in New Issue
Block a user