certgen 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdaf8fdacad6518c7a0b679c0acb9bcf0a11329560716f31cc7884df154f0967
4
- data.tar.gz: 846e35380bd6de70f8cdac267e07430ee10e0fadc8cef6085d64b4a2c0aac248
3
+ metadata.gz: 1a6d8a3b44989688785b7f2c2f079f0165e32737c18bc09f9f8d54075a607755
4
+ data.tar.gz: 627be1336a96f8900a81f2a3548f4e923a9b35090ac7de650ec294851f401ace
5
5
  SHA512:
6
- metadata.gz: 3eb3caa1797c237bd5e52d900ef19ced3975a2250a7031b9edb26ed2abc04acfb0f723df6a9c491a431fb31c275abc14a667e59bf84e4b284f3d17147738e2e6
7
- data.tar.gz: 1611c486db2df826522229c0acdc88f2674ccbda6cb4b1fc574378d0ab95a6eb05f88787d613ff1a3c0c3bd0b054a65b0f273ec2fe17daf396bfd8ab90a93a04
6
+ metadata.gz: c421a459113793501f907df8f39bc44231b063b3bc7458ed3cf25a47310413ea301d9184a89e17e5ee54d1b6210349d3e36af604ec10633e44c899ba6512af0b
7
+ data.tar.gz: f1f67240880ec804fb66b1a20e04d533ae6d5a684451a2e33fbe81c2f52a181624dbf31fc54d3c349a42ec581bfcfd87bf1b64e314283f7308b5c63e4f504e49
data/exe/certgen CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require "certgen"
4
+ require_relative "../lib/certgen/cli"
5
5
 
6
- Certgen::CLI.start
6
+ Certgen::CLI.start(ARGV)
data/lib/certgen/cli.rb CHANGED
@@ -1,36 +1,67 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # lib/certgen/cli.rb
4
-
5
3
  require "optparse"
4
+ require_relative "generator"
6
5
 
7
6
  module Certgen
8
7
  class CLI
9
- def self.start
8
+ def self.start(argv)
10
9
  options = {}
10
+ subcommand = argv.shift
11
+
12
+ parser = OptionParser.new do |opts|
13
+ opts.banner = "Usage: certgen [command] [options]"
11
14
 
12
- OptionParser.new do |opts|
13
- opts.banner = "Usage: certgen [options]"
15
+ opts.separator ""
16
+ opts.separator "Commands:"
17
+ opts.separator " generate Generate a real SSL certificate using Let's Encrypt"
18
+ opts.separator " test Test certificate generation using the Let's Encrypt staging environment (no rate limits)"
19
+ opts.separator ""
20
+ opts.separator "Options:"
21
+
22
+ opts.on("--domain DOMAIN", "The domain to issue a certificate for (e.g., example.com)") do |v|
23
+ options[:domain] = v
24
+ end
14
25
 
15
- opts.on("-d", "--domain DOMAIN", "Domain name") { |v| options[:domain] = v }
16
- opts.on("-e", "--email EMAIL", "Email address") { |v| options[:email] = v }
17
- opts.on("-w", "--wildcard", "Request a wildcard certificate") { options[:wildcard] = true }
18
- opts.on("-h", "--help", "Prints this help") do
26
+ opts.on("--email EMAIL", "Email address for Let's Encrypt registration") do |v|
27
+ options[:email] = v
28
+ end
29
+
30
+ opts.on("-h", "--help", "Print this help message") do
19
31
  puts opts
20
32
  exit
21
33
  end
22
- end.parse!
34
+ end
35
+
36
+ begin
37
+ parser.parse!(argv)
38
+ rescue OptionParser::InvalidOption => e
39
+ puts "❌ #{e.message}"
40
+ puts parser
41
+ exit 1
42
+ end
43
+
44
+ unless %w[generate test].include?(subcommand)
45
+ puts "❌ Unknown command: #{subcommand}"
46
+ puts parser
47
+ exit 1
48
+ end
23
49
 
24
50
  unless options[:domain] && options[:email]
25
- puts "Error: Domain and email are required."
51
+ puts " Both --domain and --email are required"
52
+ puts parser
26
53
  exit 1
27
54
  end
28
55
 
29
- puts "[INFO] Starting certificate generation for #{options[:domain]}..."
30
- Certgen.generate(
31
- domain: options[:domain],
32
- email: options[:email]
33
- )
56
+ case subcommand
57
+ when "generate"
58
+ Certgen::Generator.new(domain: options[:domain], email: options[:email]).run
59
+ when "test"
60
+ Certgen::Generator.new(domain: options[:domain], email: options[:email], staging: true).run
61
+ else
62
+ puts "Unknown command. Available: generate, test"
63
+ exit 1
64
+ end
34
65
  end
