- Python 100%
| examples@99f2e9c3d2 | ||
| src/sshare | ||
| .gitignore | ||
| .gitmodules | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
SSHare
Upload files to a server via ssh
Installing
SSHare is not available on PyPI. To install it you will need to clone the repo and use pip to install it
git clone https://forge.monodon.me/Gnarwhal/sshare.git
cd sshare
pip install ./
By default, the only dependency SSHare has is the system's ssh (and scp) commands.
Beyond that it only utilises the python standard library.
Additional Functionality
The base install is fairly bare bones in terms of functionality.
Included in the examples/ submodule, there is a sampling of
plugins which provide some additional conveniences
Refer to the above documentation for information on installing plugins
Documentation - End User
Getting started with SSHare is about getting familiar with configuring SSHare.
SSHare configuration is all done in the ${XDG_CONFIG_DIR}/sshare if set, or in ~/.config/sshare otherwise.
In this directory are two important items: the config.toml file and the plugins/ directory.
plugins/
The plugins/ directory is home to all external plugins. Installing a plugin is as simple as saving the
the plugin's .py file to the plugins/.
config.toml
The configuration file can be broken down into three major components: spec, config, and flags.
spec
[spec.default]
name = [ "time", "extension" ]
[spec.example]
flag = { short = "e", long = "example" }
name = [ "preserve", "extension" ]
[spec.noshort]
flag = { long = "only" }
name = [ "time" ]
help = "No short flag, only long flag >:("
The spec section is a collection of different runtime specifications. The name of a specification is
unimportant with the exception of default, which is run when no other spec is activated. In each specification
that isn't default, there is a flag attribute that sets which command line arguments activate the
specification. The flag attribute must have one or both of short or long, where short will be set the flag
-{short} and long will set the flag --{long}. The name attribute of a specification is an array of name type
plugins which controls the order in which said plugins are executed. Specifications can also provide a brief description
in the help attribute, which will be displayed when sshare --help is run. In the example above,
running sshare --help would give
options:
-e, --example Use example spec
--only No short flag, only long flag >:(
config
[config.ssh]
host = "example.com"
path = "/directory/to/store/files/in"
port = 22
The config section is used to set configuration options for plugins. Refer to documentation for a plugin to see
what options can be set here. Documentation for default plugins is included below.
flags
[flags.file]
file = { short = "f" }
[flags.stdin]
stdin = { short = "" }
[flags.example]
option = { short = "o", long = "ooooption" }
The flags section is used to bind plugin arguments to a command line argument. They are specified in the same way
as the flag option for specs. If long is left unspecified, the long flag will be set to the default provided by
the plugin. In the example above, running sshare --help would give:
options:
-f file, --file file Upload a file
-, --stdin Upload from stdin
-o xmpl, --ooooption xmpl
This is not a real plugin that exists
Default Plugins
command_line
A logger plugin which prints to the command line. No configuration needed.
extension
A name plugin which appends the source type to the end of the file name (i.e. txt, png, etc...). No configuration needed.
file
A source plugin which provides a file to be uploaded. File is specified with the --file {file_path} argument. No configuration needed.
preserve
A name plugin which preserves the name of the source in the uploaded file. No configuration needed.
print_location
A feedback plugin which prints the location that sources can be accessed from. No configuration needed.
ssh
An upload plugin which uploads the sources to the server using ssh.
Configuration
| Attribute | Type | Default | Description |
|---|---|---|---|
| host | string | None | The hostname to ssh into |
| path | string | None | The path of the directory to upload the sources into |
| port | int | 22 | The port to ssh into |
| user | string | $USER | The user to ssh as |
stdin
A source plugin which reads from stdin. No configuration needed.
time
A name plugin which adds the current unix time to the name of the of the uploaded file.
Configuration
| Attribute | Type | Default | Description |
|---|---|---|---|
| format | int | 62 | The base between 2 and 62 to represent the number in |
uri
A location plugin which constructs the resulting URI that the uploaded file can be accessed from.
Configuration
| Attribute | Type | Default | Description |
|---|---|---|---|
| protocol | string | https | The protocol of the URI |
| host | string | None | The hostname the file can be accessed from |
| port | int | 22 | The port the file can be accessed at |
| path | string | None | The path the file can be accessed at |
Documentation - Plugin Development
A plugin for SSHare is just a python file (*.py). There are currently 6 types of plugins:
loggersourcenameuploadlocationfeedbackA plugin can specify be any combination of the above types. For examples of plugins see here and here
General Attributes
Every plugin regardless of type specifies or is provided with these attributes.
plugin_type
This mandatory paramater specifies what type(s) this plugin is. It can be either a:
string- Promotes to{ string }set- A set containing each of the plugin's types.
activate
This optional parameter specifies what flag(s) or argument(s) must be passed for this plugin to be activated. It can be either a:
string- Promotes to{ string }set- Promotes to{ plugin_type: { string, ... }, plugin_type2: { string, ... }, ... }dict- A dictionary that maps each type the plugin is, to the flags or arguments that activate the plugin for that type All arguments specified inactivatemust be provided by the user for the plugin to activate.
config
This optional parameter specifies configuration options for the plugin. These values are what a user is allowed to change
through config.toml. It is a map containing { option: default_value, ... }. If there is no default value (i.e. it is mandatory
that the user set it explicitly) for the option, it can be set to NoDefault provided by
from sshare.plugin.config import NoDefault.
While config is initially specified as a dict, when the plugin is loaded it will be converted to an object with attributes.
For example, if a config is specified as
config = {
"example0": 42,
}
it would then be accessed by config.example not config["example"].
args
This optional parameter specifies arguments for the plugin. These values are also accessed from the config object,
however they are provided via program arguments as opposed to being specified in config.toml. An option specified
in both config and args will be loaded from the config file first and overriden by the program argument if
provided. Arguments are of type Argument provided by from sshare.plugin.config import Argument.
Argument takes name (optionally) and a list of kwargs equivalent to the option document here. As a convenience there is also Flag provided by
from sshare.plugin.config import Flag, which is for boolean arguments which take no parameters.
Flag only takes a help=... paramater.
init
If a plugin needs to do any initialisation, it can be done in the init method. The init method takes no parameters
and returns no values.
logger
Logger is not specified by the plugin developer, but is available inside the plugin if needed. The logger
has three levels: info, warn and error.
Type Specific Attributes
logger
info(str)warn(str)error(str)
source -> get_source()
The get_source function takes no arguments and returns a source. There are currently two types of sources provided by
from sshare.plugin.source import (Raw | File).
Raw- A raw data source. It has a type, a source name, and a byte array providing the data.File- A file or directory source. It has only the path to the file.
name -> get_name(current_name, source)
name plugins are chained one after the other. The first name plugin is provided an empty string for current_name.
Each subsequent name plugin is provided the output of the previous name plugin's get_name function. The source
parameter is the either Raw or File data source.
upload -> upload(name, source)
upload plugins are responsible for getting the source to the destination.
location -> get_location(name)
The get_location function takes in the name of a source and returns a location that the source can now be accessed from
(e.g. a URL).
feedback -> give_feedback(location)
The give_feedback function takes output from location plugins and presents it to the user (e.g. printing to console,
desktop notification. etc...).