I picked up Racket, which is a Lisp variant, with the intent on building a decentralized computing engine (for a security class, I didn't want to run JohnTheRipper distributed in the class because it seemed like a free ride, and I was in the class to learn, dammit). So I wrote my own distributed cracker. Then it turned into a botnet. Then, it evolved into an operating system. SO, that being set, the code has evolved with my interests over the course of time and has come into a rather (incomplete) working operating system that (once connected to other nodes) will update itself from other nodes and update other nodes (with either running processes or os patches). Since it was a while since I created this, and it's been a while since I've looked at it, what I'm pasting may not be complete (but it should be).
- #lang racket/base
- (require racket/tcp)
- ;(require (lib "trace.ss"))
- (define SYSTEM_messages '())
- (define SYSTEM_processes '())
- (define SYSTEM_filesystem '(1))
- (define SYSTEM_efs '())
- (define SYSTEM_quit '())
- (define SYSTEM_kernel
- (lambda ()
- (begin
- (SYSTEM_prep_kernel)
- (SYSTEM_bootloader)
- (do ((index 0 0))
- ((eq? SYSTEM_quit 'quit) 'end)
- (begin
- (cond
- ((null? SYSTEM_messages))
- ((not (null? (car SYSTEM_messages)))
- (begin
- (SYSTEM_msg_handler (car SYSTEM_messages))
- (set! SYSTEM_messages (cdr SYSTEM_messages))))))))))
- (define retrieve_index
- (lambda (n d)
- (cond
- ((null? d) 'null)
- ((eq? n 1) (car d))
- (else
- (retrieve_index (- n 1) (cdr d))))))
- (define SYSTEM_patches
- (let ((patches '('patch_zero)))
- (lambda a
- (begin
- (cond
- ((eq? (car a) 'put) (set! patches (append patches (cdr a))))
- ((eq? (car a) 'get) (retrieve_index (cadr a) patches))
- ((eq? (car a) 'show) patches)
- (else
- 'ERROR
- ))))))
- (define SYSTEM_prep_kernel
- (lambda ()
- (begin
- ;(SYSTEM_create_thread 'test '(lambda () (sleep 2) (display 7) (newline)))
- ;(SYSTEM_create_thread 'updaterl '(lambda () (begin (updaterl))))
- ;(SYSTEM_create_thread 'updaterc '(lambda () (begin (updaterc "192.168.0.3"))))
- ;(SYSTEM_create_thread 'bsh bsh)
- ;(SYSTEM_create_message 'quit)
- '()
- )))
- (define SYSTEM_create_message
- (lambda (a)
- (cond
- ((eq? a 'quit) (set! SYSTEM_messages (append SYSTEM_messages (list (list 'quit))))))))
- (define SYSTEM_kill_thread
- (lambda (a)
- (begin
- (SYSTEM_kill_thread-helper a SYSTEM_processes))))
- (define SYSTEM_kill_thread-helper
- (lambda (t plist)
- (if (not (null? plist))
- (let ((c (car plist)))
- (cond
- ((null? plist) '(thread not found))
- ((eq? (car c) t)
- (begin
- (display (list 'killing 'thread t))
- (kill-thread (car (cddr c)))))
- (else
- (SYSTEM_kill_thread-helper t (cdr plist))))) '())))
- (define SYSTEM_create_thread
- (lambda (n t)
- (set! SYSTEM_messages (append SYSTEM_messages (list (list 'thread (list n t)))))))
- (define SYSTEM_msg_handler
- (lambda (message)
- (begin
- (cond
- ((eq? (car message) 'thread)
- (begin
- (display `(loading thread ,(caadr message)))
- (newline)
- (set! SYSTEM_processes (append SYSTEM_processes (list (append (cadr message) (list (thread(eval (cadadr message))))))))
- ))
- ((eq? (car message) 'kill)
- (begin
- (SYSTEM_kill_thread (cdr message))
- ;add a way to take this out of system processes
- ))
- ((eq? (car message) 'quit) (set! SYSTEM_quit 'quit))))))
- (define vversion 1)
- (define (updaterl)
- (let ((l (tcp-listen 2000)))
- (let-values (((sin sout) (tcp-accept l)))
- (begin
- (file-stream-buffer-mode sin 'none)
- (file-stream-buffer-mode sout 'none)
- (if (string=? (symbol->string (read sin)) "update")
- (begin
- (write 'vversion? sout)
- (newline sout)
- (let* ((new_vversion (read sin)))
- (begin
- (cond
- ((> new_vversion vversion)
- (begin
- (write 'updateme sout) (newline sout)
- (write vversion sout) (newline sout)
- (SYSTEM_patches 'put (read sin))
- (set! vversion (+ vversion 1))))
- ((< new_vversion vversion)
- (begin
- (write 'updatingyou sout) (newline sout)
- (write (SYSTEM_patches 'get (+ new_vversion 1)) sout) (newline sout)))
- (else
- (write 'identical sout) (newline sout)))))) '())
- (close-output-port sout)
- (close-input-port sin)
- (tcp-close l)
- (SYSTEM_create_thread 'updater '(lambda () (begin (updaterl))))))))
- (define updaterc
- (lambda (server)
- (let-values (((sin sout) (tcp-connect server 2000)))
- (begin
- (file-stream-buffer-mode sin 'none)
- (file-stream-buffer-mode sout 'none)
- (write 'update sout)
- (newline sout)
- (read sin)
- (write vversion sout)
- (newline sout)
- (let ((cmd (read sin)))
- (begin
- (cond
- ((eq? cmd 'identical) (display '(identical)))
- ((eq? cmd 'updateme)
- (let ((previous_vversion (read sin)))
- (begin
- (write (SYSTEM_patches 'get (+ previous_vversion 1)) sout)
- (display `(patching server ,previous_vversion to ,vversion))
- (newline)
- (sleep 1)
- (updaterc server))))
- ((eq? cmd 'updatingyou)
- (begin
- (SYSTEM_patches 'put (read sin))
- (set! vversion (+ vversion 1))
- (display `(patching from ,(- vversion 1) to ,vversion))
- (newline)
- (updaterc server))))))))))
- (define SYSTEM_bootloader
- (lambda ()
- (begin
- (if (not (file-exists? "fs"))
- (begin
- (display "Creating File System")(newline)
- (SYSTEM_bootloader-write)) '())
- (begin
- (display "Loading Bootloader")(newline)
- (set! SYSTEM_filesystem (SYSTEM_bootloader-load "fs"))
- (display "Loading File System")(newline)
- (set! SYSTEM_efs (cdr SYSTEM_filesystem))
- (display "Loading Operating System")(newline)
- (display (car (cdr (caar SYSTEM_filesystem))))))))
- (define SYSTEM_bootloader-write
- (lambda ()
- (let ((fport (open-output-file "fs")) (bl 'bootloader) (fs '(SYSTEM_create_thread 'bsh bsh)))
- (begin
- (print `(,bl ,fs) fport)
- (close-output-port fport)))))
- (define SYSTEM_bootloader-load
- (lambda (fname)
- (let ((fport (open-input-file fname)))
- (SYSTEM_bootloader-load_file fport))))
- (define SYSTEM_bootloader-load_file
- (lambda (port)
- (let ((rec (read port)))
- (if (eof-object? rec)
- '()
- (cons rec (SYSTEM_bootloader-load_file port))))))
- (define BSH_quit 0)
- (define inp 0)
- (define bsh
- (lambda ()
- (begin
- (do ((indexx 0 0))
- ((eq? BSH_quit 1) 'bsh_killed)
- (begin
- (if (eq? BSH_quit 0) (set! inp (read)) '())
- (cond
- ((and (symbol? inp) (eq? inp 'shutdown)) (set! SYSTEM_quit 'quit))
- ((and (symbol? inp) (eq? inp 'quit)) (set! BSH_quit 1))
- (else
- (begin
- (display (eval inp))
- (newline))))))
- (SYSTEM_kill_thread 'bsh))))
- (define file_read
- (lambda (fname)
- (read_fs_helper fname SYSTEM_filesystem)))
- (define read_fs_helper
- (lambda (fname flist)
- (cond
- ((null? flist) '(file not found))
- ((eqv? fname (caar flist)) (car (cdr (car flist))))
- (else
- (read_fs_helper fname (cdr flist))))))
- (define file_write
- (lambda (fname fdata)
- (write_fs_helper fname fdata '() SYSTEM_filesystem)))
- (define write_fs_helper
- (lambda (fname fdata flistL flistR)
- (cond
- ((null? flistR) (set! SYSTEM_filesystem (append SYSTEM_filesystem `(,`(,fname ,fdata)))))
- ((eqv? fname (caar flistR)) (set! SYSTEM_filesystem `(,`,(append flistL (list (cons fname (consfdata (cdr flistR))))))))
- (else
- (write_fs_helper fname fdata (append flistL (car flistR)) (cdr flistR))))))
- (define clear_fs_cache
- (lambda ()
- (let ((fport (open-output-file "fs" 'truncate)) (fs SYSTEM_filesystem))
- (begin
- (print fs fport)
- (close-output-port fport)
- '()))))
- (define update
- (lambda (a)
- (begin
- (SYSTEM_patches 'put a)
- (set! vversion (+ vversion 1))
- `(current patch level is ,vversion))))
- (define node_start
- (lambda ()
- (SYSTEM_create_thread 'updaterl '(lambda () (begin (updaterl))))))
- (define node_connect
- (lambda (n)
- (SYSTEM_create_thread 'updaterc '(lambda () (begin (updaterc n))))))
- (define help
- (lambda ()
- (begin
- (display '(node_start)) (newline)
- (display '(node_connect "IP")) (newline)
- (display '(update '(code))) (newline)
- (display '(clear_fs_cache)) (newline)
- '()
- )))
- (SYSTEM_kernel)
No comments:
Post a Comment