2023-01-07 21:03:51 +05:30
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/ProjectSegfault/publapi/pages"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
2023-01-07 22:24:04 +05:30
|
|
|
log "github.com/sirupsen/logrus"
|
2023-01-17 19:35:28 +05:30
|
|
|
"gopkg.in/yaml.v3"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2023-01-07 22:46:35 +05:30
|
|
|
"runtime"
|
2023-01-08 00:13:20 +05:30
|
|
|
|
|
|
|
"strings"
|
2023-01-07 21:03:51 +05:30
|
|
|
)
|
|
|
|
|
2023-01-17 19:35:28 +05:30
|
|
|
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")
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
|
2023-01-07 21:32:06 +05:30
|
|
|
// publapi is a simple API for Project Segfault's public shared server (pubnix).
|
2023-01-07 21:03:51 +05:30
|
|
|
func main() {
|
|
|
|
app := fiber.New()
|
|
|
|
|
|
|
|
app.Get("/", func(c *fiber.Ctx) error {
|
|
|
|
return c.JSON(fiber.Map{
|
|
|
|
"message": "welcome to publapi",
|
|
|
|
"status": c.Response().StatusCode(),
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
app.Get("/online", func(c *fiber.Ctx) error {
|
2023-01-07 22:46:35 +05:30
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
return c.JSON(fiber.Map{
|
|
|
|
"message": "/online is not supported on Windows",
|
|
|
|
"status": c.Response().StatusCode(),
|
|
|
|
})
|
|
|
|
}
|
2023-01-07 21:03:51 +05:30
|
|
|
// Get the number of users online
|
2023-01-17 19:35:28 +05:30
|
|
|
usersonline, err := exec.Command("bash", "-c", "/usr/bin/users").Output()
|
|
|
|
usersonlinestr := string(usersonline)
|
|
|
|
usersonlinededup := Dedup(usersonlinestr)
|
|
|
|
outputa := int(strings.Count(usersonlinededup, " "))
|
|
|
|
var output int = 0
|
|
|
|
output = outputa + 1
|
2023-01-07 21:03:51 +05:30
|
|
|
if err != nil {
|
2023-01-07 22:24:04 +05:30
|
|
|
log.Error(err)
|
2023-01-07 21:03:51 +05:30
|
|
|
}
|
2023-01-17 19:35:28 +05:30
|
|
|
users, err2 := exec.Command("bash", "-c", "/usr/bin/ls /home").Output()
|
|
|
|
if err2 != nil {
|
|
|
|
log.Error(err2)
|
|
|
|
}
|
|
|
|
userstr := string(users)
|
|
|
|
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)
|
2023-01-07 21:03:51 +05:30
|
|
|
})
|
|
|
|
|
|
|
|
app.Post("/signup", pages.SignupPage)
|
|
|
|
|
2023-01-07 22:15:42 +05:30
|
|
|
app.Listen(GetPort())
|
2023-01-07 21:03:51 +05:30
|
|
|
}
|
2023-01-07 22:14:25 +05:30
|
|
|
|
|
|
|
// GetPort returns the port to listen on
|
|
|
|
func GetPort() string {
|
|
|
|
port := os.Getenv("PUBLAPI_PORT")
|
|
|
|
if port == "" {
|
|
|
|
port = "3000"
|
|
|
|
}
|
|
|
|
return ":" + port
|
|
|
|
}
|