You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
3.9 KiB
171 lines
3.9 KiB
import lxc
|
|
import os
|
|
import sys
|
|
import hashlib
|
|
import json
|
|
import getpass
|
|
import subprocess
|
|
|
|
scriptpath = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
def lxc_start(cont):
|
|
if (os.getuid() != 0):
|
|
uname = getpass.getuser()
|
|
subprocess.call([scriptpath + '/create_user_cgroup']);
|
|
for i in os.listdir('/sys/fs/cgroup'):
|
|
if (i == 'openrc'):
|
|
continue
|
|
with open('/sys/fs/cgroup/'+i+'/'+uname+'/tasks', 'a') as f:
|
|
f.write(str(os.getpid())+'\n');
|
|
|
|
cont.start();
|
|
|
|
def basic(cont):
|
|
def work(data):
|
|
print data
|
|
sys.stdout.flush()
|
|
sys.exit(0)
|
|
|
|
lxc_read, lxc_write = os.pipe()
|
|
|
|
cont.attach_wait(work, 'testtest', stdout=lxc_write)
|
|
os.close(lxc_write)
|
|
|
|
lxc_readfd = os.fdopen(lxc_read)
|
|
data = lxc_readfd.readline().rstrip('\n')
|
|
|
|
lxc_readfd.close()
|
|
|
|
print data
|
|
|
|
def basic2(cont):
|
|
def work(data):
|
|
print data
|
|
sys.stdout.flush()
|
|
sys.exit(0)
|
|
|
|
lxc_read, lxc_write = os.pipe()
|
|
|
|
cont.attach(work, 'testtest', stdout=lxc_write)
|
|
os.close(lxc_write)
|
|
|
|
lxc_readfd = os.fdopen(lxc_read)
|
|
data = lxc_readfd.readline().rstrip('\n')
|
|
|
|
lxc_readfd.close()
|
|
|
|
print data
|
|
|
|
def copy(cont, src, dest):
|
|
def work(dest):
|
|
infno = sys.stdin.fileno()
|
|
data = os.read(infno, 100)
|
|
print(data)
|
|
|
|
lxc_read, lxc_write = os.pipe()
|
|
|
|
pid = cont.attach(work, 'foo', stdin=lxc_read)
|
|
os.close(lxc_read)
|
|
|
|
os.write(lxc_write, 'fooooobadooooo')
|
|
|
|
os.close(lxc_write)
|
|
os.waitpid(pid, 0)
|
|
|
|
def copy2(cont, src, dest):
|
|
bufsize = 2048
|
|
|
|
def work(dest):
|
|
infno = sys.stdin.fileno()
|
|
with open(dest, 'w') as outfile:
|
|
data = os.read(infno, bufsize)
|
|
while (bufsize == len(data)):
|
|
outfile.write(data)
|
|
data = os.read(infno, bufsize)
|
|
outfile.write(data)
|
|
|
|
lxc_read, lxc_write = os.pipe()
|
|
|
|
pid = cont.attach(work, dest, stdin=lxc_read)
|
|
os.close(lxc_read)
|
|
|
|
with open(src, 'r') as infile:
|
|
data = infile.read(bufsize)
|
|
while (bufsize == len(data)):
|
|
os.write(lxc_write, data)
|
|
data = infile.read(bufsize)
|
|
os.write(lxc_write, data)
|
|
|
|
os.close(lxc_write)
|
|
os.waitpid(pid, 0)
|
|
|
|
def verify(cont, src, dest):
|
|
bufsize = 2048
|
|
|
|
def work(dest):
|
|
digest = ''
|
|
try:
|
|
chk = hashlib.sha1()
|
|
with open(dest, 'r') as dfile:
|
|
data = dfile.read(bufsize)
|
|
while(bufsize == len(data)):
|
|
chk.update(data)
|
|
data = dfile.read(bufsize)
|
|
chk.update(data)
|
|
digest = chk.hexdigest()
|
|
except:
|
|
pass
|
|
sys.stdout.write(digest)
|
|
sys.stdout.flush()
|
|
|
|
lxc_read, lxc_write = os.pipe()
|
|
|
|
pid = cont.attach(work, dest, stdout=lxc_write)
|
|
os.close(lxc_write)
|
|
|
|
chk = hashlib.sha1()
|
|
with open(src, 'r') as dfile:
|
|
data = dfile.read(bufsize)
|
|
while (bufsize == len(data)):
|
|
chk.update(data)
|
|
data = dfile.read(bufsize)
|
|
chk.update(data)
|
|
|
|
lxc_chk = os.read(lxc_read, 100)
|
|
os.close(lxc_read)
|
|
|
|
return json.dumps({
|
|
'equal': lxc_chk == chk.hexdigest(),
|
|
'local_sum': chk.hexdigest(),
|
|
'container_sum': lxc_chk})
|
|
|
|
cont = lxc.Container('ansible_test')
|
|
|
|
assert cont.defined
|
|
|
|
started = False
|
|
|
|
if not cont.running:
|
|
lxc_start(cont)
|
|
if not cont.wait('RUNNING', timeout=5):
|
|
raise EnvironmentError(0x01, '[lxc] unable to start container', cont)
|
|
started = True
|
|
|
|
#basic(cont)
|
|
#basic2(cont)
|
|
#copy(cont, 'verkauf.jpg', '/tmp/foo')
|
|
|
|
print __file__
|
|
print os.path.realpath(__file__)
|
|
print os.path.dirname(os.path.realpath(__file__))
|
|
|
|
vres = json.loads(verify(cont, 'verkauf.jpg', '/tmp/foo'))
|
|
if not vres['equal']:
|
|
print "copy file"
|
|
copy2(cont, 'verkauf.jpg', '/tmp/foo')
|
|
else:
|
|
print "files are equal"
|
|
|
|
if started:
|
|
cont.shutdown(5)
|
|
|