ronin-repos 0.1.0 → 0.2.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.document +0 -1
- data/.github/workflows/ruby.yml +16 -1
- data/.gitignore +1 -0
- data/.rubocop.yml +21 -0
- data/ChangeLog.md +28 -1
- data/Gemfile +11 -5
- data/README.md +19 -5
- data/Rakefile +12 -2
- data/bin/ronin-repos +6 -7
- data/data/completions/ronin-repos +139 -0
- data/data/completions/ronin-repos.yml +10 -0
- data/data/templates/repo/README.md.erb +1 -1
- data/gemspec.yml +11 -2
- data/lib/ronin/repos/cache_dir.rb +6 -7
- data/lib/ronin/repos/class_dir.rb +21 -14
- data/lib/ronin/repos/cli/command.rb +5 -3
- data/lib/ronin/repos/cli/commands/completion.rb +61 -0
- data/lib/ronin/repos/cli/commands/install.rb +7 -3
- data/lib/ronin/repos/cli/commands/list.rb +15 -18
- data/lib/ronin/repos/cli/commands/new.rb +7 -3
- data/lib/ronin/repos/cli/commands/purge.rb +17 -2
- data/lib/ronin/repos/cli/commands/remove.rb +1 -1
- data/lib/ronin/repos/cli/commands/show.rb +93 -0
- data/lib/ronin/repos/cli/commands/update.rb +2 -2
- data/lib/ronin/repos/cli.rb +5 -4
- data/lib/ronin/repos/exceptions.rb +4 -4
- data/lib/ronin/repos/repository.rb +33 -4
- data/lib/ronin/repos/root.rb +1 -1
- data/lib/ronin/repos/version.rb +2 -2
- data/lib/ronin/repos.rb +19 -5
- data/man/ronin-repos-completion.1 +76 -0
- data/man/ronin-repos-completion.1.md +78 -0
- data/man/ronin-repos-install.1 +27 -37
- data/man/ronin-repos-install.1.md +22 -15
- data/man/ronin-repos-list.1 +27 -33
- data/man/ronin-repos-list.1.md +22 -15
- data/man/ronin-repos-new.1 +17 -18
- data/man/ronin-repos-new.1.md +34 -0
- data/man/ronin-repos-purge.1 +26 -33
- data/man/ronin-repos-purge.1.md +20 -13
- data/man/ronin-repos-remove.1 +23 -35
- data/man/ronin-repos-remove.1.md +18 -14
- data/man/ronin-repos-show.1 +48 -0
- data/man/ronin-repos-show.1.md +48 -0
- data/man/ronin-repos-update.1 +26 -36
- data/man/ronin-repos-update.1.md +22 -15
- data/man/ronin-repos.1 +43 -31
- data/man/ronin-repos.1.md +35 -11
- data/ronin-repos.gemspec +4 -3
- data/scripts/setup +58 -0
- metadata +19 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b43c676948f9c9db4f57ccea422578e0704a9d7fb1514753b7493fa6e199c27f
         | 
| 4 | 
            +
              data.tar.gz: 5fb086f975e9f32d318ecffea62277b925637e7cb1ae5a0489bee86be5fcc052
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6a91bc01c3266d23b53f27270537fafe9d2c71db686f83e13aac733ac8fc5ee23a18c2c5c4b736ca42297baff252fe376ef5560c9eae1f99c6a41a024213f8ea
         | 
| 7 | 
            +
              data.tar.gz: 85450d4e6c41a38b7272d440f95d0fad05bb8cd3bad14e7ded9e10f6348f22d789c86abc562febb6b63bc008669debf497c150d16cccc725f65c331f9de4becc
         | 
    
        data/.document
    CHANGED
    
    
    
        data/.github/workflows/ruby.yml
    CHANGED
    
    | @@ -12,11 +12,12 @@ jobs: | |
| 12 12 | 
             
                      - '3.0'
         | 
| 13 13 | 
             
                      - '3.1'
         | 
| 14 14 | 
             
                      - '3.2'
         | 
| 15 | 
            +
                      - '3.3'
         | 
| 15 16 | 
             
                      - jruby
         | 
| 16 17 | 
             
                      - truffleruby
         | 
| 17 18 | 
             
                name: Ruby ${{ matrix.ruby }}
         | 
| 18 19 | 
             
                steps:
         | 
| 19 | 
            -
                  - uses: actions/checkout@ | 
| 20 | 
            +
                  - uses: actions/checkout@v4
         | 
