Compare commits

..

3 commits

Author SHA1 Message Date
3f6920ee65
chore: Start v0.1.1 2024-09-16 23:51:25 +07:00
5f2bcdf01e
feat: Added node delete command 2024-09-16 23:29:15 +07:00
ef953b36fd
fix: Reject input hostname with protocol
This is quick fix.

Do not accept submitted tor address with protocol since it won't work.

The initial clearnet validation can be done with `net.LookupIP`, but
for tor network can't be done with that method. For now, just inform
to remove the http:// or https:// part to the submitter.
2024-09-16 22:35:14 +07:00
5 changed files with 67 additions and 2 deletions

View file

@ -1 +1 @@
v0.1.0 v0.1.1

View file

@ -12,4 +12,6 @@ func init() {
probersCmd.AddCommand(deleteProbersCmd) probersCmd.AddCommand(deleteProbersCmd)
listProbersCmd.Flags().StringP("sort-by", "s", "last_submit_ts", "Sort by column name, can be id or last_submit_ts") listProbersCmd.Flags().StringP("sort-by", "s", "last_submit_ts", "Sort by column name, can be id or last_submit_ts")
listProbersCmd.Flags().StringP("sort-dir", "d", "desc", "Sort direction, can be asc or desc") listProbersCmd.Flags().StringP("sort-dir", "d", "desc", "Sort direction, can be asc or desc")
cmd.Root.AddCommand(nodeCmd)
nodeCmd.AddCommand(deleteNodeCmd)
} }

59
cmd/server/node.go Normal file
View file

@ -0,0 +1,59 @@
package server
import (
"fmt"
"log/slog"
"os"
"strconv"
"github.com/ditatompel/xmr-remote-nodes/internal/database"
"github.com/ditatompel/xmr-remote-nodes/internal/monero"
"github.com/spf13/cobra"
)
var nodeCmd = &cobra.Command{
Use: "node",
Short: "[Server] Administer monitored nodes",
Long: `Command to administer monitored nodes.
This command should only be run on the server which directly connect to the MySQL database.
`,
Run: func(cmd *cobra.Command, _ []string) {
if err := cmd.Help(); err != nil {
slog.Error(err.Error())
os.Exit(1)
}
},
}
var deleteNodeCmd = &cobra.Command{
Use: "delete",
Short: "Delete node",
Long: `Delete node identified by ID.
This command delete node and it's associated probe logs (if exists).
To find out the node ID, visit frontend UI or from "/api/v1/nodes" endpoint.
`,
Run: func(_ *cobra.Command, _ []string) {
if err := database.ConnectDB(); err != nil {
fmt.Println(err)
return
}
nodeID, err := strconv.Atoi(stringPrompt("Node ID:"))
if err != nil {
fmt.Println("Invalid ID:", err)
return
}
moneroRepo := monero.New()
err = moneroRepo.Delete(uint(nodeID))
if err != nil {
fmt.Println("Failed to delete node:", err)
return
}
fmt.Printf("Node ID %d deleted\n", nodeID)
},
}

View file

@ -1,6 +1,6 @@
{ {
"name": "xmr-nodes-frontend", "name": "xmr-nodes-frontend",
"version": "v0.1.0", "version": "v0.1.1",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "VITE_API_URL=http://127.0.0.1:18901 vite dev --host 127.0.0.1", "dev": "VITE_API_URL=http://127.0.0.1:18901 vite dev --host 127.0.0.1",

View file

@ -220,6 +220,10 @@ func (r *moneroRepo) Add(protocol string, hostname string, port uint) error {
ipAddr = hostIp.String() ipAddr = hostIp.String()
ips = ip.SliceToString(hostIps) ips = ip.SliceToString(hostIps)
} else {
if strings.HasPrefix(hostname, "http://") || strings.HasPrefix(hostname, "https://") {
return errors.New("Don't start hostname with http:// or https://, just put your hostname")
}
} }
row, err := r.db.Query(` row, err := r.db.Query(`