|
#!/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() |
I hacked around to fix the deb2tar issue and updated the script to merge all files into a single one, getting plugins from the unstable branch : https://gist.github.com/shagr4th/6178203
flash, pdf and nativeclient are working fine on virtualbox and the latest arnold build...
Next steps would be to test and update the google talk plugin part, if necessary, and find out why the mp3 plugin is not working