| 20 21 | 
             
                  - name: Set up Ruby
         | 
| 21 22 | 
             
                    uses: ruby/setup-ruby@v1
         | 
| 22 23 | 
             
                    with:
         | 
| @@ -26,3 +27,17 @@ jobs: | |
| 26 27 | 
             
                    run: bundle install --jobs 4 --retry 3
         | 
| 27 28 | 
             
                  - name: Run tests
         | 
| 28 29 | 
             
                    run: bundle exec rake test
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              # rubocop linting
         | 
| 32 | 
            +
              rubocop:
         | 
| 33 | 
            +
                runs-on: ubuntu-latest
         | 
| 34 | 
            +
                steps:
         | 
| 35 | 
            +
                  - uses: actions/checkout@v4
         | 
| 36 | 
            +
                  - name: Set up Ruby
         | 
| 37 | 
            +
                    uses: ruby/setup-ruby@v1
         | 
| 38 | 
            +
                    with:
         | 
| 39 | 
            +
                      ruby-version: 3.0
         | 
| 40 | 
            +
                  - name: Install dependencies
         | 
| 41 | 
            +
                    run: bundle install --jobs 4 --retry 3
         | 
| 42 | 
            +
                  - name: Run rubocop
         | 
| 43 | 
            +
                    run: bundle exec rubocop --parallel
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            AllCops:
         | 
| 2 | 
            +
              NewCops: enable
         | 
| 3 | 
            +
              SuggestExtensions: false
         | 
| 4 | 
            +
              TargetRubyVersion: 3.1
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            inherit_gem:
         | 
| 7 | 
            +
              rubocop-ronin: rubocop.yml
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            #
         | 
| 10 | 
            +
            # ronin-repos specific exceptions
         | 
| 11 | 
            +
            #
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            Lint/EmptyFile:
         | 
| 14 | 
            +
              Exclude:
         | 
| 15 | 
            +
                - 'spec/fixtures/class_dir/file1.rb'
         | 
| 16 | 
            +
                - 'spec/fixtures/class_dir/file2.rb'
         | 
| 17 | 
            +
                - 'spec/fixtures/class_dir/only_in_class_dir.rb'
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            Style/MapIntoArray:
         | 
| 20 | 
            +
              Exclude:
         | 
| 21 | 
            +
                - 'spec/cache_dir_spec.rb'
         | 
    
        data/ChangeLog.md
    CHANGED
    
    | @@ -1,4 +1,31 @@ | |
| 1 | 
            -
            ### 0. | 
