rapture.go (3746B)
1 package main 2 import ( 3 bolt "go.etcd.io/bbolt" 4 "fmt" 5 "flag" 6 "encoding/json" 7 "strconv" 8 "strings" 9 "os" 10 ) 11 // defines json format for all posts made 12 type postform struct { 13 Title string `json:"title"` 14 Text string `json:"text"` 15 Id int `json:"id"` 16 Commentsnum int `json:"commentsnum"` 17 Comments []string `json:"comments"` 18 Ip string `json:"ip"` 19 } 20 var ( 21 dbpath *string 22 board *string 23 id *int 24 postrange *string 25 staticdir *string 26 ) 27 // gets keys out the bolt database 28 func databaseget(key string, bucket string) (string, error) { 29 db, err := bolt.Open(*dbpath, 0600, nil) 30 errmsg := "something fucked up" 31 if err != nil { 32 return errmsg, err 33 } 34 defer db.Close() 35 tx, err := db.Begin(true) 36 if err != nil { 37 return errmsg, err 38 } 39 defer tx.Rollback() 40 // _, err = tx.CreateBucketIfNotExists([]byte(bucket)) 41 // if err != nil { 42 // return errmsg, err 43 // } 44 b := tx.Bucket([]byte(bucket)) 45 v := b.Get([]byte(key)) 46 if v == nil { 47 return "empty key", nil 48 } 49 return string(v), nil 50 } 51 func databaseoverwrite(key string, value string, bucket string) error { 52 db, err := bolt.Open(*dbpath, 0600, nil) 53 if err != nil { 54 return err 55 } 56 defer db.Close() 57 tx, err := db.Begin(true) 58 if err != nil { 59 return err 60 } 61 defer tx.Rollback() 62 _, err = tx.CreateBucketIfNotExists([]byte(bucket)) 63 if err != nil { 64 return err 65 } 66 b := tx.Bucket([]byte(bucket)) 67 err = b.Delete([]byte(key)) 68 if err != nil { 69 return err 70 } 71 err = b.Put([]byte(key), []byte(value)) 72 if err != nil { 73 return err 74 } 75 if err := tx.Commit(); err != nil { 76 return err 77 } 78 return nil 79 } 80 func main(){ 81 dbpath = flag.String("db", "/var/thuja/thuja.db", "where thuja's bolt database is stored, must be readable and writable by thuja") 82 board = flag.String("b", "nil", "the board to delete the post from") 83 staticdir = flag.String("staticdir", "/var/thuja/public", "the directory where index.html and image files are stored, must be readable and writable by thuja") 84 id = flag.Int("id", -1, "the id to delete") 85 postrange = flag.String("range", "nil", "deletes a range of posts") 86 flag.Parse() 87 var deleteid bool 88 var deleterange bool 89 if(*board == "nil"){ 90 fmt.Fprintf(os.Stderr, "specify the board to delete from\n") 91 return 92 } 93 if(*id != -1){ 94 deleteid = true 95 } 96 if(*postrange != "nil"){ 97 deleterange = true 98 } 99 if(*postrange == "nil" && *id == -1){ 100 fmt.Fprintf(os.Stderr, "either specify a post id or specify a post range\n") 101 return 102 } 103 if(deleteid == true){ 104 post, err := databaseget(strconv.Itoa(*id), *board) 105 if (err != nil){ 106 fmt.Fprintf(os.Stderr, "error occured\n") 107 return 108 } 109 var jsonpost postform 110 json.Unmarshal([]byte(post), &jsonpost) 111 fmt.Printf("%s\n", jsonpost.Ip) 112 databaseoverwrite(strconv.Itoa(*id), "NULL", *board) 113 path := fmt.Sprintf("%s/%s-%d.jpg", *staticdir, *board, *id) 114 os.Remove(path) 115 } 116 if(deleterange == true){ 117 v := strings.Split(*postrange, "-") 118 postid, _ := strconv.Atoi(v[0]) 119 postmax, _ := strconv.Atoi(v[1]) 120 for ; postid <= postmax; postid++{ 121 path := fmt.Sprintf("%s/%s-%d.jpg", *staticdir, *board, *id) 122 os.Remove(path) 123 databaseoverwrite(strconv.Itoa(postid), "NULL", *board) 124 } 125 } 126 return 127 }