cloud-mu 2.0.4 → 2.1.0beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +6 -0
  3. data/ansible/roles/geerlingguy.firewall/LICENSE +20 -0
  4. data/ansible/roles/geerlingguy.firewall/README.md +93 -0
  5. data/ansible/roles/geerlingguy.firewall/defaults/main.yml +19 -0
  6. data/ansible/roles/geerlingguy.firewall/handlers/main.yml +3 -0
  7. data/ansible/roles/geerlingguy.firewall/meta/main.yml +26 -0
  8. data/ansible/roles/geerlingguy.firewall/molecule/default/molecule.yml +40 -0
  9. data/ansible/roles/geerlingguy.firewall/molecule/default/playbook.yml +17 -0
  10. data/ansible/roles/geerlingguy.firewall/molecule/default/tests/test_default.py +14 -0
  11. data/ansible/roles/geerlingguy.firewall/molecule/default/yaml-lint.yml +6 -0
  12. data/ansible/roles/geerlingguy.firewall/tasks/disable-other-firewalls.yml +66 -0
  13. data/ansible/roles/geerlingguy.firewall/tasks/main.yml +44 -0
  14. data/ansible/roles/geerlingguy.firewall/templates/firewall.bash.j2 +136 -0
  15. data/ansible/roles/geerlingguy.firewall/templates/firewall.init.j2 +52 -0
  16. data/ansible/roles/geerlingguy.firewall/templates/firewall.unit.j2 +12 -0
  17. data/bin/mu-ansible-secret +114 -0
  18. data/bin/mu-aws-setup +74 -21
  19. data/bin/mu-node-manage +22 -12
  20. data/bin/mu-self-update +11 -4
  21. data/cloud-mu.gemspec +3 -3
  22. data/cookbooks/firewall/metadata.json +1 -1
  23. data/cookbooks/firewall/recipes/default.rb +4 -0
  24. data/cookbooks/mu-master/recipes/default.rb +0 -3
  25. data/cookbooks/mu-master/recipes/init.rb +15 -9
  26. data/cookbooks/mu-master/templates/default/mu.rc.erb +1 -1
  27. data/cookbooks/mu-master/templates/default/web_app.conf.erb +0 -4
  28. data/cookbooks/mu-php54/metadata.rb +2 -2
  29. data/cookbooks/mu-php54/recipes/default.rb +1 -3
  30. data/cookbooks/mu-tools/recipes/eks.rb +25 -2
  31. data/cookbooks/mu-tools/recipes/nrpe.rb +6 -1
  32. data/cookbooks/mu-tools/recipes/set_mu_hostname.rb +8 -0
  33. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +1 -1
  34. data/cookbooks/mu-tools/templates/default/kubeconfig.erb +2 -2
  35. data/cookbooks/mu-tools/templates/default/kubelet-config.json.erb +35 -0
  36. data/extras/clean-stock-amis +10 -4
  37. data/extras/list-stock-amis +64 -0
  38. data/extras/python_rpm/build.sh +21 -0
  39. data/extras/python_rpm/muthon.spec +68 -0
  40. data/install/README.md +5 -2
  41. data/install/user-dot-murc.erb +1 -1
  42. data/modules/mu.rb +52 -8
  43. data/modules/mu/clouds/aws.rb +1 -1
  44. data/modules/mu/clouds/aws/container_cluster.rb +1071 -47
  45. data/modules/mu/clouds/aws/firewall_rule.rb +45 -19
  46. data/modules/mu/clouds/aws/log.rb +3 -2
  47. data/modules/mu/clouds/aws/role.rb +18 -2
  48. data/modules/mu/clouds/aws/server.rb +11 -5
  49. data/modules/mu/clouds/aws/server_pool.rb +20 -24
  50. data/modules/mu/clouds/aws/userdata/linux.erb +1 -1
  51. data/modules/mu/clouds/aws/vpc.rb +9 -0
  52. data/modules/mu/clouds/google/server.rb +2 -0
  53. data/modules/mu/config.rb +3 -3
  54. data/modules/mu/config/container_cluster.rb +1 -1
  55. data/modules/mu/config/firewall_rule.rb +4 -0
  56. data/modules/mu/config/role.rb +29 -0
  57. data/modules/mu/config/server.rb +9 -4
  58. data/modules/mu/groomer.rb +14 -3
  59. data/modules/mu/groomers/ansible.rb +553 -0
  60. data/modules/mu/groomers/chef.rb +0 -5
  61. data/modules/mu/mommacat.rb +18 -3
  62. data/modules/scratchpad.erb +1 -1
  63. data/requirements.txt +5 -0
  64. metadata +39 -16