| 1 | 
            +
            ### 0.2.0 / 2024-XX-XX
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Added {Ronin::Repos::Repository#url}.
         | 
| 4 | 
            +
            * Added {Ronin::Repos::Repository#last_updated_at}.
         | 
| 5 | 
            +
            * Added {Ronin::Repos.cache_dir}.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            #### CLI
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * Added the `ronin-repos show` command.
         | 
| 10 | 
            +
            * Changed `ronin-repos list` to fuzzy match repo names.
         | 
| 11 | 
            +
            * Changed `ronin-repos new` to also create empty `exploits/`, `payloads/`,
         | 
| 12 | 
            +
              `recon/`, and `brute/`.
         | 
| 13 | 
            +
            * Added the `ronin-repos completion` command to install shell completion files
         | 
| 14 | 
            +
              for all `ronin-repos` commands for Bash and Zsh shells.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ### 0.1.1 / 2023-06-09
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            * Fixed a bug in {Ronin::Repos::ClassDir::ClassMethods#list_files} where the
         | 
| 19 | 
            +
              {Ronin::Repos::ClassDir::ClassMethods#repo_class_dir repo_class_dir} was not
         | 
| 20 | 
            +
              being removed from paths.
         | 
| 21 | 
            +
            * Documentation fixes and improvements.
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            #### CLI
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            * Multiple bug fixes to the `ronin-repos install` command.
         | 
| 26 | 
            +
            * Add missing man-page for the `ronin-repos new` command.
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            ### 0.1.0 / 2023-02-01
         | 
| 2 29 |  | 
| 3 30 | 
             
            * Initial release:
         | 
| 4 31 | 
             
              * Supports installing any [Git][git] repository.
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            source 'https://rubygems.org'
         | 
| 2 4 |  | 
| 3 5 | 
             
            gemspec
         | 
| @@ -7,10 +9,10 @@ platform :jruby do | |
| 7 9 | 
             
            end
         | 
| 8 10 |  | 
| 9 11 | 
             
            # Ronin dependencies:
         | 
| 10 | 
            -
            # gem 'ronin-core', '~> 0. | 
| 12 | 
            +
            # gem 'ronin-core', '~> 0.2', github: 'ronin-rb/ronin-core',
         | 
| 11 13 | 
             
            #                             branch: 'main'
         | 
| 12 14 |  | 
| 13 | 
            -
            # gem 'command_kit', '~> 0. | 
| 15 | 
            +
            # gem 'command_kit', '~> 0.5', github: 'postmodern/command_kit.rb',
         | 
| 14 16 | 
             
            #                              branch: 'main'
         | 
| 15 17 |  | 
| 16 18 | 
             
            group :development do
         | 
| @@ -20,13 +22,17 @@ group :development do | |
| 20 22 | 
             
              gem 'simplecov',       '~> 0.20'
         | 
| 21 23 |  | 
| 22 24 | 
             
              gem 'kramdown',        '~> 2.0'
         | 
| 23 | 
            -
              gem 'kramdown-man',    '~> 0 | 
| 25 | 
            +
              gem 'kramdown-man',    '~> 1.0'
         | 
| 24 26 |  | 
| 25 27 | 
             
              gem 'redcarpet',       platform: :mri
         | 
| 26 28 | 
             
              gem 'yard',            '~> 0.9'
         | 
| 27 29 | 
             
              gem 'yard-spellcheck', require: false
         | 
| 28 30 |  | 
| 29 31 | 
             
              gem 'dead_end',        require: false
         | 
| 30 | 
            -
              gem 'sord',            require: false,  | 
| 31 | 
            -
              gem 'stackprof',       require: false,  | 
| 32 | 
            +
              gem 'sord',            require: false, platform: :mri
         | 
| 33 | 
            +
              gem 'stackprof',       require: false, platform: :mri
         | 
| 34 | 
            +
              gem 'rubocop',         require: false, platform: :mri
         | 
| 35 | 
            +
              gem 'rubocop-ronin',   require: false, platform: :mri
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              gem 'command_kit-completion', '~> 0.2', require: false
         | 
| 32 38 | 
             
            end
         | 
    
        data/README.md
    CHANGED
    
    | @@ -9,13 +9,23 @@ | |
| 9 9 | 
             
            * [Issues](https://github.com/ronin-rb/ronin-repos/issues)
         | 
| 10 10 | 
             
            * [Documentation](https://ronin-rb.dev/docs/ronin-repos/frames)
         | 
| 11 11 | 
             
            * [Discord](https://discord.gg/6WAb3PsVX9) |
         | 
| 12 | 
            -
              [Twitter](https://twitter.com/ronin_rb) |
         | 
| 13 12 | 
             
              [Mastodon](https://infosec.exchange/@ronin_rb)
         | 
| 14 13 |  | 
| 15 14 | 
             
            ## Description
         | 
| 16 15 |  | 
| 17 16 | 
             
            ronin-repos provides a repository system for installing, managing, and accessing
         | 
| 18 | 
            -
            third-party git repositories,  | 
| 17 | 
            +
            third-party git repositories, that can contain additional Ruby code or other
         | 
| 18 | 
            +
            data.
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            Third-party git repositories can be used to extend parts of Ronin. Other Ronin
         | 
| 21 | 
            +
            libraries can then list and load additional third-party Ruby classes from
         | 
| 22 | 
            +
            specific directories within the installed third-party repos:
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            * `exploits/` - may contain additional exploits for [ronin-exploits].
         | 
| 25 | 
            +
            * `payloads/` - may contain additional payloads for [ronin-payloads].
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            **tl;dr** ronin-repos is essentially a decentralized plugin system for Ronin
         | 
| 28 | 
            +
            using git repos.
         | 
| 19 29 |  | 
| 20 30 | 
             
            ronin-repos is part of the [ronin-rb] project, a toolkit for security research
         | 
| 21 31 | 
             
            and development.
         | 
| @@ -40,12 +50,14 @@ Arguments: | |
| 40 50 | 
             
                [ARGS ...]                       Additional arguments for the command
         | 
| 41 51 |  | 
| 42 52 | 
             
            Commands:
         | 
| 53 | 
            +
                completion
         | 
| 43 54 | 
             
                help
         | 
| 44 55 | 
             
                install
         | 
| 45 56 | 
             
                list, ls
         | 
| 46 57 | 
             
                new
         | 
| 47 58 | 
             
                purge
         | 
| 48 59 | 
             
                remove, rm
         | 
| 60 | 
            +
                show, info
         | 
| 49 61 | 
             
                update, up
         | 
| 50 62 | 
             
            ```
         | 
| 51 63 |  | 
| @@ -111,7 +123,7 @@ Rnnin::Repos.glob("wordlists/*.txt") | |
| 111 123 | 
             
            ## Requirements
         | 
| 112 124 |  | 
| 113 125 | 
             
            * [Ruby] >= 3.0.0
         | 
| 114 | 
            -
            * [ronin-core] ~> 0. | 
| 126 | 
            +
            * [ronin-core] ~> 0.2
         | 
| 115 127 |  | 
| 116 128 | 
             
            ## Install
         | 
| 117 129 |  | 
| @@ -130,7 +142,7 @@ gem 'ronin-repos', '~> 0.1' | |
| 130 142 | 
             
            1. [Fork It!](https://github.com/ronin-rb/ronin-repos/fork)
         | 
| 131 143 | 
             
            2. Clone It!
         | 
| 132 144 | 
             
            3. `cd ronin-repos`
         | 
| 133 | 
            -
            4. ` | 
| 145 | 
            +
            4. `./scripts/server`
         | 
| 134 146 | 
             
            5. `git checkout -b my_feature`
         | 
| 135 147 | 
             
            6. Code It!
         | 
| 136 148 | 
             
            7. `bundle exec rake spec`
         | 
| @@ -138,7 +150,7 @@ gem 'ronin-repos', '~> 0.1' | |
| 138 150 |  | 
| 139 151 | 
             
            ## License
         | 
| 140 152 |  | 
| 141 | 
            -
            Copyright (c) 2021- | 
| 153 | 
            +
            Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
         | 
| 142 154 |  | 
| 143 155 | 
             
            ronin-repos is free software: you can redistribute it and/or modify
         | 
| 144 156 | 
             
            it under the terms of the GNU Lesser General Public License as published
         | 
| @@ -158,3 +170,5 @@ along with ronin-repos.  If not, see <https://www.gnu.org/licenses/>. | |
| 158 170 | 
             
            [Ruby]: https://www.ruby-lang.org
         | 
| 159 171 | 
             
            [git]: https://git-scm.com/
         | 
| 160 172 | 
             
            [ronin-core]: https://github.com/ronin-rb/ronin-core#readme
         | 
| 173 | 
            +
            [ronin-exploits]: https://github.com/ronin-rb/ronin-exploits#readme
         | 
| 174 | 
            +
            [ronin-payloads]: https://github.com/ronin-rb/ronin-payloads#readme
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,11 +1,11 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            begin
         | 
| 4 4 | 
             
              require 'bundler'
         | 
| 5 5 | 
             
            rescue LoadError => e
         | 
| 6 6 | 
             
              warn e.message
         | 
| 7 7 | 
             
              warn "Run `gem install bundler` to install Bundler"
         | 
| 8 | 
            -
              exit | 
| 8 | 
            +
              exit(-1)
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 11 | 
             
            begin
         | 
| @@ -32,3 +32,13 @@ task :docs => :yard | |
| 32 32 |  | 
| 33 33 | 
             
            require 'kramdown/man/task'
         | 
| 34 34 | 
             
            Kramdown::Man::Task.new
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            require 'command_kit/completion/task'
         | 
| 37 | 
            +
            CommandKit::Completion::Task.new(
         | 
| 38 | 
            +
              class_file:  'ronin/repos/cli',
         | 
| 39 | 
            +
              class_name:  'Ronin::Repos::CLI',
         | 
| 40 | 
            +
              input_file:  'data/completions/ronin-repos.yml',
         | 
| 41 | 
            +
              output_file: 'data/completions/ronin-repos'
         | 
| 42 | 
            +
            )
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            task :setup => %w[man command_kit:completion]
         | 
    
        data/bin/ronin-repos
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 2 3 | 
             
            #
         | 
| 3 4 | 
             
            # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
         | 
| 4 5 | 
             
            #
         | 
| @@ -21,13 +22,11 @@ | |
| 21 22 | 
             
            root = File.expand_path(File.join(__dir__,'..'))
         | 
| 22 23 | 
             
            if File.file?(File.join(root,'Gemfile.lock'))
         | 
| 23 24 | 
             
              Dir.chdir(root) do
         | 
| 24 | 
            -
                 | 
| 25 | 
            -
             | 
| 26 | 
            -
                 | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
                  exit -1
         | 
| 30 | 
            -
                end
         | 
| 25 | 
            +
                require 'bundler/setup'
         | 
| 26 | 
            +
              rescue LoadError => e
         | 
| 27 | 
            +
                warn e.message
         | 
| 28 | 
            +
                warn "Run `gem install bundler` to install Bundler"
         | 
| 29 | 
            +
                exit(-1)
         | 
| 31 30 | 
             
              end
         | 
| 32 31 | 
             
            end
         | 
| 33 32 |  | 
| @@ -0,0 +1,139 @@ | |
| 1 | 
            +
            # ronin-repos completion                                   -*- shell-script -*-
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # This bash completions script was generated by
         | 
| 4 | 
            +
            # completely (https://github.com/dannyben/completely)
         | 
| 5 | 
            +
            # Modifying it manually is not recommended
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            _ronin-repos_completions_filter() {
         | 
| 8 | 
            +
              local words="$1"
         | 
| 9 | 
            +
              local cur=${COMP_WORDS[COMP_CWORD]}
         | 
| 10 | 
            +
              local result=()
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              if [[ "${cur:0:1}" == "-" ]]; then
         | 
| 13 | 
            +
                echo "$words"
         | 
| 14 | 
            +
              
         | 
| 15 | 
            +
              else
         | 
| 16 | 
            +
                for word in $words; do
         | 
| 17 | 
            +
                  [[ "${word:0:1}" != "-" ]] && result+=("$word")
         | 
| 18 | 
            +
                done
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                echo "${result[*]}"
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              fi
         | 
| 23 | 
            +
            }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            _ronin-repos_completions() {
         | 
| 26 | 
            +
              local cur=${COMP_WORDS[COMP_CWORD]}
         | 
| 27 | 
            +
              local compwords=("${COMP_WORDS[@]:1:$COMP_CWORD-1}")
         | 
| 28 | 
            +
              local compline="${compwords[*]}"
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              case "$compline" in
         | 
| 31 | 
            +
                'install'*'--cache-dir')
         | 
| 32 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 33 | 
            +
                  ;;
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                'remove'*'--cache-dir')
         | 
| 36 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 37 | 
            +
                  ;;
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                'update'*'--cache-dir')
         | 
| 40 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 41 | 
            +
                  ;;
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                'purge'*'--cache-dir')
         | 
| 44 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 45 | 
            +
                  ;;
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                'list'*'--cache-dir')
         | 
| 48 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 49 | 
            +
                  ;;
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                'show'*'--cache-dir')
         | 
| 52 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 53 | 
            +
                  ;;
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                'new'*'--cache-dir')
         | 
| 56 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 57 | 
            +
                  ;;
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                'completion'*)
         | 
| 60 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--print --install --uninstall")" -- "$cur" )
         | 
| 61 | 
            +
                  ;;
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                'install'*'-C')
         | 
