-
Notifications
You must be signed in to change notification settings - Fork 29
/
tasks.py
95 lines (82 loc) · 2.73 KB
/
tasks.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
import boto3
from invoke import task
import os.path
from collections import defaultdict
from jinja2 import Template
import random
import subprocess
import shlex
import threading
import zipfile
import datetime
import platform
import json
import tempfile
import re
S3_BUCKET='ai2-vision-robosims'
def pci_records():
records = []
command = shlex.split('lspci -vmm')
output = subprocess.check_output(command).decode()
for devices in output.strip().split("\n\n"):
record = {}
records.append(record)
for row in devices.split("\n"):
key, value = row.split("\t")
record[key.split(':')[0]] = value
return records
def generate_xorg_conf(devices, device_num, display):
xorg_conf = []
device_section = """
Section "Device"
Identifier "Device{device_id}"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "{bus_id}"
EndSection
"""
server_layout_section = """
Section "ServerLayout"
Identifier "Layout0"
{screen_records}
EndSection
"""
screen_section = """
Section "Screen"
Identifier "Screen{screen_id}"
Device "Device{device_id}"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
SubSection "Display"
Depth 24
Virtual 1024 768
EndSubSection
EndSection
"""
screen_records = []
device = devices[int(device_num)]
bus_id = 'PCI:' + ':'.join(map(lambda x: str(int(x, 16)), re.split(r'[:\.]', device['Slot'])))
xorg_conf.append(device_section.format(device_id=display, bus_id=bus_id))
xorg_conf.append(screen_section.format(device_id=display, screen_id=display))
screen_records.append('Screen {screen_id} "Screen{screen_id}" 0 0'.format(screen_id=display))
xorg_conf.append(server_layout_section.format(screen_records="\n ".join(screen_records)))
return "\n".join(xorg_conf)
@task
def startx(context, device_num, display):
import os
display = int(display)
if platform.system() != 'Linux':
raise Exception("Can only run startx on linux")
records = list(filter(lambda r: r.get('Vendor', '') == 'NVIDIA Corporation' and r['Class'] in ['VGA compatible controller', '3D controller'], pci_records()))
if not records:
raise Exception("no nvidia cards found")
try:
fd, path = tempfile.mkstemp()
with open(path, "w") as f:
f.write(generate_xorg_conf(records, device_num, display))
print(generate_xorg_conf(records, device_num, display))
command = shlex.split("sudo Xorg -noreset +extension GLX +extension RANDR +extension RENDER -config %s :%d" % (path, display))
subprocess.call(command)
finally:
os.close(fd)
os.unlink(path)