mirror of
https://github.com/BishopFox/cloudfox.git
synced 2026-11-07 09:56:01 -10:00
206 lines
4.1 KiB
Go
206 lines
4.1 KiB
Go
package internal
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/dominikbraun/graph"
|
|
"github.com/patrickmn/go-cache"
|
|
)
|
|
|
|
var Cache = cache.New(120*time.Minute, 0)
|
|
var sharedLogger = TxtLogger()
|
|
|
|
func SaveCacheToFiles(directory string, accountID string) error {
|
|
err := os.MkdirAll(directory, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for key, item := range Cache.Items() {
|
|
if accountID != "" && strings.Contains(key, accountID) {
|
|
entry := cacheEntry{
|
|
Value: item.Object,
|
|
Exp: item.Expiration,
|
|
}
|
|
|
|
jsonData, err := json.MarshalIndent(entry, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
filename := filepath.Join(directory, key+".json")
|
|
err = os.WriteFile(filename, jsonData, 0644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func LoadCacheFromFiles(directory string) error {
|
|
_, err := os.Stat(directory)
|
|
if os.IsNotExist(err) {
|
|
// Directory doesn't exist, skip loading cache
|
|
return nil
|
|
} else if err != nil {
|
|
return err
|
|
}
|
|
|
|
files, err := os.ReadDir(directory)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, file := range files {
|
|
if file.IsDir() {
|
|
continue
|
|
}
|
|
|
|
filename := filepath.Join(directory, file.Name())
|
|
jsonData, err := os.ReadFile(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var entry cacheEntry
|
|
err = json.Unmarshal(jsonData, &entry)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
key := strings.TrimSuffix(file.Name(), ".json")
|
|
Cache.Set(key, entry.Value, time.Duration(entry.Exp-time.Now().UnixNano()))
|
|
}
|
|
|
|
fmt.Println("Cache loaded from files.")
|
|
return nil
|
|
}
|
|
|
|
type cacheEntry struct {
|
|
Value interface{}
|
|
Exp int64
|
|
}
|
|
|
|
type CacheableAWSConfig struct {
|
|
Region string
|
|
//Credentials aws.CredentialsProvider
|
|
//ConfigSources []interface{}
|
|
}
|
|
|
|
func SaveCacheToGobFiles(directory string, accountID string) error {
|
|
err := os.MkdirAll(directory, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for key, item := range Cache.Items() {
|
|
|
|
// only if the key contains the accountID
|
|
if accountID != "" && strings.Contains(key, accountID) {
|
|
entry := cacheEntry{
|
|
Value: item.Object,
|
|
Exp: item.Expiration,
|
|
}
|
|
|
|
filename := filepath.Join(directory, key+".gob")
|
|
file, err := os.Create(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
encoder := gob.NewEncoder(file)
|
|
err = encoder.Encode(entry)
|
|
if err != nil {
|
|
sharedLogger.Errorf("Could not encode the following key: %s", key)
|
|
return err
|
|
}
|
|
// }
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var ErrDirectoryDoesNotExist = errors.New("directory does not exist")
|
|
|
|
func LoadCacheFromGobFiles(directory string) error {
|
|
_, err := os.Stat(directory)
|
|
if os.IsNotExist(err) {
|
|
// Directory doesn't exist, skip loading cache
|
|
return ErrDirectoryDoesNotExist
|
|
} else if err != nil {
|
|
return err
|
|
}
|
|
|
|
files, err := os.ReadDir(directory)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, file := range files {
|
|
if file.IsDir() {
|
|
continue
|
|
}
|
|
// if the filetype is json, skip it
|
|
if filepath.Ext(file.Name()) == ".json" {
|
|
continue
|
|
}
|
|
|
|
filename := filepath.Join(directory, file.Name())
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
var entry cacheEntry
|
|
decoder := gob.NewDecoder(file)
|
|
err = decoder.Decode(&entry)
|
|
if err != nil {
|
|
sharedLogger.Errorf("Could not decode the following file: %s", filename)
|
|
continue
|
|
}
|
|
|
|
// the key should remove the directory and the .json suffix from the filename and also trim the first slash
|
|
key := strings.TrimSuffix(strings.TrimPrefix(filename, directory), ".gob")[1:]
|
|
|
|
Cache.Set(key, entry.Value, time.Duration(entry.Exp-time.Now().UnixNano()))
|
|
}
|
|
|
|
//fmt.Println("Cache loaded from files.")
|
|
return nil
|
|
}
|
|
|
|
func SaveGraphToGob[K comparable, T any](directory string, name string, g *graph.Graph[K, T]) error {
|
|
err := os.MkdirAll(directory, 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
filename := filepath.Join(directory, name+".gob")
|
|
file, err := os.Create(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
encoder := gob.NewEncoder(file)
|
|
err = encoder.Encode(g)
|
|
if err != nil {
|
|
sharedLogger.Errorf("Could not encode the following graph: %s", name)
|
|
return err
|
|
|
|
}
|
|
return nil
|
|
}
|