| 64 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 65 | 
            +
                  ;;
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                'remove'*'-C')
         | 
| 68 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 69 | 
            +
                  ;;
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                'update'*'-C')
         | 
| 72 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 73 | 
            +
                  ;;
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                'purge'*'-C')
         | 
| 76 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 77 | 
            +
                  ;;
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                'install'*)
         | 
| 80 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C")" -- "$cur" )
         | 
| 81 | 
            +
                  ;;
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                'list'*'-C')
         | 
| 84 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 85 | 
            +
                  ;;
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                'show'*'-C')
         | 
| 88 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 89 | 
            +
                  ;;
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                'new'*'-C')
         | 
| 92 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -A directory -- "$cur" )
         | 
| 93 | 
            +
                  ;;
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                'remove'*)
         | 
| 96 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C $(ronin-repos list)")" -- "$cur" )
         | 
| 97 | 
            +
                  ;;
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                'update'*)
         | 
| 100 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C $(ronin-repos list)")" -- "$cur" )
         | 
| 101 | 
            +
                  ;;
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                'purge'*)
         | 
| 104 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C")" -- "$cur" )
         | 
| 105 | 
            +
                  ;;
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                'list'*)
         | 
| 108 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C")" -- "$cur" )
         | 
| 109 | 
            +
                  ;;
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                'show'*)
         | 
