Table of Contents

  1. Getting Started
    1. Usage
    2. Installation
      1. Prerequisites
      2. Building Shackle
      3. Creating the required directory structure
      4. Set Shackle as your default shell
  2. Operating System Support
  3. Development Guide
    1. Development Environment Setup
    2. Running Tests
    3. Linting
    4. Building a Release Binary
  4. Roadmap / Issue Tracker TODO list
    1. MVP
    2. Post-MVP
  5. License

A shell for restricting access on a version control server.

This is intended as a replacement for Git Shell, but with a few opinionated differences:

Getting Started

Usage

Shackle Shell is intended to be set as the default shell for a user on a git server, where the user connects over SSH (see the Installation section below).

When you log in over SSH, you'll see a prompt, ready for you to type commands.

>

You can see the built in help by running the help command.

> help
Usage: <COMMAND>

Commands:
  init              Create a new repository
  list              List all repositories available
  set-description   Sets the description of a repository, as shown in the CLI listing and web interfaces
  set-branch        Sets the main branch of the repository
  exit              Quit the shell
  git-upload-pack   Server side command required to git fetch from the server
  git-receive-pack  Server side command required by git push to the server
  help              Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

The init command is used to create a new repo. In its simplest form, you just provide it with the name of your new repo. This will create a git repo with individual ownership.

> init awesome-project-idea
Successfully created "git/shukkie/awesome-project-idea.git"

The path given here is relative to your home directory. So the full URL to clone this repo is <username>@<server domain>:<git path>

$ git clone shukkie@example.com:git/shukkie/awesome-project-idea.git

You can learn its advanced options by using the --help flag. This works for all of the options, and is a great way to learn what all the commands do.

> init --help
Create a new repository

Usage: init [OPTIONS] <REPO_NAME>

Arguments:
  <REPO_NAME>  Name of the new repository

Options:
      --group <GROUP>              Share repository ownership with the specified group (user must be a member of the group)
      --description <DESCRIPTION>  Sets the description of the repository, as shown in the CLI listing and web interfaces
      --branch <BRANCH>            Sets the main branch of the repository [default: main]
  -h, --help                       Print help

Installation

Prerequisites

Building Shackle

There is not yet a binary release of Shackle, so you need to build it yourself from source. The easiest way to do this is using cargo install.

This requires a the Rust toolchain and a C compiler. See the Development Environment Setup section below for more information on environment setup to build from source.

# This installs to Cargo's default, which is ~/.cargo/bin. Consider using the
# --root option to install it somewhere that makes more sense for your server.
cargo install shackle-shell

Creating the required directory structure

Next, Shackle expects a specific directory structure. Specifically, personal git repos will live in ~/git/your-username and shared repos will live in ~/git/your-group.

If you have many users on your server, then consider making ~/git a symlink to the actual shared location for your git repos. For example, on my repo, all git users have a ~/git symlink in their home directory which actually points at /srv/git.

mkdir -p ~/git/$USER
chmod --recursive u=rwX,g=,o= ~/git/$USER

# Note that this should be a group you're actually a member of!
GROUP=my-group
mkdir -p ~/git/$GROUP
chown --recursive $USER:$GROUP ~/git/$GROUP
chmod --recursive u=rwX,g=rwXs,o= ~/git/$GROUP

Set Shackle as your default shell

The next step is to set the default shell of your user to Shackle. This will mean that if you login as the user, for example over ssh, then the default shell will be Shackle.

sudo usermod --shell $HOME/.cargo/bin/shackle-shell $USER

Operating System Support

Currently, Shackle Shell only supports running on Linux.

It will likely work on other Unix-like platforms, such as MacOS, but this is not currently tested, and there are currently no plans to do so. I would not expect it to work on Windows.

Development Guide

Development Environment Setup

If you're running Arch Linux, these are the steps you'll need to get your environment ready.

sudo pacman -S rustup docker git openssh gcc

# Rust
rustup default stable

# Docker
sudo usermod -a -G docker $USER
sudo systemctl start docker.service

# Note: you need to log out and in again for the new group to take effect

Running Tests

All unit tests are run with Cargo.

cargo test

Linting

Clippy should be used for linting. This can be installed using Rustup.

rustup component add clippy

And it can be run via Cargo.

cargo clippy

Building a Release Binary

Release binaries should be built in release mode.

cargo build --release

After running this, the binary is available in ./target/release/shackle-shell

Roadmap / Issue Tracker TODO list

MVP

Post-MVP

License

Licensed under MIT License.