#!/usr/bin/env racket #lang racket ; vim: ft=racket (require db crypto crypto/libcrypto net/base64) (when (file-exists? "version") (displayln "current directory contains data") (exit)) ; cache dirs (make-directory "cache") (make-directory "cache/actors") ; db dirs (make-directory "db") (make-directory "db/followers") (make-directory "db/comments") (make-directory "db/posted") ; actor keys (define PK-BEGIN "-----BEGIN PUBLIC KEY-----") (define PK-END "-----END PUBLIC KEY-----") (crypto-factories (list libcrypto-factory)) (define actor-key (generate-private-key 'rsa '((nbits 4096)))) (with-output-to-file "db/actorkey" (lambda () (write-bytes (pk-key->datum actor-key 'PrivateKeyInfo)) (void))) (with-output-to-file "db/actorkey.pub" (lambda () (write-bytes (string->bytes/utf-8 PK-BEGIN)) (write-bytes #"\n") (define pem (pk-key->datum actor-key 'SubjectPublicKeyInfo)) (write-bytes (base64-encode pem)) (write-bytes (string->bytes/utf-8 PK-END)) (void))) ; src and public (make-directory "src") (put-preferences '(shonks:instance-url shonks:display-name shonks:name) '("https://myinstance.tld/" "Display Name(tm)" "username") #f "src/instance.rktd") (with-output-to-file "src/bio.md" (lambda () (write-string "this section left intentionally blank") (void))) (make-directory "src/posts") (make-directory "public") (make-directory "public/posts") ; task queue (define c (sqlite3-connect #:database "taskq.sqlite3" #:mode 'create)) (query-exec c "create table taskq (id blob(16) primary key, task blob, state integer)") (disconnect c) (with-output-to-file "version" (lambda () (write-string "1.0") (void))) (displayln "done")