| 112 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C $(ronin-repos list)")" -- "$cur" )
         | 
| 113 | 
            +
                  ;;
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                'info'*)
         | 
| 116 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "$(ronin-repos list)")" -- "$cur" )
         | 
| 117 | 
            +
                  ;;
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                'new'*)
         | 
| 120 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--cache-dir -C")" -- "$cur" )
         | 
| 121 | 
            +
                  ;;
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                'rm'*)
         | 
| 124 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "$(ronin-repos list)")" -- "$cur" )
         | 
| 125 | 
            +
                  ;;
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                'up'*)
         | 
| 128 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "$(ronin-repos list)")" -- "$cur" )
         | 
| 129 | 
            +
                  ;;
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                *)
         | 
| 132 | 
            +
                  while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_ronin-repos_completions_filter "--version -V help completion install list new purge remove show update ls up rm info")" -- "$cur" )
         | 
| 133 | 
            +
                  ;;
         | 
| 134 | 
            +
             | 
| 135 | 
            +
              esac
         | 
| 136 | 
            +
            } &&
         | 
| 137 | 
            +
            complete -F _ronin-repos_completions ronin-repos
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            # ex: filetype=sh
         | 
| @@ -5,7 +5,7 @@ | |
| 5 5 | 
             
            This git repository can be installed by the [ronin-repos] command:
         | 
