Commit 4cb1d768 authored by jocelyn's avatar jocelyn

le setup.py fait maintenant office d'assistant total d'installation



git-svn-id: file:///mnt/marvin-var/svn/magneto/trunk@85 f61d8a82-367e-4513-8f0b-2a88b49b8d76
parent 7d5a34ae
......@@ -9,7 +9,7 @@
## Base de données
#
DB_BACKEND = 'postgres' # Can be mysql|postrges
DB_HOST = 'localhost'
DB_HOST = 'localhost'
DB_NAME = 'magneto_db'
DB_USER = 'magneto'
DB_PASSWORD = 'magneto'
......@@ -27,11 +27,14 @@ PROJECT_PATH="/usr/share/magneto"
# Localisation des utilitaires:
UTILS_PATH="/usr/bin"
# Où seront stockées les données ?
DATA_PATH="/var/magneto"
# Où seront stockées les vidéos sur le disque ?
VIDEO_PATH="/var/magneto/videos/"
VIDEO_PATH=DATA_PATH + "/videos"
# Où seront stockées les images sur le disque ?
THUMBS_PATH="/var/magneto/thumbs/"
THUMBS_PATH=DATA_PATH + "/thumbs"
#
## URL(s)
......
......@@ -3,35 +3,31 @@
import os
import sys
from setuptools import setup, find_packages
import shutil
import pexpect
root_dir = 'share'
data_files = []
for dirpath, dirnames, filenames in os.walk(root_dir):
for i, dirname in enumerate(dirnames):
if dirname.startswith('.'): del dirnames[i]
else:
data_files.append((dirpath, [os.path.join(dirpath, f) for f in filenames]))
from setuptools import setup, find_packages, Command
import psycopg
utils = ['utils/'+i for i in os.listdir('utils') if i.endswith(".py")]
def draw_line():
print "-" * 78
class MagnetoCommand(Command):
user_options = []
class InstallConf(Command):
"""
"""
description = "set the database up, detect channels and cards, and make "
user_options = tuple()
def initialize_options(self):
"""init options"""
import magneto.conf as self.conf
# Cette ligne n'est pas au début du fichier car elle
# risquerait l'échec pour avant que « install » soit fait.
import magneto.conf
self.conf = magneto.conf
def build_db(self):
build_db = os.path.join(self.conf.UTILS_PATH, 'build_db.py')
os.system(build_db)
def finalize_options(self):
pass
def set_lighty_conf(self):
class SetupLighty(MagnetoCommand):
description = "Configure lighttpd pour magneto"
def run(self):
LIGHTY_MODULES='/etc/lighttpd/conf-available'
EXAMPLE_CONF='./doc/httpd-conf-examples/lighttpd/20-magneto-cgi.conf'
......@@ -42,21 +38,139 @@ class InstallConf(Command):
else:
print "ATTENTION: pas d'installation de lighttpd détectée"
class InstallConf(MagnetoCommand):
description = "Installe le fichier de configuration de magneto dans /etc/magneto/conf.py"
def finalize_options(self):
"""finalize options"""
def run(self):
conf_dir = '/etc/magneto'
conf_file = 'conf.py'
conf_path = conf_dir + '/' + conf_file
if not os.path.exists(conf_dir):
os.mkdir(conf_dir)
shutil.copy('./doc/conf.py.example', conf_path)
print "%s installé" % conf_path
class MakeDirs(MagnetoCommand):
description = "Crée les répertoires nécessaires au fonctionnement de magneto (ex: répertoire des vidéos)."
def run(self):
"""runner"""
print "Création des répertoires de magneto :"
for path in (self.conf.VIDEO_PATH, self.conf.TMP_PATH, self.conf.THUMBS_PATH):
if not os.path.exists(path):
print "création de %s" % path
os.makedirs(path)
else:
print "%s existe déjà" % path
class BuildDb(MagnetoCommand):
description = \
"""
Crée les tables et éventuelement la base de données et
l'utilisateur SQL. Ne fonctionne que si la base est locale.
"""
user_options = [
('force','f', 'Recrée les tables même si elles existent déjà')
]
def initialize_options(self):
MagnetoCommand.initialize_options(self)
self.force=False
def run(self):
print 'Création de l\'utilisateur "%s"' % self.conf.DB_USER
if self.create_user() != 0:
print "Échec, l'utilisateur existe peut-être déjà"
print; draw_line(); print
print 'Création de la base "%s"' % self.conf.DB_NAME
if self.create_db() != 0:
print "Échec, la base existe peut-être déjà"
print; draw_line(); print
print "Construction des tables :"
self.create_tables(self.force)
def create_user(self):
print 'sudo -u postgres createuser -S -D -R -P %s' %\
self.conf.DB_USER
createuser = pexpect.spawn('sudo -u postgres createuser -S -D -R -P %s' %\
self.conf.DB_USER)
# Revient à tapper le mdp deux fois:
createuser.expect(':')
createuser.sendline(self.conf.DB_PASSWORD)
createuser.expect(':')
createuser.sendline(self.conf.DB_PASSWORD)
if createuser.isalive():
createuser.wait()
createuser.close()
return createuser.exitstatus
def create_db(self):
return os.system('su postgres -c "createdb -O %s %s"' %\
(self.conf.DB_USER, self.conf.DB_NAME))
def create_table(self, model, force=False):
try:
if force:
print "mode forcé : on recrée la table"
model.dropTable(True,True, True)
model.createTable(ifNotExists=True)
except psycopg.OperationalError, e:
raise
except psycopg.ProgrammingError, e:
if force:
model.dropTable(True, True, True)
model.createTable()
def create_tables(self, force=False):
import magneto.core.models
sql_objects = (magneto.core.models.TvCard,
magneto.core.models.TvChannel,
magneto.core.models.Schedule,
)
print "Paramètres SQL"
print " backend: %s" % self.conf.DB_BACKEND
print " hôte: %s" % self.conf.DB_HOST
print " utilisateur: %s" % self.conf.DB_USER
print " mot de passe: %s" % (len(self.conf.DB_PASSWORD)*'*')
draw_line()
for model in sql_objects:
print "Creating table for %s" % model
try:
self.create_table(model, force=force)
print "OK."
except Exception, e:
print "FAILED. \n %s " % e
break
print "Les tables ont été créées."
root_dir = 'share'
data_files = []
for dirpath, dirnames, filenames in os.walk(root_dir):
for i, dirname in enumerate(dirnames):
if dirname.startswith('.'): del dirnames[i]
else:
data_files.append((dirpath, [os.path.join(dirpath, f) for f in filenames]))
all_utils = ['utils/'+i for i in os.listdir('utils') if i.endswith(".py")]
setup(
name = "magneto",
version = "0.1",
packages = find_packages(),
scripts = utils,
scripts = all_utils,
install_requires = ['sqlobject>=0.3', 'jinja'],
data_files = data_files,
......@@ -67,5 +181,12 @@ setup(
description = "Le magnétoscope numérique permet l'enregistremment programmé d'émissions de TV",
license = "GPL",
keywords = "magneto vcr record streaming vlc",
url = "http://magneto.crapouillou.net", # project home page
url = "http://magneto.crapouillou.net",
cmdclass = {
"install_conf": InstallConf,
"setup_lighty": SetupLighty,
"make_dirs": MakeDirs,
"build_db": BuildDb
}
)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# build_db.py : construit la base de données.
# On considère que l'utilisateur et la base sont déjà créés.
#
# SYNOPSIS:
# ./build_db.py [-f]
#
# -f Si une table avec ce nom existe déjà, elle sera écrasée.
import sys
import os
import psycopg
from magneto import conf
import magneto.core.models
### Données ###
sql_objects = (magneto.core.models.TvCard,
magneto.core.models.TvChannel,
magneto.core.models.Schedule,
)
passwd_shaddow = len(conf.DB_PASSWORD)*'*'
### Fonctions ###
def create_table(model, force=False):
try:
if force:
model.dropTable(True,True, True)
model.createTable(ifNotExists=True)
except psycopg.OperationalError, e:
raise
except psycopg.ProgrammingError, e:
if force:
model.dropTable(True, True, True)
model.createTable()
#### Début du script ####
def main(force=False):
print "-"*80
print "Construction de la base de données."
print "-"*80
print "Paramètres SQL"
print " backend: %s" % conf.DB_BACKEND
print " hôte: %s" % conf.DB_HOST
print " utilisateur: %s" % conf.DB_USER
print " mot de passe: %s" % passwd_shaddow
print "-"*80
for model in sql_objects:
print "Creating table for %s" % model
try:
create_table(model, force=force)
print "OK."
except Exception, e:
print "FAILED."
print e
break
print "Création des répertoires de magneto :"
for path in (conf.VIDEO_PATH, conf.TMP_PATH, conf.THUMBS_PATH):
if not os.path.exists(path):
print "création de %s" % path
os.makedirs(path)
print "Fini."
if __name__ == '__main__':
#### Traitement des arguments ###
force = '-f' in sys.argv
main(force=force)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment