2 Commits

Author SHA1 Message Date
quiet-professional 7f22302859 patched sla bug
Build and Release Core / Test and Build (push) Successful in 6m4s
2026-04-30 12:49:51 -04:00
quiet-professional dc0ae8eb96 updated module name
Build and Release Core / Test and Build (push) Successful in 5m26s
2026-04-29 11:04:14 -04:00
39 changed files with 67 additions and 62 deletions
+2 -2
View File
@@ -13,7 +13,7 @@ Just drop the binary on a server and start triaging.
### Option A: Download the Binary
1. Go to the [Releases](https://epigas.gitea.cloud/RiskRancher/core/releases) tab and download the compiled executable for your OS (Windows/macOS/Linux).
1. Go to the [Releases](https://code.riskrancher.com/RiskRancher/core/releases) tab and download the compiled executable for your OS (Windows/macOS/Linux).
2. Place the binary in a dedicated directory and execute it.
3. Visit `http://localhost:8080` in your browser.
@@ -22,7 +22,7 @@ Just drop the binary on a server and start triaging.
Ensure you have **Go 1.26+** installed (*CGO is required for the native `mattn/go-sqlite3` driver*).
```bash
git clone https://epigas.gitea.cloud/RiskRancher/core
git clone https://code.riskrancher.com/RiskRancher/core
cd core
go build -o rr ./cmd/rr/main.go
./rr
+3 -3
View File
@@ -4,9 +4,9 @@ import (
"log"
"net/http"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/server"
"epigas.gitea.cloud/RiskRancher/core/ui"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/server"
"code.riskrancher.com/RiskRancher/core/ui"
)
var (
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"net/http"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
)
func main() {
+1 -1
View File
@@ -1,4 +1,4 @@
module epigas.gitea.cloud/RiskRancher/core
module code.riskrancher.com/RiskRancher/core
go 1.26.0
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"strconv"
"strings"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (h *Handler) HandleGetAdapters(w http.ResponseWriter, r *http.Request) {
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestAdapters(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -1,7 +1,7 @@
package adapters
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"strconv"
"strings"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
)
// PasswordResetRequest is the expected JSON payload
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"net/http/httptest"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func TestGetGlobalConfig(t *testing.T) {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"net/http/httptest"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func TestExportSystemState(t *testing.T) {
+1 -1
View File
@@ -1,7 +1,7 @@
package admin
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// Handler encapsulates all Admin and Sheriff HTTP logic
+2 -2
View File
@@ -7,8 +7,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// setupTestAdmin returns the clean Admin Handler and the raw DB
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestAnalytics(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -1,7 +1,7 @@
package analytics
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"encoding/base64"
"math/rand"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
"golang.org/x/crypto/bcrypt"
)
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"net/http/httptest"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
)
func setupTestAuth(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"errors"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// ErrNotFound is a standard error we can use across our handlers
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"path/filepath"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
_ "modernc.org/sqlite"
)
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"database/sql"
"testing"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
_ "modernc.org/sqlite" // We need the SQLite driver for the test
)
+7 -2
View File
@@ -28,8 +28,13 @@ CREATE TABLE IF NOT EXISTS sla_policies (
);
INSERT OR IGNORE INTO sla_policies (domain, severity, days_to_triage, days_to_remediate, max_extensions) VALUES
('Vulnerability', 'Critical', 3, 14, 1), ('Vulnerability', 'High', 3, 30, 2),
('Privacy', 'Critical', 3, 3, 0), ('Privacy', 'High', 3, 7, 1),
('Vulnerability', 'Critical', 3, 14, 1),
('Vulnerability', 'High', 3, 30, 2),
('Vulnerability', 'Medium', 7, 60, 2),
('Vulnerability', 'Low', 14, 90, 3),
('Vulnerability', 'Info', 30, 180, 5),
('Privacy', 'Critical', 3, 3, 0),
('Privacy', 'High', 3, 7, 1),
('Incident', 'Critical', 3, 1, 0);
CREATE TABLE IF NOT EXISTS users (
+1 -1
View File
@@ -3,7 +3,7 @@ package datastore
import (
"database/sql"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type SQLiteStore struct {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"time"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) UpdateAppConfig(ctx context.Context, config domain2.AppConfig) error {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"fmt"
"time"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) GetSheriffAnalytics(ctx context.Context) (domain2.SheriffAnalytics, error) {
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"fmt"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) SaveDraft(ctx context.Context, d domain2.DraftTicket) error {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"database/sql"
"time"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) IngestTickets(ctx context.Context, tickets []domain2.Ticket) error {
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"fmt"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (s *SQLiteStore) GetTickets(ctx context.Context) ([]domain.Ticket, error) {
+1 -1
View File
@@ -1,7 +1,7 @@
package ingest
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"net/http"
"strconv"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (h *Handler) HandleIngest(w http.ResponseWriter, r *http.Request) {
+2 -2
View File
@@ -13,8 +13,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestIngest(t *testing.T) (*Handler, *sql.DB) {
+2 -2
View File
@@ -5,8 +5,8 @@ import (
"net/http"
"strconv"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func (h *Handler) HandleSaveDraft(w http.ResponseWriter, r *http.Request) {
+1 -1
View File
@@ -1,7 +1,7 @@
package report
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type Handler struct {
+2 -2
View File
@@ -13,8 +13,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestReport(t *testing.T) (*Handler, *sql.DB) {
+2 -2
View File
@@ -3,8 +3,8 @@ package server
import (
"net/http"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"epigas.gitea.cloud/RiskRancher/core/pkg/sla"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/sla"
)
type App struct {
+9 -9
View File
@@ -3,14 +3,14 @@ package server
import (
"net/http"
"epigas.gitea.cloud/RiskRancher/core/pkg/adapters"
"epigas.gitea.cloud/RiskRancher/core/pkg/admin"
"epigas.gitea.cloud/RiskRancher/core/pkg/analytics"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"epigas.gitea.cloud/RiskRancher/core/pkg/ingest"
"epigas.gitea.cloud/RiskRancher/core/pkg/report"
"epigas.gitea.cloud/RiskRancher/core/pkg/tickets"
"epigas.gitea.cloud/RiskRancher/core/ui"
"code.riskrancher.com/RiskRancher/core/pkg/adapters"
"code.riskrancher.com/RiskRancher/core/pkg/admin"
"code.riskrancher.com/RiskRancher/core/pkg/analytics"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/ingest"
"code.riskrancher.com/RiskRancher/core/pkg/report"
"code.riskrancher.com/RiskRancher/core/pkg/tickets"
"code.riskrancher.com/RiskRancher/core/ui"
)
func RegisterRoutes(app *App) {
@@ -85,7 +85,7 @@ func RegisterRoutes(app *App) {
app.Router.Handle("POST /api/adapters", adminOnly(adapterH.HandleCreateAdapter))
app.Router.Handle("DELETE /api/adapters/{id}", adminOnly(adapterH.HandleDeleteAdapter))
app.Router.Handle("GET /api/admin/export", sheriffOnly(adminH.HandleExportState))
app.Router.Handle("GET /api/admin/check-updates", sheriffOnly(adminH.HandleCheckUpdates))
app.Router.Handle("POST /api/admin/shutdown", sheriffOnly(adminH.HandleShutdown))
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"log"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// DefaultSLACalculator implements the SLACalculator interface
+1 -1
View File
@@ -1,7 +1,7 @@
package tickets
import (
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
// Handler encapsulates all Ticket-related HTTP logic
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"testing"
"time"
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
func setupTestTickets(t *testing.T) (*Handler, *sql.DB) {
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"net/http"
"strconv"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
)
type InlineUpdateRequest struct {
+3 -3
View File
@@ -13,9 +13,9 @@ import (
"strconv"
"strings"
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
"epigas.gitea.cloud/RiskRancher/core/pkg/report"
"code.riskrancher.com/RiskRancher/core/pkg/auth"
"code.riskrancher.com/RiskRancher/core/pkg/domain"
"code.riskrancher.com/RiskRancher/core/pkg/report"
)
//go:embed templates/* templates/components/* static/*