| 6 6 |  | 
| 7 7 | 
             
            ```shell
         | 
| 8 | 
            -
            ronin-repos  | 
| 8 | 
            +
            ronin-repos install https://github.com/<%= @github_user %>/<%= @name %>.git
         | 
| 9 9 | 
             
            ```
         | 
| 10 10 |  | 
| 11 11 | 
             
            [ronin-repos]: https://github.com/ronin-rb/ronin-repos#readme
         | 
    
        data/gemspec.yml
    CHANGED
    
    | @@ -2,7 +2,13 @@ name: ronin-repos | |
| 2 2 | 
             
            summary: Third-party git repository support for ronin.
         | 
| 3 3 | 
             
            description:
         | 
| 4 4 | 
             
              ronin-repos provides a repository system for installing, managing, and
         | 
| 5 | 
            -
              accessing third-party git repositories,  | 
| 5 | 
            +
              accessing third-party git repositories, that can contain additional Ruby code 
         | 
| 6 | 
            +
              or other data. Other Ronin libraries, such as ronin-exploits or
         | 
| 7 | 
            +
              ronin-payloads, can then list and load additional third-party Ruby classes
         | 
| 8 | 
            +
              from specific directories within the installed third-party reposs.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              ronin-repos is essentially a decentralized plugin system for Ronin using git
         | 
| 11 | 
            +
              repos.
         | 
| 6 12 |  | 
| 7 13 | 
             
            license: LGPL-3.0
         | 
| 8 14 | 
             
            authors: Postmodern
         | 
| @@ -18,11 +24,14 @@ metadata: | |
| 18 24 | 
             
              rubygems_mfa_required: 'true'
         | 
| 19 25 |  | 
| 20 26 | 
             
            generated_files:
         | 
| 27 | 
            +
             - data/completions/ronin-repos
         | 
| 21 28 | 
             
             - man/ronin-repos.1
         | 
| 29 | 
            +
             - man/ronin-repos-completion.1
         | 
| 22 30 | 
             
             - man/ronin-repos-install.1
         | 
| 23 31 | 
             
             - man/ronin-repos-list.1
         | 
| 24 32 | 
             
             - man/ronin-repos-new.1
         | 
| 25 33 | 
             
             - man/ronin-repos-remove.1
         | 
| 34 | 
            +
             - man/ronin-repos-show.1
         | 
| 26 35 | 
             
             - man/ronin-repos-update.1
         | 
| 27 36 | 
             
             - man/ronin-repos-purge.1
         | 
| 28 37 |  | 
| @@ -30,7 +39,7 @@ required_ruby_version: ">= 3.0.0" | |
| 30 39 |  | 
| 31 40 | 
             
            dependencies:
         | 
| 32 41 | 
             
              # Library dependencies:
         | 
| 33 | 
            -
              ronin-core: ~> 0. | 
| 42 | 
            +
              ronin-core: ~> 0.2.0.rc1
         | 
| 34 43 |  | 
| 35 44 | 
             
            development_dependencies:
         | 
| 36 45 | 
             
              bundler: ~> 2.0
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            # Copyright (c) 2021- | 
| 3 | 
            +
            # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # ronin-repos is free software: you can redistribute it and/or modify
         | 
