├── .gitignore ├── .gitmodules ├── .travis.yml ├── COPYRIGHT ├── LICENSE ├── README.md ├── build ├── build.shellfire ├── lib └── shellfire │ └── pathsd_helper │ ├── actions.functions │ ├── actions │ ├── CentOS.functions │ └── Debian.functions │ ├── execute.functions │ └── validate.functions ├── paths.d-helper ├── swaddling ├── shellfire │ ├── .gitignore │ ├── deb │ │ └── deb.conf │ ├── package.conf │ ├── rpm │ │ └── rpm.conf │ ├── skeleton │ │ └── all │ │ │ └── usr │ │ │ └── bin │ │ │ └── .gitignore │ └── tar │ │ └── tar.conf └── swaddling.conf └── tools ├── continuous-integration.travis.yaml └── miscellany ├── licenses.numbers └── logo.key /.gitignore: -------------------------------------------------------------------------------- 1 | output 2 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/shellfire/core"] 2 | path = lib/shellfire/core 3 | url = https://github.com/shellfire-dev/core.git 4 | [submodule "etc/shellfire/paths.d"] 5 | path = etc/shellfire/paths.d 6 | url = https://github.com/shellfire-dev/paths.d.git 7 | [submodule "tools/fatten"] 8 | path = tools/fatten 9 | url = https://github.com/shellfire-dev/fatten.git 10 | [submodule "tools/swaddle"] 11 | path = tools/swaddle 12 | url = https://github.com/raphaelcohn/swaddle.git 13 | [submodule "lib/shellfire/build"] 14 | path = lib/shellfire/build 15 | url = https://github.com/shellfire-dev/build.git 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | tools/continuous-integration.travis.yaml -------------------------------------------------------------------------------- /COPYRIGHT: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Comment: Distribution Compilation Copyright and License 3 | Copyright: Copyright © 2014-2015, Raphael Cohn 4 | License: MIT 5 | The MIT License (MIT) 6 | . 7 | Copyright © 2014-2015, Raphael Cohn 8 | . 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | . 16 | The above copyright notice and this permission notice shall be included in all 17 | copies or substantial portions of the Software. 18 | . 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | 27 | Files: * 28 | Copyright: Copyright © 2014-2015, Raphael Cohn 29 | License: MIT 30 | The MIT License (MIT) 31 | . 32 | Copyright © 2014-2015, Raphael Cohn 33 | . 34 | Permission is hereby granted, free of charge, to any person obtaining a copy 35 | of this software and associated documentation files (the "Software"), to deal 36 | in the Software without restriction, including without limitation the rights 37 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 38 | copies of the Software, and to permit persons to whom the Software is 39 | furnished to do so, subject to the following conditions: 40 | . 41 | The above copyright notice and this permission notice shall be included in all 42 | copies or substantial portions of the Software. 43 | . 44 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 45 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 46 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 47 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 48 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 49 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 50 | SOFTWARE. 51 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | LICENSE terms are documented in the COPYRIGHT file at the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [shellfire] 2 | 3 | [shellfire] is a MIT licensed framework for building modular applications in POSIX-compliant shell script. It is designed to:- 4 | 5 | * abstract away the differences (and myriad bugs) between multiple shell interpreters 6 | * implement common idioms and functionality 7 | * promote re-use of shell code with a modern, modular set of functions to get practical things done fast 8 | * work effectively with structured data formats such as JSON, XML and Debian control files 9 | * enable the development of fully standalone scripts, complete with resources (snippets) 10 | * allow shell scripts to automatically determine and install their dependencies 11 | * but have a minimal need to 'shell out' to binaries that might not be there - or might not behave 12 | 13 | [shellfire] consists of a number of github repositories, called modules. Each module contains functions or resources in a specific namespace. You create a [shellfire] application by making a new repository (typically on GitHub) with a skeleton structure, and then adding the modules you need. You populate a template shell script, and then just code away. It couldn't be easier. [shellfire] scripts work straightaway from source control. When you're ready to do a release, you can use [fatten] to make a standalone script, and [swaddle] to then deploy it to GitHub releases, pages, etc as tarballs, debs, etc. 14 | 15 | ## Impatient to Get Started? There's a [tutorial] 16 | Try the overdrive [tutorial]. You'll be up and running with your first [shellfire] application in 10 mins. 17 | 18 | ## So what's included? 19 | In homage to Python, batteries are included. Here's the list of modules and namespaces:- 20 | 21 | * [core], the daddy of them all. Includes such beauties as 22 | * Compatiblity functions, abstracting away differences and allowing things like `pushd` in all shells 23 | * A set of base64 decode functions which decode regardless of what binaries you've got (if any at all) 24 | * A dependency framework to document required binaries, set up the `PATH` and automatically install packages that contain them, so you can rely on `date` doing the same thing on Mac OS X as well as Linux, say 25 | * A fully-fledged command line parser, which handles long options, argumented and unargumented values, golfed arguments with no third party dependencies, help messages, version information, verbosity settings, non-options and more 26 | * Snippets, so you can embed data, text, here docs or even specialised binaries inside shell scripts. Important to version control data, resources and here docs separately. 27 | * One-liner child process clean-up 28 | * Terminal aware colour coded messages (which know about ANSI and tput and fallback gracefully) 29 | * A hierachial configuration framework, so administrator and users can have their own settings for any command line switch 30 | * Configuration can be broken into fragments (like Debian run-parts), so that common across environments can be checked in, and passwords kept separate 31 | * Insecurely permissioned files aren't loaded 32 | * Administrators can also prevent overrides of sensitive values 33 | * Validation and path testing functions 34 | * Indirect variable access, a boolean type, string functions (startsWith, contains, etc) 35 | * Trivial to use, but always secure, random and cleaned up temporary files and folders 36 | * Signal management 37 | * Arrays even for shells without them, and more! 38 | * [build], functions for creating build scripts as well as a ready-to-use binary, `build` to drop in and make builds easy-peasy. 39 | * [byte], functions for setting and testing bits. 40 | * [compress], a simple consistent interface to compression, file extensions and associated MIME types. 41 | * [configure], an additional framework for more advanced configuration. Used by [swaddle] to let users define simple configuration files for package and repository definitions. 42 | * [cpucount], functions to help with enumerating CPU numbers and deciding on load averages. 43 | * [curl], superb interface to curl that works with the shell. Securely wraps curl so URLs, headers and credentials don't leak in process lists or environment variables, and parses headers, etc afterwards. 44 | * [debian], a small framework that includes a complete Debian control file parser. 45 | * [git], a small framework of wrapper functions to make it easier to use `git` from [shellfire] applications. 46 | * [github api], a REST interface that uses [curl], [urlencode], [jsonreader] and [jsonwriter]. Currently, only supports enough to support [swaddle], but, if you're looking for an open source project, this is one to do. A complete command line, shell based GitHub client would be a real win. And one for Linode. And Digital Ocean. And ... 47 | * [jsonreader], a pure shell JSON reader. Raises events rather than creating an anaemic DOM of objects and lists - which has always been the _right_ way to deal with structured data... Think SAX for JSON. 48 | * [jsonwriter], writes JSON. 49 | * [random], a small framework to obtain random numbers and characters in shell script, using fallbacks to progressively less random sources. 50 | * [unicode], to correctly encode code points in UTF-8 and UTF-16 (uggh). 51 | * [urlencode], for all the myriad URL encodings possible. Includes a URI template Level 4 encoder. 52 | * [version], a simple module to compare version numbers. Yes, I know that's normally bad, but some things (like [curl]) need it as we can't do feature detection. 53 | * [xmlwriter], writes XML. 54 | 55 | Of course, this is just a start. If there's something you'd like to see, code it and submit a pull request. 56 | 57 | Additionally, there's also 58 | 59 | * [fatten], to make standalone shell scripts 60 | * [paths.d], which contains common locations and package names for different package managers. Used by [core]'s dependency framework as a source of information on where to find programs. 61 | * [swaddle], to package everything up, create repositories and push to GitHub, whether as a Deb, RPM, tarball or 7z. Or more. 62 | * [tutorial], the tutorial 63 | 64 | ## Why? 65 | Because the shell matters, as shellshock showed us. Because the shell is powerful, but is a poorly understood programming language with too many variants and gotchas. And it needs proper constructs. And lastly, because we're fed up with having to install half-an-universe's worth of Ruby, Python and Perl to bootstrap our servers or run CI jobs\*. We like [Rob Landley's Aboriginal Linux](http://landley.net/aboriginal/). And if we want to build our own bespoke, single purpose servers, managed switches and embedded routers post-Snowden, less is more. 66 | 67 | \* And if you've had to work with some of the backwards-is-forwards sysadmins I have had to in some strange organisations, doing it all in the shell is the only way of getting it done at all. 68 | 69 | _PS: If we could have our time again with the syntax of POSIX shell script, we probably would. But we're stuck with it. The flip side is, it hasn't changed in 16 years, so today it works almost anywhere._ 70 | 71 | ## Yeah, cool. So what uses it? 72 | 73 | Well, not much yet, but, who knows? There's currently:- 74 | 75 | * [swaddle], a tool for packaging, building package repositories, signing them, deploying their keys and publishing them on GitHub pages or wherever. 76 | * [bish-bosh], a complete [MQTT](http://mqtt.org/) 3.1.1 client. Totally portable, totally scriptable, minimally dependent. 77 | * [fatten], shellfire's own fattening tool 78 | * [developjs], [KisanHub]'s foundational javascript framework 79 | * [luvi-builder], a simple wrapper around [luvi] 80 | 81 | ## You're mad. You should grow up and use Ruby, Python or Go. 82 | We're proficient in all of them. And we've delivered some seriously hard core stuff in our time: message queue brokers that handle 1,000,000 simultaneous users in C. Postgresql network protocols in Java. Static webframeworks in Ruby. Devops automation in Python, oh, and a portfolio trading system in C#. A professional uses the language most appropriate to the problem domain. We do have beards and sandles, though. 83 | 84 | ## What platforms or shells are supported? 85 | 86 | Code is known to run well on:- 87 | 88 | * Linux (including as old as CentOS 5, which is pretty obsolescent) 89 | * Mac OS X (using Homebrew where necessary) 90 | * The BSDs (all of them) 91 | * Cygwin 92 | * AIX 93 | * Solaris 94 | 95 | We plan to support major distributions whilst their owners support them, as long as we can access without cost to the underlying technologies. We have limited interest in supporting obscure, dying or dead commercial platforms (eg HP-UX, Tru64). 96 | 97 | We work well on POSIX shells that support a `local` keyword or alias:- 98 | 99 | * bash (3.2+) 100 | * bash as sh 101 | * ash derivatives 102 | * dash 103 | * BusyBox ash 104 | * ksh88 derivatives 105 | * mksh 106 | * pdksh 107 | * AIX ksh88 108 | * Solaries ksh88 109 | 110 | yash is not there yet but could be if there's interest. We're not going to support ksh93 as it's just too different, and zsh, great as it is an interactive shell, is a bit hit and miss. MinGW MSYS uses bash 3.1, which mostly works, but has some terrible IFS handling bugs (in particular, this affects arrays; this can be worked around, but a generic solution handicaps all other shells). 111 | 112 | ## Original Developers 113 | [shellfire] has been open sourced and enhanced from code previously used in-house by [stormmq](http://stormmq.com/) and [KisanHub](http://www.kisanhub.com/). The lead developer is [Raphael Cohn](https://github.com/raphaelcohn). 114 | 115 | ## Ready to get stated? 116 | Follow the [tutorial] and you'll be up and running your first [shellfire] application in 10 mins. 117 | 118 | [shellfire]: https://github.com/shellfire-dev "shellfire homepage" 119 | [fatten]: https://github.com/shellfire-dev/fatten "fatten homepage" 120 | [swaddle]: https://github.com/raphaelcohn/swaddle "Swaddle homepage" 121 | [bish-bosh]: https://github.com/raphaelcohn/bish-bosh "bish-bosh homepage" 122 | [core]: https://github.com/shellfire-dev/core "shellfire core module homepage" 123 | [build]: https://github.com/shellfire-dev/build "shellfire build module homepage" 124 | [byte]: https://github.com/shellfire-dev/byte "shellfire byte module homepage" 125 | [compress]: https://github.com/shellfire-dev/compress "shellfire compress module homepage" 126 | [configure]: https://github.com/shellfire-dev/configure "shellfire configure module homepage" 127 | [cpucount]: https://github.com/shellfire-dev/cpucount "shellfire cpucount module homepage" 128 | [curl]: https://github.com/shellfire-dev/curl "shellfire curl module homepage" 129 | [debian]: https://github.com/shellfire-dev/debian "shellfire debian module homepage" 130 | [git]: https://github.com/shellfire-dev/git "shellfire git module homepage" 131 | [github api]: https://github.com/shellfire-dev/github "shellfire github api module homepage" 132 | [jsonreader]: https://github.com/shellfire-dev/jsonreader "shellfire jsonreader module homepage" 133 | [jsonwriter]: https://github.com/shellfire-dev/jsonwriter "shellfire jsonwriter module homepage" 134 | [random]: https://github.com/shellfire-dev/random "shellfire random module homepage" 135 | [unicode]: https://github.com/shellfire-dev/unicode "shellfire unicode module homepage" 136 | [urlencode]: https://github.com/shellfire-dev/urlencode "shellfire urlencode module homepage" 137 | [version]: https://github.com/shellfire-dev/version "shellfire version module homepage" 138 | [xmlwriter]: https://github.com/shellfire-dev/xmlwriter "shellfire xmlwriter module homepage" 139 | [paths.d]: https://github.com/shellfire-dev/paths.d "shellfire paths.d path data homepage" 140 | [tutorial]: https://github.com/shellfire-dev/tutorial "shellfire tutorial homepage" 141 | [developjs]: https://github.com/KisanHub/developjs "developjs homepage" 142 | [KisanHub]: http://kisanhub.com/ "KisanHub homepage" 143 | [luvi-builder]: https://github.com/raphaelcohn/luvi-builder "luvi-builder homepage" 144 | [luvi]: https://github.com/luvit/luvi: "luvi homepage" 145 | -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | lib/shellfire/build/build -------------------------------------------------------------------------------- /build.shellfire: -------------------------------------------------------------------------------- 1 | core_dependency_requires '*' rm mkdir 2 | 3 | build() 4 | { 5 | build_travis_ci_updateGitSubmodulesRecursively 6 | build_travis_ci_ensureGnupgKeyringExists 7 | build_prepareOutput 8 | 9 | build_createInitialFatten 'initial-fatten' 10 | 11 | build_assignDefaultComponents 12 | core_variable_array_iterate build_nonOptions build_component 13 | } 14 | 15 | build_createInitialFatten() 16 | { 17 | local groupName="$1" 18 | 19 | core_message NOTICE "Initial fattening of '$groupName' as a self-hosting bootstrap" 20 | 21 | local fattenedOutputPath="$build_outputPath"/fattened/"$groupName"/all 22 | 23 | rm -rf "$fattenedOutputPath" 2>/dev/null || sudo -p "Please enter the password for user %p to let root rm -rf '$fattenedOutputPath': " rm -rf "$fattenedOutputPath" 24 | mkdir -m 0755 -p "$fattenedOutputPath" 25 | 26 | "$build_fattenPath_default" --verbose $(core_init_verbosity) --force --repository-path tools/fatten --output-path "$fattenedOutputPath" --bin-path "$build_binPath" -- fatten 27 | 28 | # Override to force use of our fattened fatten 29 | build_fattenPath="${fattenedOutputPath}${build_binPath}"/fatten 30 | } 31 | 32 | build_assignDefaultComponents() 33 | { 34 | if core_variable_array_isEmpty build_nonOptions; then 35 | core_variable_array_append build_nonOptions \ 36 | 'fatten' \ 37 | 'swaddle' \ 38 | 'shellfire' 39 | fi 40 | } 41 | 42 | build_component() 43 | { 44 | local component="$core_variable_array_element" 45 | local buildComponentFunction="build_component_${component}" 46 | if ! core_functions_exists "$buildComponentFunction"; then 47 | core_exitError $core_commandLine_exitCode_USAGE "There is no build component '$component'" 48 | fi 49 | "$buildComponentFunction" "$@" 50 | } 51 | 52 | build_component_fatten() 53 | { 54 | build_fattenAndSwaddle 'fatten' "$build_relativePath"/tools/fatten fatten 55 | } 56 | 57 | build_component_swaddle() 58 | { 59 | build_fattenAndSwaddle 'swaddle' "$build_relativePath"/tools/swaddle swaddle 60 | } 61 | 62 | build_component_shellfire() 63 | { 64 | build_fattenAndSwaddle 'shellfire' "$build_relativePath" paths.d-helper 65 | } 66 | -------------------------------------------------------------------------------- /lib/shellfire/pathsd_helper/actions.functions: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | pathsd_helper_actions_createTemporaryFileOnce() 6 | { 7 | if core_variable_isUnset pathsd_helper_actions_temporaryFilePath; then 8 | local TMP_FILE 9 | core_temporaryFiles_newFileToRemoveOnExit 10 | pathsd_helper_actions_temporaryFilePath="$TMP_FILE" 11 | fi 12 | } 13 | 14 | pathsd_helper_actions_createDependencyFolder() 15 | { 16 | local folderPath="$pathsd_helper_pathsdPath"/"$action" 17 | if [ ! -d "$folderPath" ]; then 18 | mkdir -m 0755 -p "$folderPath" || core_exitError $core_commandLine_exitCode_CANTCREAT "Can't create dependency '$action' folder '$folderPath'" 19 | fi 20 | } 21 | 22 | pathsd_helper_actions_guardOverwrite() 23 | { 24 | local pathFile="$pathsd_helper_pathsdPath"/"$action"/"$programName".path 25 | if [ -f "$pathFile" ]; then 26 | core_message INFO "Not overwriting path file for dependency "$action" program '$programName'" 27 | return 0 28 | fi 29 | return 1 30 | } 31 | 32 | pathsd_helper_actions_writePathFileOverride() 33 | { 34 | local fullyQualfiedPackageName="$1" 35 | core_message INFO "Using alternative package '$fullyQualfiedPackageName' for program '$programName'" 36 | if [ $# -eq 2 ]; then 37 | local path="$2" 38 | else 39 | local path="/usr/bin/${programName}" 40 | fi 41 | pathsd_helper_actions_writePathFile "$programName" "$fullyQualfiedPackageName" "$path" 42 | } 43 | 44 | pathsd_helper_actions_writePathFile() 45 | { 46 | local programName="$1" 47 | local fullyQualfiedPackageName="$2" 48 | local absolutePath="$3" 49 | 50 | printf '%s %s %s\n' "$programName" "$fullyQualfiedPackageName" "$absolutePath" >"$pathsd_helper_pathsdPath"/"$action"/"$programName".path 51 | } 52 | -------------------------------------------------------------------------------- /lib/shellfire/pathsd_helper/actions/CentOS.functions: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | core_usesIn pathsd_helper actions 6 | 7 | core_dependency_requires 'CentOS' sudo yum 8 | pathsd_helper_actions_CentOS_start() 9 | { 10 | pathsd_helper_actions_createTemporaryFileOnce 11 | 12 | pathsd_helper_actions_createDependencyFolder 13 | 14 | if [ $(core_init_verbosity) -gt 0 ]; then 15 | pathsd_helper_actions_CentOS_yumVerbosity="" 16 | else 17 | pathsd_helper_actions_CentOS_yumVerbosity="--quiet" 18 | fi 19 | 20 | sudo -p "Please enter your password for sudo to update yum: " yum ${pathsd_helper_actions_CentOS_yumVerbosity} makecache 21 | 22 | _core_dependency_check_CentOS_installRepository_epel 23 | _core_dependency_check_CentOS_installRepository_repoforge 24 | } 25 | 26 | core_dependency_requires 'CentOS' repoquery sort uname 27 | pathsd_helper_actions_CentOS_operate() 28 | { 29 | if pathsd_helper_actions_guardOverwrite; then 30 | return 0 31 | fi 32 | 33 | case "$programName" in 34 | 35 | brew|brew-rmtree) 36 | core_message INFO "Ignoring program '$programName'" 37 | return 0 38 | ;; 39 | 40 | 7za|7z) 41 | pathsd_helper_actions_writePathFileOverride epel/p7zip 42 | return 0 43 | ;; 44 | 45 | lzip) 46 | pathsd_helper_actions_writePathFileOverride epel/lzip 47 | return 0 48 | ;; 49 | 50 | pixz|plzip|runzip|rzip) 51 | core_message WARN "Program '$programName' has an unofficial implementation with SUSE at http://ftp.opensuse.org/factory-snapshot/repo/oss/suse/x86_64/ . There is an OpenSUSE-release RPM there." 52 | return 0 53 | ;; 54 | 55 | 7zr|zopfli|zpaq) 56 | core_message WARN "Program '$programName' has no known package for CentOS et al" 57 | return 0 58 | ;; 59 | 60 | esac 61 | 62 | 63 | local pathPrefix 64 | local absolutePath 65 | local repositoryId 66 | local firstRepositoryId 67 | local packageName 68 | local firstPackageName 69 | local lineCount 70 | for pathPrefix in 'bin' 'sbin' 'usr/bin' 'usr/sbin' 71 | do 72 | # yum whatprovides creates trully shockingly badly formatted output, so we use repoquery 73 | absolutePath=/"${pathPrefix}"/"${programName}" 74 | repoquery --archlist="$(uname -m)" --qf='%{repoid}|%{name}' --file "$absolutePath" | sort -u >"$pathsd_helper_actions_temporaryFilePath" 75 | 76 | repositoryId='' 77 | firstRepositoryId='' 78 | packageName='' 79 | firstPackageName='' 80 | lineCount=0 81 | while IFS='|' read -r repositoryId packageName 82 | do 83 | lineCount=$((lineCount+1)) 84 | if [ $lineCount -eq 1 ]; then 85 | firstRepositoryId="$repositoryId" 86 | firstPackageName="$packageName" 87 | fi 88 | if [ "$repositoryId" = 'base' ]; then 89 | break 90 | fi 91 | done <"$pathsd_helper_actions_temporaryFilePath" 92 | 93 | case $lineCount in 94 | 95 | 0) 96 | continue 97 | ;; 98 | 99 | 1) 100 | case "$firstRepositoryId" in 101 | 102 | base|updates|extras|centosplus|base-debuginfo|fasttrack|centosplus-source) 103 | pathsd_helper_actions_writePathFile "$programName" "$firstPackageName" "$absolutePath" 104 | ;; 105 | 106 | epel) 107 | pathsd_helper_actions_writePathFile "$programName" epel/"$firstPackageName" "$absolutePath" 108 | ;; 109 | 110 | rpmforge|repoforge) 111 | pathsd_helper_actions_writePathFile "$programName" repoforge/"$firstPackageName" "$absolutePath" 112 | ;; 113 | 114 | *) 115 | core_message WARN "Unknown repository id '$firstRepositoryId' for progam '$programName' for path '$absolutePath' for package '$firstPackageName'" 116 | ;; 117 | 118 | esac 119 | 120 | return 0 121 | ;; 122 | 123 | *) 124 | core_message WARN "Too many packages found for progam '$programName' for path '$absolutePath'" 125 | return 0 126 | ;; 127 | 128 | esac 129 | done 130 | 131 | core_message WARN "No packages found for progam '$programName'" 132 | } 133 | 134 | pathsd_helper_actions_CentOS_finish() 135 | { 136 | : 137 | } 138 | -------------------------------------------------------------------------------- /lib/shellfire/pathsd_helper/actions/Debian.functions: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | core_usesIn pathsd_helper actions 6 | 7 | core_dependency_requires 'Debian' apt-file 8 | pathsd_helper_actions_Debian_start() 9 | { 10 | pathsd_helper_actions_createTemporaryFileOnce 11 | 12 | pathsd_helper_actions_createDependencyFolder 13 | 14 | set +f 15 | set -- "$HOME"/.cache/apt-file/* 16 | set -f 17 | 18 | local updateAptFileCache 19 | case $# in 20 | 21 | 0) 22 | updateAptFileCache=1 23 | ;; 24 | 25 | 1) 26 | if [ ! -f "$1" ]; then 27 | updateAptFileCache=1 28 | else 29 | updateAptFileCache=0 30 | fi 31 | ;; 32 | 33 | *) 34 | updateAptFileCache=0 35 | ;; 36 | 37 | esac 38 | 39 | if [ $updateAptFileCache -eq 1 ]; then 40 | core_message NOTICE "Updating apt-file cache, may be quite slow" 41 | apt-file update 42 | fi 43 | } 44 | 45 | pathsd_helper_actions_Debian_operate() 46 | { 47 | if pathsd_helper_actions_guardOverwrite; then 48 | return 0 49 | fi 50 | 51 | case "$programName" in 52 | 53 | awk) 54 | pathsd_helper_actions_writePathFileOverride 'gawk' '/usr/bin/gawk' 55 | return 0 56 | ;; 57 | 58 | brew|brew-rmtree) 59 | core_message INFO "Ignoring program '$programName'" 60 | return 0 61 | ;; 62 | 63 | 'c++filt') 64 | pathsd_helper_actions_writePathFileOverride 'binutils' 65 | return 0 66 | ;; 67 | 68 | addr2line|ar|nm|objcopy|objdump|ranlib|readelf|size|strings|strip) 69 | pathsd_helper_actions_writePathFileOverride 'binutils-multiarch' 70 | return 0 71 | ;; 72 | 73 | uptime) 74 | pathsd_helper_actions_writePathFileOverride 'procps' 75 | return 0 76 | ;; 77 | 78 | # Note, not fakeroot-ng, which needs porting to Mac OS X Homebrew 79 | fakeroot) 80 | pathsd_helper_actions_writePathFileOverride 'fakeroot' '/usr/bin/fakeroot-sysv' 81 | return 0 82 | ;; 83 | 84 | zcat|zcmp|zdiff|zegrep|zfgrep|zgrep) 85 | pathsd_helper_actions_writePathFileOverride 'gzip' "/bin/${programName}" 86 | return 0 87 | ;; 88 | 89 | lzcat|lzcmp|lzdiff|lzegrep|lzfgrep|lzgrep|lzless|lzma|lzmore|unlzma) 90 | pathsd_helper_actions_writePathFileOverride 'xz-utils' 91 | return 0 92 | ;; 93 | 94 | # Also unrar-free 95 | unrar) 96 | pathsd_helper_actions_writePathFileOverride 'unrar' 97 | return 0 98 | ;; 99 | 100 | # Ubuntu doesn't install these symlinks that chanhge pbzip2's behaviour; we fake them as we create a false path full of symlinks. 101 | pbunzip2|pbzcat) 102 | pathsd_helper_actions_writePathFileOverride 'pbzip2' "/usr/bin/pbzip2" 103 | return 0 104 | ;; 105 | 106 | esac 107 | 108 | 109 | local pathPrefix 110 | local absolutePath 111 | local lineCount 112 | local packageName 113 | local firstPackageName 114 | for pathPrefix in 'bin' 'sbin' 'usr/bin' 'usr/sbin' 115 | do 116 | absolutePath=/"${pathPrefix}"/"${programName}" 117 | # Irritaingly, apt-file does not use a non-zero exit code for no matches; it returns a blank line for no matches; it outputs a trailing blank line if there are matches 118 | apt-file --non-interactive --package-only --regexp search "^${absolutePath}$" >"$pathsd_helper_actions_temporaryFilePath" 119 | lineCount=0 120 | packageName='' 121 | firstPackageName='' 122 | while IFS='' read -r packageName 123 | do 124 | lineCount=$((lineCount+1)) 125 | if [ $lineCount -eq 1 ]; then 126 | firstPackageName="$packageName" 127 | fi 128 | done <"$pathsd_helper_actions_temporaryFilePath" 129 | 130 | case $lineCount in 131 | 132 | 0) 133 | continue 134 | ;; 135 | 136 | 1) 137 | # Irritaingly, apt-file returns a blank line for no matches 138 | if [ -z "$firstPackageName" ]; then 139 | continue 140 | fi 141 | 142 | pathsd_helper_actions_writePathFile "$programName" "$firstPackageName" "$absolutePath" 143 | return 0 144 | ;; 145 | 146 | 2) 147 | core_message WARN "Too many packages found for progam '$programName' for path '$absolutePath' using apt-file --non-interactive --package-only --regexp search '^${absolutePath}$'" 148 | return 0 149 | ;; 150 | 151 | esac 152 | done 153 | 154 | core_message WARN "No packages found for progam '$programName'" 155 | } 156 | 157 | pathsd_helper_actions_Debian_finish() 158 | { 159 | : 160 | } 161 | -------------------------------------------------------------------------------- /lib/shellfire/pathsd_helper/execute.functions: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | pathsd_helper_execute_makePathsAbsolute() 6 | { 7 | pushd "$pathsd_helper_pathsdPath" 8 | 9 | pathsd_helper_pathsdPath="$(pwd)" 10 | 11 | popd 12 | } 13 | 14 | pathsd_helper_execute_setDependencyPath() 15 | { 16 | pathsd_helper_execute_dependencyPath="$pathsd_helper_pathsdPath"/"$pathsd_helper_dependencyCheck" 17 | } 18 | 19 | pathsd_helper_execute_guardDependencyPath() 20 | { 21 | if ! core_path_isReadableAndSearchableFolderPath "$pathsd_helper_execute_dependencyPath"; then 22 | core_exit $core_commandLine_exitCode_CONFIG "The combination of --dependency-check and --pathsd-path ('$pathsd_helper_execute_dependencyPath') is not an extant, readable and searchable directory" 23 | fi 24 | } 25 | 26 | pathsd_helper_execute_setExtractFunction() 27 | { 28 | _pathsd_helper_execute_dependencyCheckFunction="core_dependency_check_${pathsd_helper_dependencyCheck}_extractUnqualifiedPackageName" 29 | } 30 | 31 | pathsd_helper_execute_actions() 32 | { 33 | local action 34 | for action in "$@" 35 | do 36 | if [ "$action" != "$core_dependency_packageManager" ]; then 37 | continue 38 | fi 39 | 40 | pathsd_helper_actions_${action}_start 41 | pathsd_helper_execute_iterateOverPathFiles 42 | pathsd_helper_actions_${action}_finish 43 | done 44 | } 45 | 46 | pathsd_helper_execute_iterateOverPathFiles() 47 | { 48 | local pathFile 49 | local programName 50 | # eg including potential Homebrew tap 51 | local fullyQualifiedPackageName 52 | local binaryPath 53 | local unqualifiedPackageName 54 | 55 | pushd "$pathsd_helper_execute_dependencyPath" 56 | set +f 57 | for pathFile in *.path 58 | do 59 | set -f 60 | if [ ! -f "$pathFile" ]; then 61 | continue 62 | fi 63 | 64 | IFS=' ' read -r programName fullyQualifiedPackageName binaryPath <"$pathFile" 65 | unqualifiedPackageName="$(${_pathsd_helper_execute_dependencyCheckFunction} "$fullyQualifiedPackageName")" 66 | 67 | if [ "$programName".path != "$pathFile" ]; then 68 | core_message WARN "Path file '$pathFile' has a mismatched program name ('$programName')" 69 | continue 70 | fi 71 | 72 | pathsd_helper_actions_${action}_operate 73 | done 74 | set -f 75 | popd 76 | } 77 | -------------------------------------------------------------------------------- /lib/shellfire/pathsd_helper/validate.functions: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | pathsd_helper_validate_dependencyCheck() 6 | { 7 | local code=$1 8 | local category="$2" 9 | local name="$3" 10 | local value="$4" 11 | 12 | local functionThatMustExist="core_dependency_check_${value}_extractUnqualifiedPackageName" 13 | 14 | if core_functions_exists "$functionThatMustExist"; then 15 | return 0 16 | fi 17 | 18 | core_validate_exit "The $category '$name' specifies a dependency '$value' which isn't supported" 19 | } 20 | 21 | pathsd_helper_validate_pathsdPath() 22 | { 23 | core_validate_folderPathReadableAndSearchable "$@" 24 | 25 | local code=$1 26 | local category="$2" 27 | local name="$3" 28 | local value="$4" 29 | 30 | if [ "$(core_compatibility_basename "$value")" != 'paths.d' ]; then 31 | core_validate_exit "The $category '$name' specifies a path '$value' which doesn't have a leaf folder called 'paths.d'" 32 | fi 33 | } 34 | -------------------------------------------------------------------------------- /paths.d-helper: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 3 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 4 | 5 | 6 | _program() 7 | { 8 | core_usesIn pathsd_helper validate execute 9 | core_usesIn pathsd_helper/actions Debian CentOS 10 | 11 | pathsd_helper_entrypoint() 12 | { 13 | pathsd_helper_execute_makePathsAbsolute 14 | pathsd_helper_execute_setDependencyPath 15 | pathsd_helper_execute_guardDependencyPath 16 | pathsd_helper_execute_setExtractFunction 17 | pathsd_helper_execute_actions Debian CentOS 18 | } 19 | } 20 | 21 | _program_name='paths.d-helper' 22 | _program_namespace='pathsd_helper' 23 | _program_version='unversioned' 24 | _program_package_or_build='' 25 | _program_path="$([ "${_program_fattening_program_path+set}" = 'set' ] && printf '%s\n' "$_program_fattening_program_path" || ([ "${0%/*}" = "${0}" ] && printf '%s\n' '.' || printf '%s\n' "${0%/*}"))" 26 | _program_libPath="${_program_path}/lib" 27 | _program_etcPath="${_program_path}/etc" 28 | _program_entrypoint='pathsd_helper_entrypoint' 29 | 30 | _program_commandLine_parseInitialise() 31 | { 32 | pathsd_helper_dependencyCheck_default='Homebrew' 33 | pathsd_helper_pathsdPath_default="$(pwd)" 34 | } 35 | 36 | _program_commandLine_helpMessage() 37 | { 38 | _program_commandLine_helpMessage_usage="[OPTION]..." 39 | _program_commandLine_helpMessage_description="Produces a list of packages for a dependency check in paths.d" 40 | _program_commandLine_helpMessage_options=" 41 | -d, --dependency-check DEP Dependency check DEP, eg Debian. 42 | Defaults to '$pathsd_helper_dependencyCheck_default'. 43 | -p, --pathsd-path PATH PATH parenting 'etc/$core_libraryName/paths.d' 44 | Defaults to current working directory:- 45 | $pathsd_helper_pathsdPath_default" 46 | _program_commandLine_helpMessage_optionsSpacing=' ' 47 | _program_commandLine_helpMessage_configurationKeys=" 48 | pathsd_helper_dependencyCheck Equivalent to --dependency-check 49 | pathsd_helper_pathsdPath Equivalent to --pathsd-path 50 | " 51 | _program_commandLine_helpMessage_examples=" 52 | ${_program_name} -d Debian 53 | " 54 | } 55 | 56 | _program_commandLine_optionExists() 57 | { 58 | case "$optionName" in 59 | 60 | d|dependency-check) 61 | echo 'yes-argumented' 62 | ;; 63 | 64 | p|pathsd-path) 65 | echo 'yes-argumented' 66 | ;; 67 | 68 | *) 69 | echo 'no' 70 | ;; 71 | 72 | esac 73 | } 74 | 75 | _program_commandLine_processOptionWithArgument() 76 | { 77 | case "$optionName" in 78 | 79 | d|dependency-check) 80 | pathsd_helper_validate_dependencyCheck $core_commandLine_exitCode_USAGE 'option' "$optionNameIncludingHyphens" "$optionValue" 81 | pathsd_helper_dependencyCheck="$optionValue" 82 | ;; 83 | 84 | p|pathsd-path) 85 | pathsd_helper_validate_pathsdPath $core_commandLine_exitCode_USAGE 'option' "$optionNameIncludingHyphens" "$optionValue" 86 | pathsd_helper_pathsdPath="$optionValue" 87 | ;; 88 | 89 | esac 90 | } 91 | 92 | _program_commandLine_validate() 93 | { 94 | if core_variable_isSet pathsd_helper_dependencyCheck; then 95 | pathsd_helper_validate_dependencyCheck $core_commandLine_exitCode_CONFIG 'configuration setting' 'pathsd_helper_dependencyCheck' "$pathsd_helper_dependencyCheck" 96 | else 97 | core_message INFO "Defaulting --dependency-check to '$pathsd_helper_dependencyCheck_default'" 98 | pathsd_helper_dependencyCheck="$pathsd_helper_dependencyCheck_default" 99 | pathsd_helper_validate_dependencyCheck $core_commandLine_exitCode_CONFIG 'default' 'pathsd_helper_dependencyCheck' "$pathsd_helper_dependencyCheck" 100 | fi 101 | 102 | if core_variable_isSet pathsd_helper_pathsdPath; then 103 | pathsd_helper_validate_pathsdPath $core_commandLine_exitCode_CONFIG 'configuration setting' 'pathsd_helper_pathsdPath' "$pathsd_helper_pathsdPath" 104 | else 105 | core_message INFO "Defaulting --paths-path to '$pathsd_helper_pathsdPath_default'" 106 | pathsd_helper_pathsdPath="$pathsd_helper_pathsdPath_default" 107 | pathsd_helper_validate_pathsdPath $core_commandLine_exitCode_CONFIG 'default' 'pathsd_helper_pathsdPath' "$pathsd_helper_pathsdPath" 108 | fi 109 | } 110 | 111 | . "$_program_libPath"/shellfire/core/init.functions "$@" 112 | -------------------------------------------------------------------------------- /swaddling/shellfire/.gitignore: -------------------------------------------------------------------------------- 1 | body 2 | -------------------------------------------------------------------------------- /swaddling/shellfire/deb/deb.conf: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | configure swaddle_deb depends dash 6 | configure swaddle_deb compression lzma 7 | -------------------------------------------------------------------------------- /swaddling/shellfire/package.conf: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | configure swaddle_package description \ 6 | "shellfire is a simple framework for creatings 7 | shell script based applications. 8 | " 9 | -------------------------------------------------------------------------------- /swaddling/shellfire/rpm/rpm.conf: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | -------------------------------------------------------------------------------- /swaddling/shellfire/skeleton/all/usr/bin/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory except .gitignore 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /swaddling/shellfire/tar/tar.conf: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | configure swaddle_tar compressions gzip 6 | configure swaddle_tar compressions bzip2 7 | configure swaddle_tar compressions xz 8 | configure swaddle_tar compressions lzip 9 | -------------------------------------------------------------------------------- /swaddling/swaddling.conf: -------------------------------------------------------------------------------- 1 | # This file is part of shellfire. It is subject to the licence terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. No part of shellfire, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file. 2 | # Copyright © 2014-2015 The developers of shellfire. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/shellfire-dev/shellfire/master/COPYRIGHT. 3 | 4 | 5 | configure swaddle host_base_url 'https://shellfire-dev.github.io/shellfire/download' 6 | configure swaddle bugs_url 'https://github.com/shellfire-dev/shellfire/issues' 7 | configure swaddle maintainer_name 'Raphael Cohn' 8 | configure swaddle maintainer_comment 'Package Signing Key' 9 | configure swaddle maintainer_email 'raphael.cohn@stormmq.com' 10 | configure swaddle sign yes 11 | 12 | configure swaddle vendor stormmq 13 | -------------------------------------------------------------------------------- /tools/continuous-integration.travis.yaml: -------------------------------------------------------------------------------- 1 | language: c 2 | compiler: 3 | - gcc 4 | branches: 5 | only: 6 | - master 7 | - deployment 8 | script: "./build --verbose 2" 9 | notifications: 10 | email: 11 | on_success: change 12 | on_failure: always 13 | #http://docs.travis-ci.com/user/how-to-skip-a-build/ 14 | #http://docs.travis-ci.com/user/encrypting-files/ 15 | #http://docs.travis-ci.com/user/deployment/custom/ (to a git deploy repo) 16 | #http://docs.travis-ci.com/user/uploading-artifacts/ (deploy built artifacts to S3) 17 | after_success: 18 | - ./builder/deployment/push-to-git 19 | deploy: 20 | provider: releases 21 | api_key: 22 | secure: E/uIFl9/Cs1iiur+dUqjapMxHd/PjkbPghDXjlrlaW9rK4vg/4Kji6Bu9/udmoHtFEEMZ2+L3ovzX1f6lpm2CdSJ0+8HMvaWu8sfHlC0bmHnwuqs1BIgIndfehcNckkZYVfax2fxQM8w/LzDMhRA9Wf82IzRRLJahSkf1UgEVic= 23 | file: "file-to-upload.tar" 24 | on: 25 | repo: shellfire-dev/shellfire 26 | branch: deployment 27 | tags: true 28 | -------------------------------------------------------------------------------- /tools/miscellany/licenses.numbers: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellfire-dev/shellfire/d13247076cd8a511027bacb268c39ba1c113b5cb/tools/miscellany/licenses.numbers -------------------------------------------------------------------------------- /tools/miscellany/logo.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shellfire-dev/shellfire/d13247076cd8a511027bacb268c39ba1c113b5cb/tools/miscellany/logo.key --------------------------------------------------------------------------------