@@ -173,7 +173,7 @@ dpkgs = {}
173
173
 
174
174
  elversion = node['platform_version'].to_i > 2000 ? 6 : node['platform_version'].to_i
175
175
  if platform_family?("rhel")
176
- basepackages = ["git", "curl", "diffutils", "patch", "gcc", "gcc-c++", "make", "postgresql-devel", "libyaml", "libffi-devel"]
176
+ basepackages = ["git", "curl", "diffutils", "patch", "gcc", "gcc-c++", "make", "postgresql-devel", "libyaml", "libffi-devel", "tcl", "tk"]
177
177
  # package epel-release-6-8.9.amzn1.noarch (which is newer than epel-release-6-8.noarch) is already installed
178
178
 
179
179
  rpms = {
@@ -189,13 +189,15 @@ if platform_family?("rhel")
189
189
  elsif elversion < 7
190
190
  basepackages.concat(["mysql-devel"])
191
191
  rpms["ruby25"] = "https://s3.amazonaws.com/cloudamatic/muby-2.5.3-1.el6.x86_64.rpm"
192
+ rpms["python27"] = "https://s3.amazonaws.com/cloudamatic/muthon-2.7.16-1.el6.x86_64.rpm"
192
193
 
193
194
  removepackages = ["nagios"]
194
195
 
195
196
  # RHEL7, CentOS7
196
197
  elsif elversion < 8
197
- basepackages.concat(["libX11", "tcl", "tk", "mariadb-devel", "cryptsetup"])
198
+ basepackages.concat(["libX11", "mariadb-devel", "cryptsetup"])
198
199
  rpms["ruby25"] = "https://s3.amazonaws.com/cloudamatic/muby-2.5.3-1.el7.x86_64.rpm"
200
+ rpms["python27"] = "https://s3.amazonaws.com/cloudamatic/muthon-2.7.16-1.el7.x86_64.rpm"
199
201
  removepackages = ["nagios", "firewalld"]
200
202
  end
201
203
  # Amazon Linux
@@ -284,20 +286,19 @@ end
284
286
  # REMOVE OLD RUBYs
285
287
  execute "clean up old Ruby 2.1.6" do
286
288
  command "rm -rf /opt/rubies/ruby-2.1.6"
289
+ ignore_failure true
287
290
  only_if { ::Dir.exist?("/opt/rubies/ruby-2.1.6") }
288
291
  end
289
292
 
290
- yum_package 'ruby23-2.3.1-1.el7.centos.x86_64' do
291
- action :purge
292
- end
293
-
294
293
  execute "Kill ruby-2.3.1" do
295
294
  command "yum erase ruby23-2.3.1-1.el7.centos.x86_64 -y; rpm -e ruby23"
295
+ ignore_failure true
296
296
  only_if { ::Dir.exist?("/opt/rubies/ruby-2.3.1") }
297
297
  end
298
298
 
299
299
  execute "clean up old ruby-2.3.1" do
300
300
  command "rm -rf /opt/rubies/ruby-2.3.1"
301
+ ignore_failure true
301
302
  only_if { ::Dir.exist?("/opt/rubies/ruby-2.3.1") }
302
303
  end
303
304
 
@@ -320,6 +321,7 @@ rpms.each_pair { |pkg, src|
320
321
  end
321
322
  end
322
323
  }
324
+
323
325
  package ["jq"] do
324
326
  ignore_failure true # sometimes we can't see EPEL immediately
325
327
  end
@@ -382,6 +384,12 @@ remote_file "#{MU_BASE}/bin/mu-self-update" do
382
384
  mode 0755
383
385
  end
384
386
 
387
+ bash "install modules for our built-in Python" do
388
+ code <<-EOH
389
+ /usr/local/python-current/bin/pip install -r #{MU_BASE}/lib/requirements.txt
390
+ EOH
391
+ end
392
+
385
393
  ["/usr/local/ruby-current", "/opt/chef/embedded"].each { |rubydir|
386
394
  gembin = rubydir+"/bin/gem"
387
395
  gemdir = Dir.glob("#{rubydir}/lib/ruby/gems/?.?.?/gems").last
@@ -399,7 +407,6 @@ end
399
407
  package_name "bundler"
400
408
  action :upgrade if rubydir == "/usr/local/ruby-current"
401
409
  notifies :run, "bash[fix #{rubydir} gem permissions]", :delayed
402
- options('-q --no-documentation')
403
410
  end
404
411
  execute "#{bundler_path} install" do
405
412
  cwd "#{MU_BASE}/lib/modules"
@@ -421,7 +428,6 @@ end
421
428
  action :remove
422
429
  only_if { ::Dir.exist?(dir) }
423
430
  only_if { ::Dir.exist?(gemdir) }
424
- options('-q --no-documentation')
425
431
  end
426
432
  execute "rm -rf #{gemdir}/knife-windows-#{Regexp.last_match[1]}"
427
433
  }
@@ -546,7 +552,7 @@ end
546
552
  file "#{MU_BASE}/etc/mu.rc" do
547
553
  content %Q{export MU_INSTALLDIR="#{MU_BASE}"
548
554
  export MU_DATADIR="#{MU_BASE}/var"
549
- export PATH="#{MU_BASE}/bin:/usr/local/ruby-current/bin:${PATH}:/opt/opscode/embedded/bin"
555
+ export PATH="#{MU_BASE}/bin:/usr/local/ruby-current/bin:/usr/local/python-current/bin:${PATH}:/opt/opscode/embedded/bin"
550
556
  }
551
557
  mode 0644
552
558
  action :create_if_missing
@@ -1,7 +1,7 @@
1
1
  # bash/sh environment support for Mu tools. Intended for the system (root)
2
2
  # user. Regular users get a .murc installed by mu-user-manage, from the template
3
3
  # in <%= @installdir %>/lib/install/user-dot-murc.erb
4
- export PATH="<%= @installdir %>/bin:/usr/local/ruby-current/bin:${PATH}:/opt/opscode/embedded/bin"
4
+ export PATH="<%= @installdir %>/bin:/usr/local/ruby-current/bin:/usr/local/python-current/bin:${PATH}:/opt/opscode/embedded/bin"
5
5
  export MU_INSTALLDIR="<%= @installdir %>"
6
6
  export MU_DATADIR="<%= @installdir %>/var"
7
7
  <% if @repos %>
@@ -30,10 +30,6 @@
30
30
  ProxyPass /scratchpad https://localhost:2260/scratchpad
31
31
  ProxyPassReverse /scratchpad https://localhost:2260/scratchpad
32
32
 
33
- # Jenkins CI web interface
34
- ProxyPass /jenkins http://localhost:8080/jenkins
35
- ProxyPassReverse /jenkins http://localhost:8080/jenkins
36
-
37
33
  # Nagios web UI
38
34
  ProxyPass /nagios/ https://localhost:8443/nagios/
39
35
  ProxyPassReverse /nagios/ https://localhost:8443/nagios/
@@ -8,7 +8,7 @@ long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
8
8
  source_url 'https://github.com/cloudamatic/mu'
9
9
  issues_url 'https://github.com/cloudamatic/mu/issues'
10
10
  chef_version '>= 14.0' if respond_to?(:chef_version)
11
- version '0.3.1'
11
+ version '0.3.0'
12
12
 
13
13
  %w( centos ubuntu ).each do |os|
14
14
  supports os
@@ -18,4 +18,4 @@ depends 'mu-utility'
18
18
  depends 'simple_iptables', '~> 0.8.0'
19
19
  depends 'apache2', '< 4.0'
20
20
  depends 'mysql', '~> 8.5.1'
21
- depends 'yum-epel', '~> 3.2.0'
21
+ depends 'yum-epel', '~> 3.2.0'
@@ -38,9 +38,7 @@ case node['platform']
38
38
 
39
39
  # What we really mean is "chef_gem" but that insists on running
40
40
  # at compile time, before any of its dependencies are ready.
41
- gem_package "mysql" do
42
- options('-q --no-documentation')
43
- end
41
+ gem_package "mysql"
44
42
 
45
43
  # Sundry libraries for PHP
46
44
  ["libmcrypt", "libmcrypt-devel", "php-devel", "php-pdo", "php-mysql", "php-pgsql", "php-gd", "php-pspell", "php-snmp", "php-xmlrpc", "php-xml", "php-mbstring", "php-mcrypt", "php-pear"].each { |pkg|
@@ -93,7 +93,7 @@ EOH
93
93
  source "https://s3-us-west-2.amazonaws.com/amazon-eks/1.10.3/2018-06-05/eks-2017-11-01.normal.json"
94
94
  end
95
95
 
96
- execute "aws configure add-model --service-model file://root/.aws/eks/eks-2017-11-01.normal.json --service-name eks"
96
+ execute "aws configure add-model --service-model file:///root/.aws/eks/eks-2017-11-01.normal.json --service-name eks"
97
97
 
98
98
  execute "systemctl daemon-reload" do
99
99
  action :nothing
@@ -112,10 +112,33 @@ EOH
112
112
  notifies :restart, "service[kubelet]", :delayed
113
113
  end
114
114
 
115
+ file "/etc/systemd/system/kubelet.service.d/10-kubelet-args.conf" do
116
+ content "[Service]
117
+ Environment='KUBELET_ARGS=--node-ip=#{get_aws_metadata("meta-data/local-ipv4")} --pod-infra-container-image=602401143452.dkr.ecr.#{region}.amazonaws.com/eks/pause-amd64:3.1'"
118
+ notifies :run, "execute[systemctl daemon-reload]", :immediately
119
+ notifies :restart, "service[kubelet]", :delayed
120
+ end
121
+
122
+ template "/etc/kubernetes/kubelet/kubelet-config.json" do
123
+ source "kubelet-config.json.erb"
124
+ variables(
125
+ :dns => get_first_nameserver(),
126
+ )
127
+ notifies :restart, "service[kubelet]", :delayed
128
+ end
129
+
130
+ file "/etc/systemd/system/kubelet.service.d/30-kubelet-extra-args.conf" do
131
+ content "[Service]
132
+ Environment='KUBELET_EXTRA_ARGS=$KUBELET_EXTRA_ARGS'
133
+ "
134
+ notifies :restart, "service[kubelet]", :delayed
135
+ notifies :run, "execute[systemctl daemon-reload]", :immediately
136
+ end
137
+
115
138
  directory "/root/.kube"
116
139
 
117
140
  remote_file "/usr/bin/aws-iam-authenticator" do
118
- source "https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-07-26/bin/linux/amd64/aws-iam-authenticator"
141
+ source "https://amazon-eks.s3-us-west-2.amazonaws.com/1.12.7/2019-03-27/bin/linux/amd64/aws-iam-authenticator"
119
142
  mode 0755
120
143
  not_if "test -f /usr/bin/aws-iam-authenticator"
121
144
  end
@@ -82,7 +82,12 @@ if !node['application_attributes']['skip_recipes'].include?('nrpe')
82
82
  service "nrpe" do
83
83
  action [:enable, :start]
84
84
  end
85
-
85
+
86
+ # Workaround for Amazon Linux/Chef 14 problem in nrpe cookbook
87
+ # https://github.com/sous-chefs/nrpe/issues/96
88
+ node.normal['nrpe']['plugin_dir'] = "/usr/lib64/nagios/plugins"
89
+ node.save
90
+
86
91
  nrpe_check "check_disk" do
87
92
  command "#{node['nrpe']['plugin_dir']}/check_disk"
88
93
  warning_condition '15%'
@@ -60,6 +60,14 @@ if !node['application_attributes']['skip_recipes'].include?('set_mu_hostname')
60
60
  file "/etc/hostname" do
61
61
  content $hostname
62
62
  end
63
+ elsif node['platform'] == "amazon"
64
+ file "/etc/hostname" do
65
+ content $hostname
66
+ end
67
+ execute "set hostname" do
68
+ command "hostname #{$hostname}"
69
+ not_if "test \"`hostname`\" = \"#{$hostname}\" "
70
+ end
63
71
  else
64
72
  execute "set hostname" do
65
73
  command "hostname #{$hostname}"
@@ -6,7 +6,7 @@
6
6
  # doing only private IPs although that can be problematic
7
7
  # if the same deploy has cross VPC or cross region resources
8
8
  if n.name != @hostname %>
9
- <%= n['ipaddress'] %> <%= n.name %>
9
+ <%= n.ipaddress %> <%= n.name %>
10
10
  <%
11
11
  end
12
12
  }
@@ -3,10 +3,10 @@ clusters:
3
3
  - cluster:
4
4
  server: <%= @endpoint %>
5
5
  certificate-authority-data: <%= @cacert %>
6
- name: kubernetes
6
+ name: <%= @cluster %>
7
7
  contexts:
8
8
  - context:
9
- cluster: kubernetes
9
+ cluster: <%= @cluster %>
10
10
  user: aws
11
11
  name: aws
12
12
  current-context: aws
@@ -0,0 +1,35 @@
1
+ {
2
+ "kind": "KubeletConfiguration",
3
+ "apiVersion": "kubelet.config.k8s.io/v1beta1",
4
+ "address": "0.0.0.0",
5
+ "clusterDNS": "<%= @dns %>",
6
+ "authentication": {
7
+ "anonymous": {
8
+ "enabled": false
9
+ },
10
+ "webhook": {
11
+ "cacheTTL": "2m0s",
12
+ "enabled": true
13
+ },
14
+ "x509": {
15
+ "clientCAFile": "/etc/kubernetes/pki/ca.crt"
16
+ }
17
+ },
18
+ "authorization": {
19
+ "mode": "Webhook",
20
+ "webhook": {
21
+ "cacheAuthorizedTTL": "5m0s",
22
+ "cacheUnauthorizedTTL": "30s"
23
+ }
24
+ },
25
+ "clusterDomain": "cluster.local",
26
+ "hairpinMode": "hairpin-veth",
27
+ "cgroupDriver": "cgroupfs",
28
+ "cgroupRoot": "/",
29
+ "featureGates": {
30
+ "RotateKubeletServerCertificate": true
31
+ },
32
+ "serializeImagePulls": false,
33
+ "serverTLSBootstrap": true,
34
+ "configMapAndSecretChangeDetectionStrategy": "Cache"
35
+ }
@@ -18,16 +18,22 @@ require 'json'
18
18
  require File.realpath(File.expand_path(File.dirname(__FILE__)+"/../bin/mu-load-config.rb"))
19
19
  require 'mu'
20
20
 
21
+ credentials = if ARGV[0] and !ARGV[0].empty?
22
+ ARGV[0]
23
+ else
24
+ nil
25
+ end
26
+
21
27
  filters = [
22
28
  {
23
29
  name: "owner-id",
24
- values: [MU.account_number]
30
+ values: [MU::Cloud::AWS.credToAcct(credentials)]
25
31
  }
26
32
  ]
27
33
 
28
34
 
29
35
  MU::Cloud::AWS.listRegions.each { | r|
30
- images = MU::Cloud::AWS.ec2(r).describe_images(
36
+ images = MU::Cloud::AWS.ec2(region: r, credentials: credentials).describe_images(
31
37
  filters: filters + [{ "name" => "state", "values" => ["available"]}]
32
38
  ).images
33
39
  images.each { |ami|
@@ -39,9 +45,9 @@ MU::Cloud::AWS.listRegions.each { | r|
39
45
  end
40
46
  }
41
47
  MU.log "Deregistering #{ami.name} (#{ami.creation_date})", MU::WARN, details: snaps
42
- MU::Cloud::AWS.ec2(r).deregister_image(image_id: ami.image_id)
48
+ MU::Cloud::AWS.ec2(region: r, credentials: credentials).deregister_image(image_id: ami.image_id)
43
49
  snaps.each { |snap_id|
44
- MU::Cloud::AWS.ec2(r).delete_snapshot(snapshot_id: snap_id)
50
+ MU::Cloud::AWS.ec2(region: r, credentials: credentials).delete_snapshot(snapshot_id: snap_id)
45
51
  }
46
52
  end
47
53
  }
@@ -0,0 +1,64 @@
1
+ #!/usr/local/ruby-current/bin/ruby
2
+ # Copyright:: Copyright (c) 2019 eGlobalTech, Inc., all rights reserved
3
+ #
4
+ # Licensed under the BSD-3 license (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License in the root of the project or at
7
+ #
8
+ # http://egt-labs.com/mu/LICENSE.html
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'optimist'
17
+ require 'json'
18
+ require 'yaml'
19
+ require File.realpath(File.expand_path(File.dirname(__FILE__)+"/../bin/mu-load-config.rb"))
20
+ require 'mu'
21
+
22
+ credentials = if ARGV[0] and !ARGV[0].empty?
23
+ ARGV[0]
24
+ else
25
+ nil
26
+ end
27
+
28
+ filters = [
29
+ {
30
+ name: "owner-id",
31
+ values: [MU::Cloud::AWS.credToAcct(credentials)]
32
+ }
33
+ ]
34
+
35
+ platforms = {}
36
+
37
+ MU::Cloud::AWS.listRegions.each { | r|
38
+ images = MU::Cloud::AWS.ec2(region: r, credentials: credentials).describe_images(
39
+ filters: filters + [{ "name" => "state", "values" => ["available"]}]
40
+ ).images
41
+ images.each { |ami|
42
+ if (DateTime.now.to_time - DateTime.parse(ami.creation_date).to_time) < 15552000 and ami.name.match(/^MU-PROD-\d{10}-[A-Z]{2}-(.*)/)
43
+ platform = Regexp.last_match[1].downcase
44
+ next if !platform
45
+ platforms[platform] ||= {}
46
+ if !platforms[platform][r] or
47
+ DateTime.parse(ami.creation_date).to_time > platforms[platform][r]['date']
48
+ platforms[platform][r] = {
49
+ "date" => DateTime.parse(ami.creation_date).to_time,
50
+ "ami" => ami.image_id,
51
+ "name" => ami.name
52
+ }
53
+ end
54
+ end
55
+ }
56
+ }
57
+
58
+ platforms.each_pair { |p, r_data|
59
+ r_data.each_pair { |r, data|
60
+ r_data[r] = data["ami"]
61
+ }
62
+ }
63
+
64
+ puts platforms.to_yaml
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+
3
+ rpm -q rpm-build || yum -y install rpm-build
4
+
5
+ base="/opt/mu/lib/extras/python_rpm"
6
+
7
+ for d in BUILD BUILDROOT RPMS SOURCES SPECS SRPMS;do
8
+ mkdir -p ~/rpmbuild/$d
9
+ done
10
+ cd ~/rpmbuild
11
+
12
+ echo "Temporarily deleting /usr/local/python-current so rpmbuild can create it"
13
+ link="`readlink /usr/local/python-current`"
14
+ rm -f /usr/local/python-current
15
+ chmod 000 /usr/bin/python # otherwise this brain-dead build system tries to compile parts of itself with the wrong executable
16
+ env -i PATH="/bin:/usr/bin" /usr/bin/rpmbuild -ba $base/muthon.spec
17
+ chmod 755 /usr/bin/python
18
+ find ~/rpmbuild/ -type f -name 'muthon*' -exec ls -la {} \;
19
+ if [ "$link" != "" ];then
20
+ ln -s "$link" /usr/local/python-current
21
+ fi
@@ -0,0 +1,68 @@
1
+ Summary: Python for Mu
2
+ BuildArch: x86_64
3
+ Name: muthon
4
+ Version: 2.7.16
5
+ Release: 1%{dist}
6
+ Group: Development/Languages
7
+ License: Ruby License/GPL - see COPYING
8
+ URL: https://www.python.org/
9
+ Prefix: /opt/pythons
10
+ Source: https://www.python.org/ftp/python/%{version}/Python-%{version}.tgz
11
+
12
+ # auto-require inserts nonsensical things, like a dependency on our own
13
+ # executable, so I guess we'll declare dependencies by package ourselves
14
+ AutoReq: no
15
+ # XXX these don't work for some reason
16
+ #%global __requires_exclude ^/usr/local/bin/python$
17
+ #%global __requires_exclude ^/opt/pythons/Python-%{version}/bin/python.*$
18
+
19
+ BuildRequires: zlib-devel
20
+ BuildRequires: tcl-devel
21
+ BuildRequires: gdbm-devel
22
+ BuildRequires: openssl-devel
23
+ BuildRequires: sqlite-devel
24
+ BuildRequires: tk-devel
25
+ Requires: zlib
26
+ Requires: gdbm
27
+ Requires: tcl
28
+ Requires: openssl
29
+ Requires: glibc
30
+ Requires: ncurses-libs
31
+ Requires: sqlite
32
+ Requires: tk
33
+
34
+ %description
35
+ I was sober when I wrote this spec file
36
+
37
+ %prep
38
+ rm -rf $RPM_BUILD_DIR/Python-%{version}
39
+ rm -rf %{prefix}
40
+ test -f $RPM_SOURCE_DIR/Python-%{version}.tgz || ( cd $RPM_SOURCE_DIR && curl -O https://www.python.org/ftp/python/%{version}/Python-%{version}.tgz )
41
+ curl https://bootstrap.pypa.io/get-pip.py -o $RPM_SOURCE_DIR/get-pip.py
42
+ tar -xzvf $RPM_SOURCE_DIR/Python-%{version}.tgz
43
+ mkdir -p $RPM_BUILD_ROOT%{prefix}
44
+ rm -rf $RPM_BUILD_ROOT%{prefix}/Python-%{version}
45
+ ln -s %{prefix}/Python-%{version} $RPM_BUILD_ROOT%{prefix}/Python-%{version}
46
+
47
+ %build
48
+ cd $RPM_BUILD_DIR/Python-%{version}
49
+ mkdir -p %{prefix}/Python-%{version}
50
+ env -i PATH="/bin:/usr/bin" ./configure --prefix=%{prefix}/Python-%{version} --exec-prefix=%{prefix}/Python-%{version} --enable-shared LDFLAGS=-Wl,-rpath=%{prefix}/Python-%{version}/lib
51
+ env -i PATH="/bin:/usr/bin" make
52
+
53
+ %install
54
+ cd $RPM_BUILD_DIR/Python-%{version}
55
+ env -i PATH="/bin:/usr/bin" make install
56
+ %{prefix}/Python-%{version}/bin/python $RPM_SOURCE_DIR/get-pip.py --prefix %{prefix}/Python-%{version}/
57
+ mkdir -p $RPM_BUILD_ROOT%{prefix}
58
+ mv %{prefix}/Python-%{version} $RPM_BUILD_ROOT%{prefix}/
59
+ mkdir -p $RPM_BUILD_ROOT/usr/local/
60
+ ln -s %{prefix}/Python-%{version} $RPM_BUILD_ROOT/usr/local/python-current
61
+
62
+ %clean
63
+ cd $RPM_BUILD_DIR/Python-%{version}
64
+ make clean
65
+
66
+ %files
67
+ %{prefix}/Python-%{version}/*
68
+ /usr/local/python-current