| 6 6 | 
             
            # it under the terms of the GNU Lesser General Public License as published
         | 
| @@ -34,7 +34,7 @@ module Ronin | |
| 34 34 |  | 
| 35 35 | 
             
                  include Enumerable
         | 
| 36 36 |  | 
| 37 | 
            -
                  # The  | 
| 37 | 
            +
                  # The `~/.cache/ronin-repos/` directory where all repos are stored.
         | 
| 38 38 | 
             
                  PATH = Core::Home.cache_dir('ronin-repos')
         | 
| 39 39 |  | 
| 40 40 | 
             
                  # The path to the cache directory.
         | 
| @@ -52,7 +52,7 @@ module Ronin | |
| 52 52 | 
             
                    @path = path
         | 
| 53 53 | 
             
                  end
         | 
| 54 54 |  | 
| 55 | 
            -
                  # | 
| 55 | 
            +
                  #
         | 
| 56 56 | 
             
                  # Accesses a repository from the cache directory.
         | 
| 57 57 | 
             
                  #
         | 
| 58 58 | 
             
                  # @param [String] name
         | 
| @@ -129,10 +129,9 @@ module Ronin | |
| 129 129 | 
             
                  #
         | 
| 130 130 | 
             
                  def update
         | 
| 131 131 | 
             
                    each do |repo|
         | 
| 132 | 
            -
                       | 
| 133 | 
            -
             | 
| 134 | 
            -
                       | 
| 135 | 
            -
                      end
         | 
| 132 | 
            +
                      repo.update
         | 
| 133 | 
            +
                    rescue CommandFailed
         | 
| 134 | 
            +
                      # ignore any `git` errors when updating
         | 
| 136 135 | 
             
                    end
         | 
| 137 136 | 
             
                  end
         | 
| 138 137 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            # Copyright (c) 2021- | 
| 3 | 
            +
            # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # ronin-repos is free software: you can redistribute it and/or modify
         | 
| 6 6 | 
             
            # it under the terms of the GNU Lesser General Public License as published
         | 
| @@ -33,12 +33,12 @@ module Ronin | |
| 33 33 | 
             
                #
         | 
| 34 34 | 
             
                #     require 'ronin/core/module_registry'
         | 
| 35 35 | 
             
                #     require 'ronin/repos/class_dir'
         | 
| 36 | 
            -
                # | 
| 36 | 
            +
                #
         | 
| 37 37 | 
             
                #     module Ronin
         | 
| 38 38 | 
             
                #       module Exploits
         | 
| 39 39 | 
             
                #         include Ronin::Core::ClassRegistry
         | 
| 40 40 | 
             
                #         include Ronin::Repos::ClassDir
         | 
| 41 | 
            -
                # | 
| 41 | 
            +
                #
         | 
| 42 42 | 
             
                #         class_dir "#{__dir__}/classes"
         | 
| 43 43 | 
             
                #         repo_class_dir "exploits"
         | 
| 44 44 | 
             
                #       end
         | 
| @@ -49,11 +49,11 @@ module Ronin | |
| 49 49 | 
             
                #     module Ronin
         | 
| 50 50 | 
             
                #       module Exploits
         | 
| 51 51 | 
             
                #         class Exploit
         | 
| 52 | 
            -
                # | 
| 52 | 
            +
                #
         | 
| 53 53 | 
             
                #           def self.register(name)
         | 
| 54 54 | 
             
                #             Exploits.register(name,self)
         | 
| 55 55 | 
             
                #           end
         | 
| 56 | 
            -
                # | 
| 56 | 
            +
                #
         | 
| 57 57 | 
             
                #         end
         | 
| 58 58 | 
             
                #       end
         | 
| 59 59 | 
             
                #     end
         | 
| @@ -61,13 +61,13 @@ module Ronin | |
| 61 61 | 
             
                # `~/.cache/ronin-repos/repo1/exploits/my_exploit.rb`:
         | 
| 62 62 | 
             
                #
         | 
| 63 63 | 
             
                #     require 'ronin/exploits/exploit'
         | 
| 64 | 
            -
                # | 
| 64 | 
            +
                #
         | 
| 65 65 | 
             
                #     module Ronin
         | 
| 66 66 | 
             
                #       module Exploits
         | 
| 67 67 | 
             
                #         class MyExploit < Exploit
         | 
| 68 | 
            -
                # | 
| 68 | 
            +
                #
         | 
