frm 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ # Effing Repo Management.
2
+
3
+ ## Background
4
+
5
+ I love using FPM: <http://goo.gl/u3pJB> to create debian packages. It's an
6
+ awesome tool that takes all of the BS work to package debs and has made my life
7
+ easier and more productive.
8
+
9
+ However, after creating packages, the next pain-point is how to actually
10
+ publish those packages for internal testing/verification and finally for public
11
+ consumption. That is, until FRM!
12
+
13
+ Previous solutions require you either to host your own repo and use several tools like
14
+ reprepro along with a webserver, or to be confined to the requirements of a PPA.
15
+
16
+ ## What is frm?
17
+
18
+ FRM is a simple solution for creating cloud-based repos. It is a small ruby
19
+ library that pushes a specified set of deb packages into an Amazon s3 bucket
20
+ allong with the required files and format needed to use it directly as a
21
+ personal or public ubuntu mirror.
22
+
23
+ It is designed to be the easiest way possible to host your own debian packages
24
+ on your own mirror without having to maintain any servers!
25
+
26
+ ## Why is this good?
27
+
28
+ FRM provides some really cool benifits, such as:
29
+
30
+ * cloud based (no servers to maintain!)
31
+ * really easy to use
32
+ * can easily be backed backed by cloudfront to provide a worldwide geo-dns caching solution
33
+ * allows you to create unlimited seperate repos allowing for new possible dev/test workflows
34
+
35
+ ## Install (currently only works on debian based systems)
36
+
37
+ Make sure you have a gpg key setup in ~/.gnupg
38
+
39
+ You can install frm with gem:
40
+
41
+ gem install frm
42
+
43
+ Running it:
44
+
45
+ frm -a AWS_ACCESS_KEY -s AWS_SECRET_KEY -b my_bucket -p some_path_inside_my_bucket package1 [package2] ...
46
+
47
+ ## Currently Working:
48
+
49
+ * S3 support
50
+ * signed gpg release file (need to have a key setup in ~/.gnupg)
51
+ * all necessary configuration for Ubuntu natty
52
+
53
+ ## Known Issues
54
+
55
+ Although FRM is great, it's not perfect. Here are some things that we already know about:
56
+
57
+ * can only create new repositories (merging into existing repos comming soon;)
58
+ * currently only works for natty (soon to be fixed)
59
+ * currently only works for debian packages (would be pretty easy to add support for rpm /me thinks. holler if u want)
60
+ * shells out to gpg (could not find a decent ruby solution to create detached signatures. plz holler if u know one!)
61
+ * shells out to 'dpkg' (may be fine)
62
+ * only works with Amazon S3 (could support another cloud if people want it)
63
+
64
+ ## Need Help or Want to Contribute?
65
+
66
+ All contributions are welcome, please contact me if you need anything;)
67
+
68
+ # Thanks!
69
+
70
+ Big thanks goes out to Jordan Sissel for creating FPM!
71
+
72
+ <https://github.com/jordansissel/fpm>
73
+ <https://github.com/jordansissel>
data/bin/frm CHANGED
@@ -45,6 +45,11 @@ Usage: frm [options] package1 [package2] ..."
45
45
  options[:prefix] = prefix
46
46
  end
47
47
 
48
+ options[:release] = `lsb_release -cs`.strip
49
+ opts.on('-r','--release RELEASE','release of deb packages') do |release|
50
+ options[:release] = release
51
+ end
52
+
48
53
 
49
54
  # This displays the help screen, all programs are
50
55
  # assumed to have this option.
@@ -86,7 +91,7 @@ Dir.chdir(File.dirname(File.dirname(__FILE__)))
86
91
  require File.join Dir.pwd, 'lib', 'frm'
87
92
 
88
93
  puts "creating release..."
89
- package_release = FRM::PackageRelease.new(packages)
94
+ package_release = FRM::PackageRelease.new(packages,options[:release])
90
95
 
91
96
  puts "pushing release..."
92
97
  release_pusher = FRM::ReleasePusher.new(package_release,options[:access_key],options[:secret_key],options[:bucket],options[:prefix])
data/lib/frm.rb CHANGED
@@ -1,3 +1,3 @@
1
- require File.join @frm_base, 'lib', 'frm', 'base'
2
- require File.join @frm_base, 'lib', 'frm', 's3'
3
- require File.join @frm_base, 'lib', 'frm', 'deb'
1
+ require 'frm/base'
2
+ require 'frm/s3'
3
+ require 'frm/deb'
@@ -5,11 +5,12 @@ module FRM
5
5
 
6
6
  class Package < Base
7
7
  attr_accessor :repo_filename
8
- attr_reader :path, :content, :md5, :sha1, :sha2 , :size
9
- def initialize(path)
8
+ attr_reader :path, :content, :md5, :sha1, :sha2 , :size, :release
9
+ def initialize(path,release='natty')
10
10
  raise "you need to specify a path!!!" if path.nil?
11
11
  @path = path
12
12
  raise "Can not find file '#{path}'" unless File.exists?(path)
13
+ @release = release
13
14
  begin
