forked from lewagon/setup
-
Notifications
You must be signed in to change notification settings - Fork 0
/
check.rb
executable file
·136 lines (126 loc) · 5.01 KB
/
check.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
require 'io/console'
begin
require "colored"
require "octokit"
rescue LoadError
puts "Could not find all needed gems. Please run `bundle install` and retry"
exit
end
require "json"
require "open-uri"
REQUIRED_RUBY_VERSION = "2.6.6"
REQUIRED_GIT_VERSION = "2.0"
MINIMUM_AVATAR_SIZE = 2 * 1024
GITHUB_AUTHORIZATION_NOTE = 'Le Wagon setup check'.freeze
$all_good = true
def check(label, &block)
puts "Checking #{label}..."
result, message = yield
$all_good = $all_good && result
puts result ? "[OK] #{message}".green : "[KO] #{message}".red
end
def check_all
check("shell") do
if ENV["SHELL"].match(/zsh/)
[ true, "Your default shell is zsh"]
else
[ false, "Your default shell is #{ENV["SHELL"]}, but should be zsh"]
end
end
check("ruby version") do
if RUBY_VERSION == REQUIRED_RUBY_VERSION
[ true, "Your default ruby version is #{RUBY_VERSION}" ]
else
details = `type -a ruby`
[ false, "Your default ruby version is #{RUBY_VERSION}, but should be #{REQUIRED_RUBY_VERSION}. Did you run `rbenv global #{REQUIRED_RUBY_VERSION}`?\n#{details}---" ]
end
end
check("git version") do
version_tokens = `git --version`.gsub("git version", "").strip.split(".").map(&:to_i)
required_version_tokens = REQUIRED_GIT_VERSION.split(".").map(&:to_i)
if version_tokens.first == required_version_tokens.first && version_tokens[1] >= required_version_tokens[1]
[ true, "Your default git version is #{version_tokens.join(".")}"]
else
[ false, "Your default git version is outdated: #{version_tokens.join(".")}"]
end
end
check("GitHub setup") do
begin
groups = `ssh -T git@github.com 2>&1`.match(/Hi (?<nickname>.*)! You've successfully authenticated/)
git_email = (`git config --global user.email`).chomp
nickname = groups["nickname"]
client = Octokit::Client.new
client.login = nickname
puts "Please type in your GitHub password (login: '#{nickname}'):"
print "> "
client.password = STDIN.noecho { |stdin| stdin.gets.chomp }
puts "\nThanks. Asking some infos to GitHub..."
begin
# This will create a Basic Auth
authorization =
client.create_authorization(
scopes: ['user:email'],
note: GITHUB_AUTHORIZATION_NOTE)
avatar_url = client.user[:avatar_url]
emails = client.emails.map { |email| email[:email] }
rescue Octokit::OneTimePasswordRequired => e # Rescue if user has 2FA enabled
puts "You have two Factor Authentication enabled on your Github account, please enter the 6 digits code you just received"
print "> "
otp_code = gets.chomp
# This will create a 2FA Auth
authorization = client.create_authorization(
scopes: ['user:email'],
note: GITHUB_AUTHORIZATION_NOTE,
headers: { 'X-GitHub-OTP': otp_code })
# Using access_token to retrieve info whilst preserving basic auth client for delete_authorization later on
client2 = Octokit::Client.new(access_token: authorization["token"])
avatar_url = client2.user[:avatar_url]
emails = client2.emails.map { |email| email[:email] }
end
# Delete_authorization can only be accessed using Basic Auth
client.delete_authorization(authorization[:id], headers: {'X-GitHub-OTP': otp_code})
if emails.include?(git_email)
content_length = `curl -s -I #{avatar_url} | grep 'Content-Length:'`.strip.gsub("Content-Length: ", "").to_i
if content_length >= MINIMUM_AVATAR_SIZE
[ true, "GitHub email config is OK. And you have a profile picture 📸"]
else
[ false, "You don't have any profile picture set.\nIt's important, go to github.com/settings/profile and upload a picture right now."]
end
else
[ false,
"Your git email is '#{git_email}' and is not listed in https://github.com/settings/emails\n" +
"Run `git config --global user.email george@abitbol.com` to set your git email address. With your own!"]
end
rescue Octokit::Unauthorized => e
puts "Wrong GitHub password, please try again 🙏 Details: #{e.message}"
exit 1
end
end
check("git editor setup") do
editor = `git config --global core.editor`
if editor.match(/subl/i)
[ true, "Sublime Text is your default git editor"]
else
[ false, "Ask a teacher to check your ~/.gitconfig editor setup. Right now, it's `#{editor.chomp}`"]
end
end
check("ruby gems") do
if (`which rspec`) != "" && (`which rubocop`) != ""
[ true, "Everything's fine"]
else
[ false, "Rspec and Rubocop gems aren't there. Did you run the `gem install ...` command?"]
end
end
end
def outro
if $all_good
puts ""
puts "🚀 Awesome! Your laptop is now ready for weeks of hard work :)".green
puts "Now it's time to onboard on the Alumni platform 👉 kitt.lewagon.com/onboarding"
else
puts ""
puts "😥 Bummer! Something's wrong, if you're stuck, ask a teacher.".red
end
end
check_all
outro