| 69 69 | 
             
                #           register 'my_exploit'
         | 
| 70 | 
            -
                # | 
| 70 | 
            +
                #
         | 
| 71 71 | 
             
                #         end
         | 
| 72 72 | 
             
                #       end
         | 
| 73 73 | 
             
                #     end
         | 
| @@ -88,6 +88,9 @@ module Ronin | |
| 88 88 | 
             
                    namespace.extend ClassMethods
         | 
| 89 89 | 
             
                  end
         | 
| 90 90 |  | 
| 91 | 
            +
                  #
         | 
| 92 | 
            +
                  # Class-methods.
         | 
| 93 | 
            +
                  #
         | 
| 91 94 | 
             
                  module ClassMethods
         | 
| 92 95 | 
             
                    #
         | 
| 93 96 | 
             
                    # Gets or sets the repository module directory name.
         | 
| @@ -97,7 +100,7 @@ module Ronin | |
| 97 100 | 
             
                    #
         | 
| 98 101 | 
             
                    # @return [String]
         | 
| 99 102 | 
             
                    #   The repository module directory name.
         | 
| 100 | 
            -
                    # | 
| 103 | 
            +
                    #
         | 
| 101 104 | 
             
                    # @raise [NotImplementedError]
         | 
| 102 105 | 
             
                    #   The `repo_class_dir` method was not defined in the module.
         | 
| 103 106 | 
             
                    #
         | 
| @@ -117,16 +120,20 @@ module Ronin | |
| 117 120 | 
             
                    # {#repo_class_dir} across all installed repositories.
         | 
| 118 121 | 
             
                    #
         | 
| 119 122 | 
             
                    # @return [Array<String>]
         | 
| 120 | 
            -
                    # | 
| 123 | 
            +
                    #
         | 
| 121 124 | 
             
                    def list_files
         | 
| 122 | 
            -
                       | 
| 123 | 
            -
                      pattern = File.join(repo_class_dir,"{**/}*.rb") | 
| 125 | 
            +
                      paths   = Set.new(super)
         | 
| 126 | 
            +
                      pattern = File.join(repo_class_dir,"{**/}*.rb")
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                      # the String#slice range to remove the repo_class_dir/ and .rb ext
         | 
| 129 | 
            +
                      slice_range = (repo_class_dir.length + 1)...-3
         | 
| 124 130 |  | 
| 125 131 | 
             
                      Repos.list_files(pattern).each do |path|
         | 
| 126 | 
            -
                         | 
| 132 | 
            +
                        # NOTE: String#slice is faster than .delete_prefix + delete.suffix
         | 
| 133 | 
            +
                        paths << path.slice(slice_range)
         | 
| 127 134 | 
             
                      end
         | 
| 128 135 |  | 
| 129 | 
            -
                      return  | 
| 136 | 
            +
                      return paths.to_a
         | 
| 130 137 | 
             
                    end
         | 
| 131 138 |  | 
| 132 139 | 
             
                    #
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            # Copyright (c) 2021- | 
| 3 | 
            +
            # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
         | 
| 4 4 | 
             
            #
         | 
| 5 5 | 
             
            # ronin-repos is free software: you can redistribute it and/or modify
         | 
| 6 6 | 
             
            # it under the terms of the GNU Lesser General Public License as published
         | 
| @@ -24,6 +24,9 @@ require 'ronin/core/cli/command' | |
| 24 24 | 
             
            module Ronin
         | 
| 25 25 | 
             
              module Repos
         | 
| 26 26 | 
             
                class CLI
         | 
| 27 | 
            +
                  #
         | 
| 28 | 
            +
                  # Base command for all `ronin-repos` commands.
         | 
| 29 | 
            +
                  #
         | 
| 27 30 | 
             
                  class Command < Core::CLI::Command
         | 
| 28 31 |  | 
| 29 32 | 
             
                    man_dir File.join(ROOT,'man')
         | 
| @@ -39,8 +42,7 @@ module Ronin | |
| 39 42 | 
             
                                         @cache_dir = CacheDir.new(dir)
         | 
| 40 43 | 
             
                                       end
         | 
| 41 44 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
                    # The ronin-repos cache directory.
         | 
| 45 | 
            +
                    # The `ronin-repos` cache directory.
         | 
| 44 46 | 
             
                    #
         | 
| 45 47 | 
             
                    # @return [CacheDir]
         | 
| 46 48 | 
             
                    attr_reader :cache_dir
         |