wishlist package - github.com/charmbracelet/wishlist - Go Packages

wishlist

package module
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 12, 2022 License: MIT Imports: 25 Imported by: 2

README

Wishlist

Latest Release GoDoc Build Status

The SSH directory ✨

screencast

With Wishlist you can have a single entrypoint for multiple SSH endpoints, whether they are Wish apps or not.

As a server, it can be used to start multiple SSH apps within a single package and list them over SSH. You can list apps provided elsewhere, too.

You can also use the wishlist CLI to list and connect to servers in your ~/.ssh/config or a YAML config file.

Usage

CLI

If you just want a directory of existing servers, you can use the wishlist CLI and a YAML config file. You can also just run it without any arguments to list the servers in your ~/.ssh/config. Check the example config file file as well as wishlist --help for details.

Library

Wishlist is also available as a library which allows you to start several apps within the same process. Check out the _example folder for a working example.

Auth

  • if ssh agent forwarding is available, it will be used
  • otherwise, each session will create a new ed25519 key and use it, in which case your app will be to allow access to any public key
  • password-based auth is not supported
Agent forwarding example
eval (ssh-agent)
ssh-add -k # adds all your pubkeys
ssh-add -l # should list the added keys

ssh \
  -o 'ForwardAgent=yes' \             # forwards the agent
  -o 'UserKnownHostsFile=/dev/null' \ # do not add to ~/.ssh/known_hosts, optional
  -p 2222 \                           # port
  foo.bar \                           # host
  -t list                             # optional, app name

You can also add this to your ~/.ssh/config, for instance:

Host wishlist
	HostName foo.bar
	Port 2222
	ForwardAgent yes
	UserKnownHostsFile /dev/null

Running it

Wishlist will read and store all its information in a .wishlist folder in the current working directory:

  • the server keys
  • the client keys
  • known hosts
  • config files

Config files may be provided in either YAML or SSH Config formats:

The config files are tried in the following order:

  • the -config flag in either YAML or SSH config formats
  • .wishlist/config.yaml
  • .wishlist/config.yml
  • $HOME/.ssh/config
  • /etc/ssh/ssh_config

The first one that is loaded and parsed without errors will be used. This means that if you have your common used hosts in your ~/.ssh/config, you can simply run wishlist and get it running right away. It also means that if you don't want that, you can pass a path to -config, and it can be either a YAML or a SSH config file.

Using the binary
wishlist
Using Docker
mkdir .wishlist
$EDITOR .wishlist/config.yaml # either an YAML or a SSH config
docker run \
  -p 2222:22 \
  -v $PWD/.wishlist:/.wishlist \
  docker.io/charmcli/wishlist:latest

Acknowledgments

The gif above shows a lot of Maas Lalani’s confeTTY.

Feedback

We'd love to hear your thoughts on this project. Feel free to drop us a note!

License

MIT


Part of Charm.

The Charm logo

Charm热爱开源 • Charm loves open source

Documentation

Overview

Package wishlist provides a library and binary to list and connect to SSH apps.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Serve

func Serve(config *Config) error

Serve serves wishlist with the given config.

Types

type Config

type Config struct {
	Listen    string                              `yaml:"listen"`    // Address to listen on.
	Port      int64                               `yaml:"port"`      // Port to start the first server on.
	Endpoints []*Endpoint                         `yaml:"endpoints"` // Endpoints to list.
	Factory   func(Endpoint) (*ssh.Server, error) `yaml:"-"`         // Factory used to create the SSH server for the given endpoint.
	Users     []User                              `yaml:"users"`     // Users allowed to access the list.
	// contains filtered or unexported fields
}

Config represents the wishlist configuration.

type Endpoint

type Endpoint struct {
	Name        string            `yaml:"name"`    // Endpoint name.
	Address     string            `yaml:"address"` // Endpoint address in the `host:port` format, if empty, will be the same address as the list, increasing the port number.
	User        string            `yaml:"user"`    // User to authenticate as.
	Middlewares []wish.Middleware `yaml:"-"`       // wish middlewares you can use in the factory method.
}

Endpoint represents an endpoint to list. If it has a Handler, wishlist will start an SSH server on the given address.

func (*Endpoint) Description

func (i *Endpoint) Description() string

Description to abide the list.Item interface.

func (*Endpoint) FilterValue

func (i *Endpoint) FilterValue() string

FilterValue to abide the list.Item interface.

func (Endpoint) ShouldListen

func (e Endpoint) ShouldListen() bool

ShouldListen returns true if we should start a server for this endpoint.

func (*Endpoint) String

func (e *Endpoint) String() string

String returns the endpoint in a friendly string format.

func (*Endpoint) Title

func (i *Endpoint) Title() string

Title to abide the list.Item interface.

func (Endpoint) Valid

func (e Endpoint) Valid() bool

Valid returns true if the endpoint is valid.

type User

type User struct {
	Name       string   `yaml:"name"`
	PublicKeys []string `yaml:"public-keys"`
}

User contains user-level configuration for a repository.

Directories

Path Synopsis
cmd
wishlist command
Package sshconfig can parse a SSH config file into a list of endpoints.
Package sshconfig can parse a SSH config file into a list of endpoints.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL