mirror of https://github.com/lukechilds/umbrel.git
BT
5 years ago
committed by
GitHub
2 changed files with 229 additions and 1 deletions
@ -0,0 +1,228 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
''' |
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
||||
|
OTHER DEALINGS IN THE SOFTWARE. |
||||
|
''' |
||||
|
|
||||
|
''' |
||||
|
Libraries should be system standard libraries if possible |
||||
|
''' |
||||
|
|
||||
|
import os |
||||
|
import sys |
||||
|
import glob |
||||
|
import re |
||||
|
|
||||
|
usb_dev_pattern = ['sd.*'] |
||||
|
usb_part_pattern = ['sd.[1-9]*'] |
||||
|
sd_dev_pattern = ['mmcblk*'] |
||||
|
sd_part_pattern = ['mmcblk.p[1-9]*'] |
||||
|
|
||||
|
def dev_size(device): |
||||
|
path = '/sys/block/' |
||||
|
num_sectors = open(path + device + '/size').read().rstrip('\n') |
||||
|
sector_size = open(path + device + '/queue/hw_sector_size').read().rstrip('\n') |
||||
|
return (int(num_sectors)*int(sector_size)) |
||||
|
|
||||
|
def usb_devs(): |
||||
|
devices = [] |
||||
|
for device in glob.glob('/sys/block/*'): |
||||
|
for pattern in usb_dev_pattern: |
||||
|
if re.compile(pattern).match(os.path.basename(device)): |
||||
|
devices.append(os.path.basename(device)) |
||||
|
return devices |
||||
|
|
||||
|
def usb_partitions(): |
||||
|
partitions = [] |
||||
|
for device in usb_devs(): |
||||
|
for partition in glob.glob('/sys/block/' + str(device) + '/*'): |
||||
|
for pattern in usb_part_pattern: |
||||
|
if re.compile(pattern).match(os.path.basename(partition)): |
||||
|
partitions.append(os.path.basename(partition)) |
||||
|
return partitions |
||||
|
|
||||
|
def usb_part_size(partition): |
||||
|
try: |
||||
|
path = '/sys/block/' |
||||
|
device = partition[:-1] |
||||
|
num_sectors = open(path + device + '/' + partition + '/size').read().rstrip('\n') |
||||
|
sector_size = open(path + device + '/queue/hw_sector_size').read().rstrip('\n') |
||||
|
except TypeError: |
||||
|
print("Not enough USB devices available") |
||||
|
sys.exit(1) |
||||
|
else: |
||||
|
return (int(num_sectors)*int(sector_size)) |
||||
|
|
||||
|
def uuid_table(): |
||||
|
device_table = os.popen('blkid').read().splitlines() |
||||
|
devices = {} |
||||
|
for device in device_table: |
||||
|
dev = device.split(":")[0].split("/")[2] |
||||
|
uuid = device.split('"')[1] |
||||
|
devices[dev] = uuid |
||||
|
return devices |
||||
|
|
||||
|
def get_uuid(device): |
||||
|
uuids = uuid_table() |
||||
|
return str(uuids[device]) |
||||
|
|
||||
|
def usb_partition_table(): |
||||
|
table = {} |
||||
|
for partition in usb_partitions(): |
||||
|
table[partition] = int(usb_part_size(partition)) |
||||
|
return table |
||||
|
|
||||
|
''' |
||||
|
Main Entrypoint |
||||
|
''' |
||||
|
|
||||
|
def main(): |
||||
|
print('USB Configuration script') |
||||
|
homedirpath = os.path.expanduser("~umbrel") |
||||
|
''' |
||||
|
If /mnt/data doesn't exist |
||||
|
''' |
||||
|
if not os.path.exists('/mnt/data'): |
||||
|
print('Creating data mount') |
||||
|
os.mkdir('/mnt/data') |
||||
|
else: |
||||
|
print('Data mount exists') |
||||
|
|
||||
|
|
||||
|
if len(usb_devs()) == 1: |
||||
|
if len(usb_partitions()) == 1: |
||||
|
try: |
||||
|
os.system('/bin/mount /dev/' + usb_partitions()[0] + ' /mnt/data') |
||||
|
# if .rekt exists or bitcoin directory doesnt exist (because the drive is a factory default) |
||||
|
# then wipe the drive and format it with EXT4 |
||||
|
if os.path.exists('/mnt/data/.rekt') or not os.path.exists('/mnt/data/bitcoin'): |
||||
|
print('REKT file exists OR bitcoin folder not found... So lets format it') |
||||
|
# unmount before format |
||||
|
os.system('/bin/umount /mnt/data') |
||||
|
print('Initializing filesystem') |
||||
|
os.system('/sbin/mkfs.ext4 -F /dev/' + usb_partitions()[0]) |
||||
|
# remount |
||||
|
os.system('/bin/mount -t ext4 /dev/' + usb_partitions()[0] + ' /mnt/data') |
||||
|
''' |
||||
|
Get Size of SDA and partition info |
||||
|
''' |
||||
|
first_part = dev_size('sda') / (1000*1000) |
||||
|
prune_setting = int(first_part / 2) |
||||
|
|
||||
|
if first_part < 512000: |
||||
|
print("Pruning the config, because drive is less than 512 GB") |
||||
|
os.system('/bin/sed -i "s/prune=550/prune=' + str(prune_setting) + '/g;" ' + str(homedirpath) + '/bitcoin/bitcoin.conf') |
||||
|
else: |
||||
|
print("Switching off pruning, and turn on txindex") |
||||
|
os.system('/bin/sed -i "s/prune=550/#prune=550/g;" ' + str(homedirpath) + '/bitcoin/bitcoin.conf') |
||||
|
os.system('/bin/sed -i "s/#txindex=1/txindex=1/g;" ' + str(homedirpath) + '/bitcoin/bitcoin.conf') |
||||
|
|
||||
|
''' |
||||
|
Setup secrets, db, bitcoin, nginx, and lnd directory.. as a new install |
||||
|
''' |
||||
|
print('Setup secrets, db, bitcoin, nginx, and lnd directory.. as a new install') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/secrets /mnt/data') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/db /mnt/data') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/bitcoin /mnt/data') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/lnd /mnt/data') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/nginx /mnt/data') |
||||
|
|
||||
|
if not os.path.exists('/mnt/data/swap'): |
||||
|
print('Add swap to partition') |
||||
|
os.system('sed -i "/CONF_SWAPFILE/s/^#//g; " /etc/dphys-swapfile') |
||||
|
os.system('sed -i "s/\/var\/swap/\/mnt\/data\/swap/g; " /etc/dphys-swapfile') |
||||
|
os.system('sed -i "s/CONF_SWAPSIZE=100/CONF_SWAPSIZE=2000/g; " /etc/dphys-swapfile') |
||||
|
print('Restarting dphys swapfile') |
||||
|
os.system('/etc/init.d/dphys-swapfile restart') |
||||
|
|
||||
|
else: |
||||
|
''' |
||||
|
No need to do anything |
||||
|
''' |
||||
|
print('REKT file does not exist OR bitcoin folder exists so we will preserve it. But lets check for all the other folders') |
||||
|
|
||||
|
''' |
||||
|
Check other folders in partition3 |
||||
|
- secrets |
||||
|
- db |
||||
|
- lnd |
||||
|
- nginx |
||||
|
''' |
||||
|
# Secrets folder |
||||
|
if not os.path.exists('/mnt/data/secrets'): |
||||
|
print('secrets folder does\'nt exist!') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/secrets /mnt/data') |
||||
|
|
||||
|
# db folder |
||||
|
if not os.path.exists('/mnt/data/db'): |
||||
|
print('db folder does\'nt exist!') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/db /mnt/data') |
||||
|
|
||||
|
# Check LND folder |
||||
|
if not os.path.exists('/mnt/data/lnd'): |
||||
|
print('lnd folder does\'nt exist!') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/lnd /mnt/data') |
||||
|
|
||||
|
# Check nginx folder |
||||
|
if not os.path.exists('/mnt/data/nginx'): |
||||
|
print('nginx folder does\'nt exist!') |
||||
|
os.system('/bin/cp -fr ' + homedirpath + '/nginx /mnt/data') |
||||
|
|
||||
|
|
||||
|
print('Unmounting partition') |
||||
|
os.system('/bin/umount /mnt/data') |
||||
|
except: |
||||
|
print("Error mounting the directory") |
||||
|
|
||||
|
|
||||
|
# If volume not mounted |
||||
|
if not os.path.exists(' /mnt/data/lost+found'): |
||||
|
os.system('/bin/mount -t ext4 /dev/sda1 /mnt/data') |
||||
|
|
||||
|
# Get UUID of the partition we just created |
||||
|
partitions = usb_partitions() |
||||
|
first_partition_uuid = get_uuid(partitions[0]) |
||||
|
|
||||
|
print('Setup filesystem permissions (UID=1000 GID=1000)') |
||||
|
os.system('/bin/chown -R 1000.1000 /mnt/data') |
||||
|
|
||||
|
print('Unmounting partition') |
||||
|
os.system('/bin/umount /mnt/data') |
||||
|
|
||||
|
print('Update /etc/fstab') |
||||
|
os.system('echo "UUID=' + first_partition_uuid + ' /mnt/data ext4 defaults,noatime 0 0" >> /etc/fstab') |
||||
|
|
||||
|
print('Remounting through /bin/mount') |
||||
|
os.system('/bin/mount -a'); |
||||
|
|
||||
|
print('Remove old folders (after copying)') |
||||
|
os.system('/bin/rm -fr ' + homedirpath + '/secrets') |
||||
|
os.system('/bin/rm -fr ' + homedirpath + '/db') |
||||
|
os.system('/bin/rm -fr ' + homedirpath + '/bitcoin') |
||||
|
os.system('/bin/rm -fr ' + homedirpath + '/lnd') |
||||
|
os.system('/bin/rm -fr ' + homedirpath + '/nginx') |
||||
|
print('Set up symlinks') |
||||
|
os.system('/bin/ln -s /mnt/data/secrets ' + homedirpath + '/secrets') |
||||
|
os.system('/bin/ln -s /mnt/data/db ' + homedirpath + '/db') |
||||
|
os.system('/bin/ln -s /mnt/data/bitcoin ' + homedirpath + '/bitcoin') |
||||
|
os.system('/bin/ln -s /mnt/data/lnd ' + homedirpath + '/lnd') |
||||
|
os.system('/bin/ln -s /mnt/data/nginx ' + homedirpath + '/nginx') |
||||
|
else: |
||||
|
print('No drives or unexpected number of drives detected!') |
||||
|
|
||||
|
''' |
||||
|
Actual entrypoint |
||||
|
''' |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
# Check if root |
||||
|
if os.geteuid() == 0: |
||||
|
main() |
||||
|
else: |
||||
|
print("Must run as root (UID 0)") |
Loading…
Reference in new issue