|
#!/usr/bin/python |
|
# -*- coding: utf-8 -*- |
|
|
|
from bs4 import BeautifulSoup |
|
import urllib |
|
import re |
|
import shlex |
|
import subprocess |
|
from urlparse import parse_qs |
|
import httplib |
|
from urlparse import urlparse |
|
import os |
|
import time |
|
|
|
debug = False |
|
|
|
soup = BeautifulSoup(urllib.urlopen('http://chromeos.hexxeh.net/').read()) |
|
|
|
|
|
## {{{ http://code.activestate.com/recipes/541096/ (r1) |
|
|
|
def confirm(prompt=None, resp=False): |
|
"""prompts for yes or no response from the user. Returns True for yes and |
|
False for no. |
|
|
|
'resp' should be set to the default value assumed by the caller when |
|
user simply types ENTER. |
|
|
|
>>> confirm(prompt='Create Directory?', resp=True) |
|
Create Directory? [y]|n: |
|
True |
|
>>> confirm(prompt='Create Directory?', resp=False) |
|
Create Directory? [n]|y: |
|
False |
|
>>> confirm(prompt='Create Directory?', resp=False) |
|
Create Directory? [n]|y: y |
|
True |
|
|
|
""" |
|
|
|
if prompt is None: |
|
prompt = 'Confirm' |
|
|
|
if resp: |
|
prompt = '%s [%s]|%s: ' % (prompt, 'y', 'n') |
|
else: |
|
prompt = '%s [%s]|%s: ' % (prompt, 'n', 'y') |
|
|
|
while True: |
|
ans = raw_input(prompt) |
|
if not ans: |
|
return resp |
|
if ans not in ['y', 'Y', 'n', 'N']: |
|
print 'please enter y or n.' |
|
continue |
|
if ans == 'y' or ans == 'Y': |
|
return True |
|
if ans == 'n' or ans == 'N': |
|
return False |
|
|
|
|
|
## end of http://code.activestate.com/recipes/541096/ }}} |
|
|
|
def get_head(name, req): |
|
url = urlparse(req) |
|
conn = httplib.HTTPConnection(url.netloc) |
|
conn.request('HEAD', url.path + '?' + url.query) |
|
res = conn.getresponse() |
|
|
|
return res.getheader(name) |
|
|
|
|
|
def run(cmd, d=False, shell=False): |
|
|
|
# print 'cwd', os.path.dirname(os.path.abspath(__file__)) |
|
|
|
print cmd |
|
if not debug or d: |
|
proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
|
shell=False) |
|
(curlstdout, curlstderr) = proc.communicate() |
|
|
|
# print '|', curlstdout + curlstderr, '|' |
|
|
|
return curlstdout + curlstderr |
|
|
|
|
|
def find_croot(): |
|
|
|
disk = run('bash -c "ls /dev/disk/by-label/ -all | grep C-ROOT"', True).split('/') |
|
print 'C-ROOT is :', disk[len(disk) - 1] |
|
if confirm(prompt='Is this correct?', resp=True): |
|
return disk[len(disk) - 1] |
|
else: |
|
return input('Enter correct disk? (sdd5)?') |
|
|
|
|
|
def unzip(verzija): |
|
run('unzip ' + verzija + '-chromeos.zip') |
|
|
|
|
|
def kpartx(verzija): |
|
|
|
# http://blog.vodkamelone.de/archives/137-Mounting-a-disk-image-containing-several-partitions.html |
|
|
|
disk = find_croot() |
|
run('kpartx -a -v ChromeOS-Vanilla-' + verzija + '.img') |
|
time.sleep(5) |
|
run('dd if=/dev/mapper/loop0p3 of=/dev/' + disk) |
|
time.sleep(5) |
|
run('fsck /dev/' + disk + ' -fy') |
|
time.sleep(5) |
|
|
|
# run('mount /dev/mapper/loop0p3 /mnt/ -o loop,ro') |
|
# Time.sleep(5) |
|
# run('bash -c "cd /mnt; tar cvf ' + loc + '/chromeos.tar opt/"') |
|
# time.sleep(5) |
|
# run('umount /mnt/') |
|
# time.sleep(5) |
|
|
|
run('kpartx -d -v ChromeOS-Vanilla-' + verzija + '.img') |
|
|
|
|
|
def curl(zip_image, verzija): |
|
run('curl -C - -z ' + verzija + '-chromeos.zip -L ' + zip_image + ' -o ' + verzija |
|
+ '-chromeos.zip') |
|
|
|
|
|
def get_version(lin): |
|
url = parse_qs(lin['href']) |
|
return str(url['build'][0]) |
|
|
|
|
|
def main(): |
|
|
|
# http://chromeos.hexxeh.net/download.php?track=vanilla&build=2556.0.2012_07_07_1636-rccf8f959&type=usb |
|
|
|
linki = soup.find_all(href=re.compile('track=vanilla.+type=usb')) |
|
i = 1 |
|
for lin in linki: |
|
|
|
print '(', i, ')', get_version(lin) |
|
i += 1 |
|
|
|
# break |
|
|
|
verzija = get_version(linki[int(input('Choose version to download?')) - 1]) |
|
|
|
zip_image = get_head('location', 'http://chromeos.hexxeh.net/download.php?track=vanilla&build=' |
|
+ verzija + '&type=usb') |
|
size = int(get_head('content-length', zip_image)) |
|
try: |
|
size_local = int(os.stat(verzija + '-chromeos.zip').st_size) |
|
except Exception: |
|
size_local = 0 |
|
|
|
print 'size', size |
|
print 'size local', size_local |
|
if size != size_local: |
|
curl(zip_image, verzija) |
|
unzip(verzija) |
|
kpartx(verzija) |
|
|
|
|
|
# http://distribution.hexxeh.net/archive/vanilla/2591.0.2012_07_13_1633-rd712ae90/ChromeOS-Vanilla-2591.0.2012_07_13_1633-rd712ae90.zip |
|
|
|
if __name__ == '__main__': |
|
main() |
@MiguelAO1029 audio support has been disabled at compile time, currently there is no way to enable it. Flash works and as many sites use Flash as fallback for MP3,MP4 it will work just fine.