-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathset_permissions.rb
executable file
·131 lines (113 loc) · 3.17 KB
/
set_permissions.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
require 'yaml'
# `whoami` returns the name of the user running this script.
#
# If you automate this to run on startup (as root), you must put
# your literal Linux username here instead. If not, it will attempt
# to load a map from root's home, and root will get permissions, not you.
#
USERNAME = `whoami`.strip
GPIO_GROUP_NAME = "gpio"
I2C_GROUP_NAME = "i2c"
SPI_GROUP_NAME = "spi"
PWM_GROUP_NAME = "pwm"
MAP_FILENAME = ".denko_piboard_map.yml"
$added_to_group = false
# Create groups and add the user to them as needed.
def group_setup(group_name)
group_line = `egrep -i "^#{group_name}" /etc/group`
if group_line.empty?
`sudo groupadd #{group_name}`
end
unless group_line.match(/#{USERNAME}/)
`sudo usermod -aG #{group_name} #{USERNAME}`
puts "Added user #{USERNAME} to group #{group_name}. "
$added_to_group = true
else
puts "User #{USERNAME} already in group #{group_name}. "
end
end
# Change gpiochip ownership and permissions.
def setup_gpio
gpiochips = $map["pins"].each_value.map { |pin_def| pin_def["chip"] }.uniq
group_setup(GPIO_GROUP_NAME) unless gpiochips.empty?
gpiochips.each do |chip_index|
`sudo chgrp #{GPIO_GROUP_NAME} /dev/gpiochip#{chip_index}*`
`sudo chmod g+rw /dev/gpiochip#{chip_index}*`
puts "Set permissions for /dev/gpiochip#{chip_index}"
end
end
# Change I2C ownership and permissions
def setup_i2c
i2cs = $map["i2cs"].keys
group_setup(I2C_GROUP_NAME) unless i2cs.empty?
i2cs.each do |i2c_index|
dev = "/dev/i2c-#{i2c_index}"
`sudo chgrp #{I2C_GROUP_NAME} #{dev}`
`sudo chmod g+rw #{dev}`
puts "Set permissions for #{dev}"
end
end
# Change SPI ownership and permissions
def setup_spi
spis = $map["spis"].keys
group_setup(SPI_GROUP_NAME) unless spis.empty?
spis.each do |spi_index|
dev = "/dev/spidev#{spi_index}"
`sudo chgrp #{SPI_GROUP_NAME} #{dev}*`
`sudo chmod g+rw #{dev}*`
puts "Set permissions for #{dev}.*"
end
end
def setup_pwm
# Change PWM ownership and permissions
pwms = $map["pwms"]
unless pwms.empty?
group_setup(PWM_GROUP_NAME)
print "Exported and set permissions for: /sys/class/pwm/{"
end
i = 0
pwms.each_value do |hash|
i += 1
chip = hash["pwmchip"]
chan = hash["channel"]
chip_dir = "/sys/class/pwm/pwmchip#{chip}"
channel_dir = "/sys/class/pwm/pwmchip#{chip}/pwm#{chan}"
# Chip dir permissions
`sudo chgrp -RH #{PWM_GROUP_NAME} #{chip_dir}`
`sudo chmod -R g+rw #{chip_dir}`
# Export
`sudo echo #{chan} > #{chip_dir}/export` unless Dir.exist?(channel_dir)
# Channel dir permissions
`sudo chgrp -RH #{PWM_GROUP_NAME} #{channel_dir}`
`sudo chmod -R g+rw #{channel_dir}`
print channel_dir.gsub("/sys/class/pwm/", "")
print ", " unless i == pwms.length
end
puts "}"
end
# Load map
home = Dir.home(USERNAME)
yaml_path = home +"/#{MAP_FILENAME}"
$map = YAML.load_file(yaml_path)
puts
case ARGV[0]
when "gpio"
setup_gpio
when "i2c"
setup_i2c
when "spi"
setup_spi
when "pwm"
setup_pwm
else
setup_gpio
setup_i2c
setup_spi
setup_pwm
end
# Notify user
if $added_to_group
puts
puts "User #{USERNAME} has been added to new group(s). Log out, then log back in for this to take effect."
end
puts