You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.6 KiB
Python
127 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
|
|
import os, sys, pwd, glob, setuplib, subprocess
|
|
|
|
def get_uid_gid():
|
|
try:
|
|
target_user = pwd.getpwnam("pylsa")
|
|
except KeyError, e:
|
|
raise Exception("The PyLSA installation appears to have been corrupted.")
|
|
|
|
return (target_user[2], target_user[3])
|
|
|
|
def switch_user():
|
|
target_uid, target_gid = get_uid_gid()
|
|
|
|
os.setgid(target_gid)
|
|
os.setuid(target_uid)
|
|
|
|
def install(as_root=False):
|
|
try:
|
|
target_uid, target_gid = get_uid_gid()
|
|
except Exception, e:
|
|
target_uid, target_gid = (-1, -1)
|
|
|
|
if as_root == True:
|
|
target_path = "/home/pylsa/.pylsa"
|
|
else:
|
|
target_path = os.path.expanduser("~/.pylsa")
|
|
|
|
setuplib.create_directory(target_path, True, target_uid, target_gid)
|
|
setuplib.copy_file("src/daemon.py", "%s/daemon.py" % target_path, False, target_uid, target_gid)
|
|
setuplib.copy_file("pylsa.conf", "%s/pylsa.conf" % target_path, True, target_uid, target_gid)
|
|
subprocess.call(["tar", "-xzf", "psutil-0.6.1.tar.gz"])
|
|
os.chdir("psutil-0.6.1")
|
|
|
|
stfu = open("/dev/null", "w")
|
|
if subprocess.call(["python", "setup.py", "build"], stdout=stfu, stderr=stfu) != 0:
|
|
sys.stderr.write("An error occurred during compilation.\n")
|
|
exit(1)
|
|
|
|
try:
|
|
build_dir = glob.glob("build/lib.*")[0]
|
|
except IndexError, e:
|
|
sys.stderr.write("Compilation appears to have failed, exiting...\n")
|
|
exit(1)
|
|
|
|
setuplib.copy_directory(build_dir, "%s/lib" % target_path, False, target_uid, target_gid)
|
|
|
|
def add_user(uname):
|
|
# Lock /etc/passwd and /etc/group so we can safely add a user.
|
|
open("/etc/passwd.lock", "w").close()
|
|
open("/etc/group.lock", "w").close()
|
|
|
|
# Find highest non-reserved UID in the user list
|
|
passwd = open("/etc/passwd", "r+")
|
|
highest_uid = 1000
|
|
|
|
for line in passwd:
|
|
username, password, uid, gid, name, homedir, shell = line.split(":")
|
|
|
|
if username == uname:
|
|
return True
|
|
|
|
if int(uid) < 32000 and int(uid) > highest_uid:
|
|
highest_uid = int(uid)
|
|
|
|
new_uid = highest_uid + 1
|
|
|
|
# Find highest non-reserved GID in the group list - we will assume same restrictions as for UID
|
|
grp = open("/etc/group", "r+")
|
|
highest_gid = 1000
|
|
|
|
for line in grp:
|
|
groupname, password, gid, users = line.split(":")
|
|
|
|
if groupname == uname:
|
|
return True
|
|
|
|
if int(gid) < 32000 and int(gid) > highest_gid:
|
|
highest_gid = int(gid)
|
|
|
|
new_gid = highest_gid + 1
|
|
|
|
# Append new user and group
|
|
passwd.seek(0, 2)
|
|
grp.seek(0, 2)
|
|
|
|
setuplib.create_directory("/home/%s" % uname, True, new_uid, new_gid, "u+rwx g+rx")
|
|
passwd.write("%s::%d:%d::/home/cvm:/bin/false\n" % (uname, new_uid, new_gid))
|
|
grp.write("%s::%d:\n" % (uname, new_gid))
|
|
|
|
# We're done with /etc/passwd and /etc/group
|
|
passwd.close()
|
|
grp.close()
|
|
|
|
# Remove the locks on /etc/passwd and /etc/group
|
|
os.remove("/etc/passwd.lock")
|
|
os.remove("/etc/group.lock")
|
|
|
|
return True
|
|
|
|
if os.getuid() == 0:
|
|
# Script is run as root
|
|
if os.path.isdir("/home/pylsa/.pylsa"):
|
|
# Already installed, run as pylsa user
|
|
switch_user()
|
|
os.chdir("/home/pylsa/.pylsa")
|
|
exit(subprocess.call(["python", "/home/pylsa/.pylsa/daemon.py"]))
|
|
else:
|
|
# Not installed yet, install as pylsa user then run
|
|
add_user("pylsa")
|
|
install(True)
|
|
switch_user()
|
|
os.chdir("/home/pylsa/.pylsa")
|
|
exit(subprocess.call(["python", "/home/pylsa/.pylsa/daemon.py"]))
|
|
else:
|
|
# Script is run as unprivileged user
|
|
if os.path.isdir(os.path.expanduser("~/.pylsa")):
|
|
# Already installed
|
|
os.chdir(os.path.expanduser("~/.pylsa"))
|
|
exit(subprocess.call(["python", os.path.expanduser("~/.pylsa/daemon.py")]))
|
|
else:
|
|
# Not installed yet
|
|
install(False)
|
|
os.chdir(os.path.expanduser("~/.pylsa"))
|
|
exit(subprocess.call(["python", os.path.expanduser("~/.pylsa/daemon.py")]))
|