Skip to content
This repository has been archived by the owner on Oct 28, 2024. It is now read-only.

spitsh/spitsh

Repository files navigation

👻 Spook in the Shell 👻 (Spit-sh) Build Status

Spook in the Shell (Spit or Spit-sh) is a language/compiler that outputs shell scripts. It compiles a strongly typed Perl 6 like language called "Spook" into /bin/sh compatible scripts. It's main purpose is devops/infrastructure related tasks. Current features include:

  • Compile time type checking
  • Basic libraries/modules
  • Test module for outputting TAP
  • Useful builtin classes and functions
  • Running and testing scripts in Docker
  • Logging to standard output

Everything about the language and compiler is still experimental. I am thinking about pivoting a bit into compiling golang to create standalone binaries instead of shell scripts. 🤔

Example

To get an idea of what Spit is consider the following basic program:

.install unless Pkg<nc>; # install nc unless it's already there
ok Cmd<nc>,"nc command exists now"; # test the nc command is there

You can compile this for CentOS from the command line like:

spit eval --os=centos  '.install unless Pkg<nc>; ok Cmd<nc>,"nc command exists now"'

Which ouputs the following shell at the time of writing:

BEGIN(){
  e(){ printf %s "$1"; }
  exec 4>/dev/null
  installed(){ yum list installed "$1" >&4 2>&4; }
  install(){ yum install -y $1 >&4 2>&4; }
  exists(){ command -v "$1" >&4; }
  exec 3>&1
  say(){ printf '%s\n' "$1" >&3; }
  note(){ printf '%s\n' "$1" >&2; }
  die(){ note "$1" && kill "-TERM" $$ >&4; }
  ok(){ test "$1" && say "✔ - $2" || die "✘ - $2"; }
}
MAIN(){
  if ! installed nc; then
    install nc
  fi
  ok "$(exists nc && e 1)" 'nc command exists now'
}
BEGIN && MAIN

If you have docker installed you can test this with:

spit eval --in-docker=centos '.install unless Pkg<nc>; ok Cmd<nc>,"nc command exists now"'
✔ - nc command exists now

Unfortunately on Debian the package is named 'netcat'. Let's deal with that:

# install-nc.sp
constant Pkg $nc = on {
    Debian { 'netcat' }
    Any    { 'nc' } # the default
};

.install unless $nc;
ok Cmd<nc>,"nc command exists now";

And now it should work on both the RHEL and Debian families of Linux distributions.

spit  compile install-nc.sp --in-docker=debian:latest
✔ - nc command exists now

Install

Spit is written in Perl 6 and requires rakudo and something to install Perl 6 ecosystem modules with like zef.

zef install Spit

and run

spit eval 'say "hello world"'

To check it's working.

Documentation

The documentation is pretty useless at the moment because the tooling has fallen far behind the language. What exists is under: doc/.

Project Layout

  • The Perl 6 Spit compiler module is in lib
  • The actual Spit source code is under resources/src
  • The core spit modules are under resouces/core-lib
  • The spec tests are in spec.