35
66
  end
36
67
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "acme-client"
4
- require "openssl"
5
4
  require "fileutils"
5
+ require "openssl"
6
6
  require "zip"
7
7
 
8
8
  module Certgen
@@ -10,9 +10,13 @@ module Certgen
10
10
  LETS_ENCRYPT_DIRECTORY = "https://acme-v02.api.letsencrypt.org/directory"
11
11
  ACCOUNT_KEY_PATH = File.expand_path("~/.certgen/acme_account.key")
12
12
 
13
- def initialize(domain:, email:)
13
+ def initialize(domain:, email:, staging: false)
14
14
  @input_domain = domain
15
15
  @email = email
16
+ @staging = staging
17
+ @directory_url = staging ?
18
+ "https://acme-staging-v02.api.letsencrypt.org/directory" :
19
+ "https://acme-v02.api.letsencrypt.org/directory"
16
20
  @base_domain = domain.sub(/^www\./, "")
17
21
  @domains = [@base_domain, "www.#{@base_domain}"].uniq
18
22
  @output_dir = File.expand_path("~/.ssl_output/#{@base_domain}")
@@ -46,17 +50,21 @@ module Certgen
46
50
  def setup_client
47
51
  @client = Acme::Client.new(
48
52
  private_key: @account_key,
49
- directory: LETS_ENCRYPT_DIRECTORY
53
+ directory: @directory_url
50
54
  )
51
55
 
52
56
  begin
53
57
  @client.new_account(contact: "mailto:#{@email}", terms_of_service_agreed: true)
54
58
  rescue Acme::Client::Error::Malformed
55
- puts " ACME account already registered."
59
+ puts " ACME account already registered."
56
60
  end
57
61
  end
58
62
 
59
63
  def create_output_directory
64
+ if Dir.exist?(@output_dir)
65
+ puts "🧹 Cleaning existing output directory: #{@output_dir}"
66
+ FileUtils.rm_rf(@output_dir)
67
+ end
60
68
  FileUtils.mkdir_p(@output_dir)
61
69
  end
62
70
 
@@ -127,7 +135,7 @@ module Certgen
127
135
  end
128
136
 
129
137
  def create_zip(zip_path, files)
130
- Zip::File.open(zip_path, Zip::File::CREATE) do |zipfile|
138
+ ::Zip::File.open(zip_path, Zip::File::CREATE) do |zipfile|
131
139
  files.each do |file|
132
140
  zipfile.add(File.basename(file), file) if File.exist?(file)
133
141
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Certgen
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/certgen.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "certgen/version"
4
3
  require "certgen/cli"
5
4
  require "certgen/generator"
5
+ require "certgen/version"
6
6
 
7
7
  module Certgen
8
8
  # Custom error class for all Certgen-specific errors
@@ -11,8 +11,8 @@ module Certgen
11
11
  # Main entry point for generating certificates
12
12
  def self.generate(domain:, email:)
13
13
  Certgen::Generator.new(
14
- domain:,
15
- email:
14
+ domain: domain,
15
+ email: email
16
16
  ).run
17
17
  end
18
18
  end
metadata CHANGED
@@ -1,14 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: certgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rajan Bhattarai
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 2025-05-03 00:00:00.000000000 Z
11
- dependencies: []
11
+ date: 2025-05-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: acme-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.21
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.21
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.4.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.4.1
12
41
  description: Certgen is a command-line Ruby gem that helps users generate free SSL
13
42
  certificates from Let's Encrypt using DNS-01 verification. Ideal for users with
14
43
  manual or cPanel-based hosting environments. Supports wildcard domains and reusable
@@ -41,6 +70,7 @@ metadata:
41
70
  homepage_uri: https://github.com/cdrrazan/certgen
42
71
  source_code_uri: https://github.com/cdrrazan/certgen
43
72
  changelog_uri: https://github.com/cdrrazan/certgen/blob/main/CHANGELOG.md
73
+ post_install_message:
44
74
  rdoc_options: []
45
75
  require_paths:
46
76
  - lib
@@ -55,7 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
85
  - !ruby/object:Gem::Version
56
86
  version: '0'
57
87
  requirements: []
58
- rubygems_version: 3.6.2
88
+ rubygems_version: 3.4.17
89
+ signing_key:
59
90
  specification_version: 4
60
91
  summary: A Ruby CLI gem to generate free SSL certificates using Let's Encrypt with
61
92
  DNS verification.