-
Notifications
You must be signed in to change notification settings - Fork 0
/
hostnameChange.py
157 lines (136 loc) · 5.7 KB
/
hostnameChange.py
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/python
#
# Script for boot time configuration
# Checks for presence of a jumper on GPIO, uses that to
# determine role in the robot network - gear or goal (turret).
# This allows us to use a single image on both RPi's.
#
# Connect GPIO 21 (pin 40) to GND (pin 39) to set it as gearPI.
# Connect GPIO 26 (pin 37) to GND (pin 39) to set it as goalPI.
# Connect no pins to set it as genericPI.
#
import os, filecmp, sys, time, logging
import RPi.GPIO as GPIO
##### CHANGE WORKING DIR #####
# We want to put our logs on any usb devices attached to the pis.
usbFound = False
time.sleep(15) # Wait for the pi to turn on so we can find the usb drive
for dirpath, dirs, files in os.walk("/media/pi"):
print('step')
if usbFound:
break
for name in dirs:
if name == 'System Volume Information':
os.path.join(dirpath, name)
os.chdir(dirpath)
usbFound = True
break
if not usbFound:
os.chdir('./Logs') # Otherwise it's nice to not clutter up the repo, so stick logs in a differnt directory
#################################
##### LOGGING INIT #####
# If we're not on command line, it's very useful to have logs of what happened
logName = time.strftime("%m-%d-%H-%M-%S-", time.gmtime()) + 'hostnamechange.log'
logging.basicConfig(filename=logName,level=logging.DEBUG)
logging.info('Log initialized')
def error():
return str(sys.exc_info()[0])
#################################
def configData(IP):
return str('#static ip\ninterface eth0\nstatic ip_address='+IP+'/24\nstatic routers=10.19.83.1\nstatic domain_name_servers=8.8.8.8 8.8.4.4\n')
try: GPIO.setmode(GPIO.BCM) # use GPIO numbering (https://pinout.xyz/ was helpful here)
except:
logging.critical('Failed to set GPIO mode ' + error())
raise
def lowPowerConfig():
os.system("/opt/vc/bin/tvservice -o");
# turn off wifi
os.system('sudo ifconfig wlan0 down')
GearSignalPin = 21
GoalSignalPin = 26
GPIO.setup(GearSignalPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # so it reads high if not grounded
GPIO.setup(GoalSignalPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # so it reads high if not grounded
gearIP = '10.19.83.6'
goalIP = '10.19.83.7'
logging.debug('gearIP: ' + gearIP + ' goalIP: ' + goalIP)
gearPI = 'gear-pi'
goalPI = 'goal-pi'
genericPI = 'generic-pi'
generic = False
# read the dhcpconf file to see if need changing
dhcpconf = '/etc/dhcpcd.conf'
with open(dhcpconf, 'r') as myfile:
try:
dhcpConfigData=myfile.read()
except:
logging.critical(error())
raise
# get the current hostname
with open('/etc/hostname','r') as myhfile:
oldHostname = myhfile.read()
if not GPIO.input(GearSignalPin):
print 'Jumper on gear pin'
desiredHostname = gearPI
desiredIP = gearIP
wrongIP = goalIP
# turn hdmi off
lowPowerConfig()
elif not GPIO.input(GoalSignalPin):
print 'Jumper on goal pin'
desiredHostname = goalPI
desiredIP = goalIP
wrongIP = gearIP
#turn hdmi off
lowPowerConfig()
else:
print 'No jumpers installed'
# do we need to revert IP and/or hostname?
if gearIP in dhcpConfigData or goalPI in oldHostname or goalIP in dhcpConfigData or goalPI in oldHostname:
if goalIP in dhcpConfigData:
print 'goalIP'
dhcpConfigData = dhcpConfigData.replace(configData(goalIP),'#generic no static')
if gearIP in dhcpConfigData:
print 'gearIP'
dhcpConfigData = dhcpConfigData.replace(configData(gearIP),'#generic no static')
with open(dhcpconf, 'w') as myfile:
myfile.write(dhcpConfigData)
# update hostname - requires changes in two locations
with open('/etc/hostname','w') as myhfile:
myhfile.write(genericPI + '\n')
with open('/etc/hosts','r') as myhostsfile:
oldhosts = myhostsfile.read()
with open('/etc/hosts','w') as myhostsfile:
myhostsfile.write(oldhosts.replace(oldHostname, genericPI + '\n'))
# restart using new config
print 'Used generic'
os.system('sudo shutdown -r now')
generic = True
# do we need to update IP and/or hostname?
if not generic:
if desiredIP not in dhcpConfigData or desiredHostname not in oldHostname:
# update dhcpconf with static IP info
if goalIP not in dhcpConfigData and gearIP not in dhcpConfigData:
# first time here, append the static IP config
dhcpConfigData += configData(desiredIP)
else:
# swap identities
dhcpConfigData = dhcpConfigData.replace(wrongIP, desiredIP)
with open(dhcpconf, 'w') as myfile:
myfile.write(dhcpConfigData)
# update hostname - requires changes in two locations
with open('/etc/hostname','w') as myhfile:
myhfile.write(desiredHostname+"\n")
with open('/etc/hosts','r+') as myhostsfile:
oldhosts = myhostsfile.read()
myhostsfile.write(oldhosts.replace(oldHostname, desiredHostname+"\n"))
# restart using new config
print 'did not use generic'
os.system('sudo shutdown -r now')
# Check for tracker daemon startup
if not os.path.exists('/lib/systemd/system/tracker.service') or not open('/lib/systemd/system/tracker.service', 'r').read() == open('/home/pi/2017VisionRecognition/tracker.service', 'r').read() :
print 'updating tracker startup daemon'
os.system("cp -f /home/pi/2017VisionRecognition/tracker.service /lib/systemd/system/tracker.service")
os.system("chmod 755 /lib/systemd/system/tracker.service")
os.system("systemctl daemon-reload")
os.system("systemctl enable tracker.service")
os.system('sudo shutdown -r now')