14
15
  @content = File.read(path)
15
16
  rescue Object => o
@@ -26,13 +27,14 @@ module FRM
26
27
  end
27
28
 
28
29
  class PackageRelease < Base
29
- attr_reader :packages, :standards_version, :priority, :package_file, :gzipped_package_file, :release_file, :short_release_file, :component
30
- def initialize(packages={},component='main/binary-amd64')
30
+ attr_reader :packages, :standards_version, :priority, :package_file, :gzipped_package_file, :release_file, :short_release_file, :component, :release
31
+ def initialize(packages={},release='natty',component='main/binary-amd64')
32
+ @release = release
31
33
  @component = component
32
34
  @standards_version = standards_version
33
35
  @priority = priority
34
36
  @packages = []
35
- packages.each { |package| @packages << Package.new(package) }
37
+ packages.each { |package| @packages << Package.new(package,@release) }
36
38
  @package_file = generate_package_file
37
39
  @gzipped_package_file = generate_gzip_pipe(@package_file).read
38
40
  @short_release_file = generate_short_release_file
@@ -43,8 +45,8 @@ module FRM
43
45
 
44
46
  def generate_release_file()
45
47
  partial_release_file = "Origin: apt.cloudscaling.com
46
- Label: apt repository natty
47
- Codename: natty
48
+ Label: apt repository #{@release}
49
+ Codename: #{@release}
48
50
  Date: Thu, 22 Dec 2011 00:29:55 UTC
49
51
  Architectures: amd64
50
52
  Components: main universe multiverse
@@ -68,7 +70,7 @@ SHA256:
68
70
  def generate_short_release_file
69
71
  "Component: main
70
72
  Origin: apt.cloudscaling.com
71
- Label: apt repository natty
73
+ Label: apt repository #{@release}
72
74
  Architecture: amd64
73
75
  Description: Cloudscaling APT repository
74
76
  "
@@ -103,6 +105,7 @@ Description: Cloudscaling APT repository
103
105
 
104
106
  class ReleasePusher < Base
105
107
  def initialize(package_release,access_key,secret_key,bucket,prefix,server='s3-us-west-1.amazonaws.com')
108
+ @release = package_release.release
106
109
  @bucket = bucket
107
110
  @prefix = prefix
108
111
  @s3 = FRM::S3.new(access_key,secret_key,server)
@@ -115,16 +118,16 @@ Description: Cloudscaling APT repository
115
118
 
116
119
  def push_release_files(package_release)
117
120
  # TODO: un-hardcode this
118
- release_path = @prefix + "/dists/natty/Release"
121
+ release_path = @prefix + "/dists/#{@release}/Release"
119
122
  @s3.put(release_path,package_release.release_file,@bucket)
120
123
 
121
- in_release_path = @prefix + "/dists/natty/InRelease"
124
+ in_release_path = @prefix + "/dists/#{@release}/InRelease"
122
125
  @s3.put(in_release_path,gpg_clearsign(package_release.release_file),@bucket)
123
126
 
124
- gpg_release_path = @prefix + "/dists/natty/Release.gpg"
127
+ gpg_release_path = @prefix + "/dists/#{@release}/Release.gpg"
125
128
  @s3.put(gpg_release_path,gpg_detached(package_release.release_file),@bucket)
126
129
 
127
- release_file_path = @prefix + "/dists/natty/" + package_release.component
130
+ release_file_path = @prefix + "/dists/#{@release}/" + package_release.component
128
131
  @s3.put(release_file_path + '/Release',package_release.short_release_file,@bucket)
129
132
  @s3.put(release_file_path + '/Packages',package_release.package_file,@bucket)
130
133
  @s3.put(release_file_path + '/Packages.gz',package_release.gzipped_package_file,@bucket)
@@ -1,3 +1,3 @@
1
1
  module Frm
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/test/s3.rb CHANGED
@@ -4,7 +4,7 @@ require 'minitest/autorun'
4
4
  require 'mock-aws-s3'
5
5
 
6
6
  # this is a stupid hack to get the @@bucket region set properly
7
- DEFAULT_HOST = 's3-us-west-1.amazonaws.com'
7
+ #DEFAULT_HOST = 's3-us-west-1.amazonaws.com'
8
8
 
9
9
  class TestFRM < MiniTest::Unit::TestCase
10
10
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 4
9
- version: 0.0.4
8
+ - 5
9
+ version: 0.0.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Martin Rhoads
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-03-31 00:00:00 -07:00
17
+ date: 2012-05-23 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -56,6 +56,7 @@ files:
56
56
  - .gitignore
57
57
  - Gemfile
58
58
  - LICENSE
59
+ - README.md
59
60
  - Rakefile
60
61
  - bin/frm
61
62
  - frm.gemspec
@@ -100,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
101
  requirements: []
101
102
 
102
103
  rubyforge_project: frm
103
- rubygems_version: 1.3.7
104
+ rubygems_version: 1.3.7.1
104
105
  signing_key:
105
106
  specification_version: 3
106
107
  summary: Effin Repo Manager