CC-5990, CC-5991 - Python cleanup, removed need for /usr/lib/airtime

This commit is contained in:
Duncan Sommerville 2015-01-27 18:43:36 -05:00
parent cd102b984b
commit 875a9dfd8b
115 changed files with 248 additions and 212 deletions

View File

@ -124,7 +124,7 @@ function checkRMQConnection() {
* @return boolean true if airtime-media-monitor is running
*/
function checkMediaMonitorService() {
exec("pgrep -fx 'python /usr/lib/airtime/media-monitor/media_monitor.py'", $out, $status);
exec("pgrep -f -u www-data media_monitor", $out, $status);
if (array_key_exists(0, $out) && $status == 0) {
return posix_kill(rtrim($out[0]), 0);
}
@ -137,7 +137,7 @@ function checkMediaMonitorService() {
* @return boolean true if airtime-playout is running
*/
function checkPlayoutService() {
exec("pgrep -fx 'python /usr/lib/airtime/pypo/bin/pypocli.py'", $out, $status);
exec("pgrep -f -u www-data pypo", $out, $status);
if (array_key_exists(0, $out) && $status == 0) {
return posix_kill(rtrim($out[0]), 0);
}
@ -150,7 +150,7 @@ function checkPlayoutService() {
* @return boolean true if airtime-liquidsoap is running
*/
function checkLiquidsoapService() {
exec("pgrep -fx '/usr/bin/airtime-liquidsoap --verbose -f /usr/lib/airtime/pypo/bin/liquidsoap_scripts/ls_script.liq'", $out, $status);
exec("pgrep -f -u www-data airtime-liquidsoap", $out, $status);
if (array_key_exists(0, $out) && $status == 0) {
return posix_kill(rtrim($out[0]), 0);
}

33
install
View File

@ -252,7 +252,10 @@ if [ -f /etc/airtime/airtime.conf ]; then
will be moved to /etc/airtime/airtime.conf.tmp"
# If we don't remove the existing python files in /usr/lib and the
# /etc/init.d startup scripts, services won't work properly
rm -rf /usr/lib/airtime/
if [ -d /usr/lib/airtime/ ]; then
rm -rf /usr/lib/airtime/
fi
rm /etc/init.d/airtime-*
if [ "$apache" = "t" ]; then
@ -353,7 +356,7 @@ if [ "$icecast" = "t" ]; then
verbose "\n * Enabling Icecast 2..."
sed -i 's/ENABLE=false/ENABLE=true/g' /etc/default/icecast2
set +e
service icecast2 start
loudCmd "service icecast2 start"
set -e
verbose "...Done"
fi
@ -367,38 +370,24 @@ loudCmd "apt-get -y --force-yes install liquidsoap python python-pip"
loudCmd "pip install setuptools"
verbose "...Done"
verbose "\n * Creating /usr/lib/airtime..."
mkdir -p /usr/lib/airtime
verbose "...Done"
verbose "\n * Creating /run/airtime..."
mkdir -p /run/airtime
chmod 755 /run/airtime
chown -R ${web_user}:${web_user} /run/airtime
verbose "...Done"
verbose "\n * Copying logging files..."
cp -R ${AIRTIMEROOT}/python_apps/std_err_override /usr/lib/airtime/
verbose "\n * Installing log writer..."
loudCmd "python ${AIRTIMEROOT}/python_apps/std_err_override/setup.py install"
verbose "...Done"
verbose "\n * Copying API client files..."
cp -R ${AIRTIMEROOT}/python_apps/api_clients /usr/lib/airtime/
verbose "...Done"
verbose "\n * Copying media-monitor files..."
cp -R ${AIRTIMEROOT}/python_apps/media-monitor/media-monitor /usr/lib/airtime/
cp -R ${AIRTIMEROOT}/python_apps/media-monitor/media-monitor2 /usr/lib/airtime/media-monitor/mm2
verbose "\n * Installing API client..."
loudCmd "python ${AIRTIMEROOT}/python_apps/api_clients/setup.py install"
verbose "...Done"
verbose "\n * Installing media-monitor..."
loudCmd "python ${AIRTIMEROOT}/python_apps/media-monitor/setup.py install"
verbose "...Done"
verbose "\n * Copying pypo files..."
mkdir -p /usr/lib/airtime/pypo
cp -R ${AIRTIMEROOT}/python_apps/pypo/pypo /usr/lib/airtime/pypo/bin/
verbose "...Done"
verbose "\n * Installing pypo..."
loudCmd "python ${AIRTIMEROOT}/python_apps/pypo/setup.py install"
verbose "...Done"
@ -425,7 +414,7 @@ if [ ! -d /var/log/airtime ]; then
verbose "\n * Copying logrotate files..."
cp ${AIRTIMEROOT}/airtime_mvc/build/airtime-php.logrotate /etc/logrotate.d/airtime-php
cp /usr/lib/airtime/pypo/bin/liquidsoap_scripts/airtime-liquidsoap.logrotate /etc/logrotate.d/airtime-liquidsoap
cp ${AIRTIMEROOT}/python_apps/pypo/pypo/liquidsoap_scripts/airtime-liquidsoap.logrotate /etc/logrotate.d/airtime-liquidsoap
fi
verbose "\n * Setting permissions on /var/log/airtime..."
@ -434,9 +423,7 @@ chown -R ${web_user}:${web_user} /var/log/airtime/
verbose "\n * Setting permissions on /var/tmp/airtime..."
chmod -R a+x /var/tmp/airtime
chmod 755 /usr/lib/airtime/pypo/bin/liquidsoap_scripts/notify.sh
chown -R ${web_user}:${web_user} /var/tmp/airtime/
chown -R ${web_user}:${web_user} /usr/lib/airtime/
loud "\n-----------------------------------------------------"
loud " * Installing PHP * "

View File

@ -0,0 +1,33 @@
from setuptools import setup
from subprocess import call
import sys
import os
script_path = os.path.dirname(os.path.realpath(__file__))
print script_path
os.chdir(script_path)
setup(name='api_clients',
version='1.0',
description='Airtime API Client',
url='http://github.com/sourcefabric/Airtime',
author='sourcefabric',
license='AGPLv3',
packages=['api_clients'],
scripts=[],
install_requires=[
# 'amqplib',
# 'anyjson',
# 'argparse',
'configobj'
# 'docopt',
# 'kombu',
# 'mutagen',
# 'poster',
# 'PyDispatcher',
# 'pyinotify',
# 'pytz',
# 'wsgiref'
],
zip_safe=False,
data_files=[])

View File

@ -2,8 +2,6 @@
exec 2>&1
cd /usr/lib/airtime/media-monitor/
set +e
cat /etc/default/locale | grep -i "LANG=.*UTF-\?8"
set -e
@ -12,8 +10,6 @@ if [ "$?" != "0" ]; then
exit 1
fi
export PYTHONPATH=/usr/lib/airtime/:/usr/lib/airtime/media-monitor/airtimefilemonitor/:\
/usr/lib/airtime/media-monitor/mm2/:/usr/lib/airtime/std_err_override/:/usr/lib/airtime/api_clients:$PYTHONPATH
export LC_ALL=`cat /etc/default/locale | grep "LANG=" | cut -d= -f2 | tr -d "\n\""`
exec python /usr/lib/airtime/media-monitor/media_monitor.py > /var/log/airtime/media-monitor/py-interpreter.log 2>&1
exec python -m media_monitor > /var/log/airtime/media-monitor/py-interpreter.log 2>&1

View File

@ -1,10 +1,11 @@
import logging
import time
import sys
import os
import mm2.mm2 as mm2
from std_err_override import LogWriter
global_cfg = '/etc/airtime/airtime.conf'
logging_cfg = '/usr/lib/airtime/media-monitor/logging.cfg'
logging_cfg = os.path.join(os.path.dirname(__file__), 'logging.cfg')
mm2.main( global_cfg, logging_cfg )

View File

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
import media.metadata.process as md
import process as md
import re
from os.path import normpath
from media.monitor.pure import format_length, file_md5, is_airtime_recorded, \
from ..monitor.pure import format_length, file_md5, is_airtime_recorded, \
no_extension_basename
defs_loaded = False

View File

@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
from contextlib import contextmanager
from media.monitor.pure import truncate_to_value, truncate_to_length, toposort
from os.path import normpath
from media.monitor.exceptions import BadSongFile
from media.monitor.log import Loggable
import media.monitor.pure as mmp
from collections import namedtuple
from contextlib import contextmanager
from ..monitor.pure import truncate_to_value, truncate_to_length, toposort
from os.path import normpath
from ..monitor.exceptions import BadSongFile
from ..monitor.log import Loggable
from ..monitor import pure as mmp
from collections import namedtuple
import mutagen
import subprocess
import json

View File

@ -1,22 +1,21 @@
# -*- coding: utf-8 -*-
from kombu.messaging import Exchange, Queue, Consumer
from kombu.connection import BrokerConnection
from kombu.simple import SimpleQueue
from os.path import normpath
from kombu.messaging import Exchange, Queue, Consumer
from kombu.connection import BrokerConnection
from kombu.simple import SimpleQueue
from os.path import normpath
import json
import os
import copy
import time
from media.monitor.exceptions import BadSongFile, InvalidMetadataElement
from media.monitor.metadata import Metadata
from media.monitor.log import Loggable
from media.monitor.syncdb import AirtimeDB
from media.monitor.exceptions import DirectoryIsNotListed
from media.monitor.bootstrap import Bootstrapper
from exceptions import BadSongFile, InvalidMetadataElement, DirectoryIsNotListed
from metadata import Metadata
from log import Loggable
from syncdb import AirtimeDB
from bootstrap import Bootstrapper
from media.saas.thread import apc, user
from ..saas.thread import apc, user
class AirtimeNotifier(Loggable):
"""

View File

@ -1,9 +1,9 @@
import os
from pydispatch import dispatcher
from media.monitor.events import NewFile, DeleteFile, ModifyFile
from media.monitor.log import Loggable
from media.saas.thread import getsig
import media.monitor.pure as mmp
from pydispatch import dispatcher
from events import NewFile, DeleteFile, ModifyFile
from log import Loggable
from ..saas.thread import getsig
import pure as mmp
class Bootstrapper(Loggable):
"""

View File

@ -3,8 +3,8 @@ import os
import copy
from configobj import ConfigObj
from media.monitor.exceptions import NoConfigFile, ConfigAccessViolation
import media.monitor.pure as mmp
from exceptions import NoConfigFile, ConfigAccessViolation
import pure as mmp
class MMConfig(object):
def __init__(self, path):

View File

@ -1,5 +1,5 @@
from media.monitor.log import Loggable
from media.monitor.events import DeleteFile
from log import Loggable
from events import DeleteFile
class EventContractor(Loggable):
def __init__(self):

View File

@ -1,7 +1,7 @@
import socket
import time
from media.monitor.log import Loggable
from media.monitor.toucher import RepeatTimer
from log import Loggable
from toucher import RepeatTimer
from amqplib.client_0_8.exceptions import AMQPConnectionException
class EventDrainer(Loggable):

View File

@ -2,12 +2,12 @@
import os
import abc
import re
import media.monitor.pure as mmp
from media.monitor.pure import LazyProperty
from media.monitor.metadata import Metadata
from media.monitor.log import Loggable
from media.monitor.exceptions import BadSongFile
from media.saas.thread import getsig, user
import pure as mmp
from pure import LazyProperty
from metadata import Metadata
from log import Loggable
from exceptions import BadSongFile
from ..saas.thread import getsig, user
class PathChannel(object):
""" Simple struct to hold a 'signal' string and a related 'path'.

View File

@ -2,9 +2,9 @@
from pydispatch import dispatcher
import abc
from media.monitor.log import Loggable
from media.saas.thread import getsig
import media.monitor.pure as mmp
from log import Loggable
from ..saas.thread import getsig
import pure as mmp
# Defines the handle interface
class Handles(object):

View File

@ -3,13 +3,13 @@ import pyinotify
from pydispatch import dispatcher
from functools import wraps
import media.monitor.pure as mmp
from media.monitor.pure import IncludeOnly
from media.monitor.events import OrganizeFile, NewFile, MoveFile, DeleteFile, \
import pure as mmp
from pure import IncludeOnly
from events import OrganizeFile, NewFile, MoveFile, DeleteFile, \
DeleteDir, MoveDir,\
DeleteDirWatch
from media.monitor.log import Loggable
from media.saas.thread import getsig, user
from log import Loggable
from ..saas.thread import getsig, user
# Note: Because of the way classes that inherit from pyinotify.ProcessEvent
# interact with constructors. you should only instantiate objects from them
# using keyword arguments. For example:

View File

@ -1,7 +1,7 @@
import logging
import abc
import traceback
from media.monitor.pure import LazyProperty
from pure import LazyProperty
appname = 'root'

View File

@ -1,16 +1,16 @@
import pyinotify
import time
import os
from pydispatch import dispatcher
from pydispatch import dispatcher
from os.path import normpath
from media.monitor.events import PathChannel
from media.monitor.log import Loggable
from media.monitor.listeners import StoreWatchListener, OrganizeListener
from media.monitor.handler import ProblemFileHandler
from media.monitor.organizer import Organizer
from media.saas.thread import InstanceInheritingThread, getsig
import media.monitor.pure as mmp
from os.path import normpath
from events import PathChannel
from log import Loggable
from listeners import StoreWatchListener, OrganizeListener
from handler import ProblemFileHandler
from organizer import Organizer
from ..saas.thread import InstanceInheritingThread, getsig
import pure as mmp
class ManagerTimeout(InstanceInheritingThread,Loggable):

View File

@ -2,17 +2,17 @@
import mutagen
import os
import copy
from mutagen.easymp4 import EasyMP4KeyError
from mutagen.easyid3 import EasyID3KeyError
from mutagen.easymp4 import EasyMP4KeyError
from mutagen.easyid3 import EasyID3KeyError
from media.monitor.exceptions import BadSongFile, InvalidMetadataElement
from media.monitor.log import Loggable
from media.monitor.pure import format_length
import media.monitor.pure as mmp
from exceptions import BadSongFile, InvalidMetadataElement
from log import Loggable
from pure import format_length
import pure as mmp
# emf related stuff
from media.metadata.process import global_reader
import media.metadata.definitions as defs
from ..metadata.process import global_reader
from ..metadata import definitions as defs
defs.load_definitions()
"""

View File

@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
import media.monitor.pure as mmp
from media.monitor.handler import ReportHandler
from media.monitor.log import Loggable
from media.monitor.exceptions import BadSongFile
from media.monitor.events import OrganizeFile
from pydispatch import dispatcher
from os.path import dirname
from media.saas.thread import getsig, user
import pure as mmp
from handler import ReportHandler
from log import Loggable
from exceptions import BadSongFile
from events import OrganizeFile
from pydispatch import dispatcher
from os.path import dirname
from ..saas.thread import getsig, user
import os.path
class Organizer(ReportHandler,Loggable):

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from media.monitor.log import Loggable
from log import Loggable
class Owner(Loggable):
def __init__(self):

View File

@ -21,7 +21,7 @@ try: from functools import reduce
except: pass
from configobj import ConfigObj
from media.monitor.exceptions import FailedToSetLocale, FailedToCreateDir
from exceptions import FailedToSetLocale, FailedToCreateDir
supported_extensions = [u"mp3", u"ogg", u"oga", u"flac", u"wav",
u'm4a', u'mp4', 'opus']

View File

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
from media.monitor.exceptions import BadSongFile
from media.monitor.log import Loggable
from media.saas.thread import apc, InstanceInheritingThread
from exceptions import BadSongFile
from log import Loggable
from ..saas.thread import apc, InstanceInheritingThread
class ThreadedRequestSync(InstanceInheritingThread, Loggable):
def __init__(self, rs):

View File

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
import os
from media.monitor.log import Loggable
from media.monitor.exceptions import NoDirectoryInAirtime
from media.saas.thread import user
from os.path import normpath, join
import media.monitor.pure as mmp
from log import Loggable
from exceptions import NoDirectoryInAirtime
from ..saas.thread import user
from os.path import normpath, join
import pure as mmp
class AirtimeDB(Loggable):
def __init__(self, apc, reload_now=True):

View File

@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
import media.monitor.pure as mmp
import pure as mmp
import os
from media.monitor.log import Loggable
from media.monitor.exceptions import CouldNotCreateIndexFile
from media.saas.thread import InstanceInheritingThread
from log import Loggable
from exceptions import CouldNotCreateIndexFile
from ..saas.thread import InstanceInheritingThread
class Toucher(Loggable):
"""

View File

@ -2,13 +2,13 @@
import time
import copy
from media.monitor.handler import ReportHandler
from media.monitor.log import Loggable
from media.monitor.exceptions import BadSongFile
from media.monitor.eventcontractor import EventContractor
from media.monitor.events import EventProxy
from media.monitor.request import ThreadedRequestSync, RequestSync
from media.saas.thread import InstanceInheritingThread, getsig
from handler import ReportHandler
from log import Loggable
from exceptions import BadSongFile
from eventcontractor import EventContractor
from events import EventProxy
from request import ThreadedRequestSync, RequestSync
from ..saas.thread import InstanceInheritingThread, getsig
class TimeoutWatcher(InstanceInheritingThread,Loggable):
"""

View File

@ -1,12 +1,12 @@
import os
from os.path import join, basename, dirname
from media.monitor.exceptions import NoConfigFile
from media.monitor.pure import LazyProperty
from media.monitor.config import MMConfig
from media.monitor.owners import Owner
from media.monitor.events import EventRegistry
from media.monitor.listeners import FileMediator
from ..monitor.exceptions import NoConfigFile
from ..monitor.pure import LazyProperty
from ..monitor.config import MMConfig
from ..monitor.owners import Owner
from ..monitor.events import EventRegistry
from ..monitor.listeners import FileMediator
from api_clients.api_client import AirtimeApiClient
# poor man's phantom types...

View File

@ -2,21 +2,21 @@ import os, sys
import logging
import logging.config
import media.monitor.pure as mmp
from ..monitor import pure as mmp
from media.monitor.exceptions import FailedToObtainLocale, FailedToSetLocale
from media.monitor.log import get_logger, setup_logging
from ..monitor.exceptions import FailedToObtainLocale, FailedToSetLocale
from ..monitor.log import get_logger, setup_logging
from std_err_override import LogWriter
from media.saas.thread import InstanceThread, user, apc, getsig
from media.monitor.log import Loggable
from media.monitor.exceptions import CouldNotCreateIndexFile
from media.monitor.toucher import ToucherThread
from media.monitor.airtime import AirtimeNotifier, AirtimeMessageReceiver
from media.monitor.watchersyncer import WatchSyncer
from media.monitor.eventdrainer import EventDrainer
from media.monitor.manager import Manager
from media.monitor.syncdb import AirtimeDB
from media.saas.airtimeinstance import AirtimeInstance
from ..saas.thread import InstanceThread, user, apc, getsig
from ..monitor.log import Loggable
from ..monitor.exceptions import CouldNotCreateIndexFile
from ..monitor.toucher import ToucherThread
from ..monitor.airtime import AirtimeNotifier, AirtimeMessageReceiver
from ..monitor.watchersyncer import WatchSyncer
from ..monitor.eventdrainer import EventDrainer
from ..monitor.manager import Manager
from ..monitor.syncdb import AirtimeDB
from airtimeinstance import AirtimeInstance
class MM2(InstanceThread, Loggable):

View File

@ -34,7 +34,11 @@ setup(name='airtime-media-monitor',
url='http://github.com/sourcefabric/Airtime',
author='sourcefabric',
license='AGPLv3',
packages=['media-monitor', 'media-monitor2'],
packages=['media_monitor', 'mm2', 'mm2.configs',
'mm2.media', 'mm2.media.monitor',
'mm2.media.metadata', 'mm2.media.saas'
],
package_data={'': ['*.cfg']},
scripts=['bin/airtime-media-monitor'],
install_requires=[
'amqplib',

View File

@ -1,38 +1,3 @@
#!/bin/bash -e
debug="f"
showhelp () {
echo "Usage: airtime-liquidsoap [options]
--help|-h Displays usage information.
--debug|-d Print error messages to console"
}
set -- $(getopt -l help,debug "hd" "$@")
while [ $# -gt 0 ]
do
case "$1" in
(-h|--help) showhelp; exit 0;;
(-d|--debug) debug="t";;
(--) shift; break;;
(-*) echo "$0: error - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
export HOME="/var/tmp/airtime/pypo/"
if [ "$debug" = "t" ]; then
ls_path="/usr/bin/airtime-liquidsoap --verbose -f --debug"
else
ls_path="/usr/bin/airtime-liquidsoap --verbose -f"
fi
export PYTHONPATH=/usr/lib/airtime/:/usr/lib/airtime/pypo/bin/:/usr/lib/airtime/std_err_override/:/usr/lib/airtime/api_clients:$PYTHONPATH
ls_param="/usr/lib/airtime/pypo/bin/liquidsoap_scripts/ls_script.liq"
cd /usr/lib/airtime/pypo/bin/liquidsoap_scripts
python generate_liquidsoap_cfg.py
exec ${ls_path} ${ls_param} 2>&1
exec python -m liquidsoap 2>&1

View File

@ -9,8 +9,7 @@ if [ "$?" != "0" ]; then
fi
export HOME="/var/tmp/airtime/pypo/"
export PYTHONPATH=/usr/lib/airtime/:/usr/lib/airtime/pypo/bin/:/usr/lib/airtime/std_err_override/:/usr/lib/airtime/api_clients:$PYTHONPATH
export LC_ALL=`cat /etc/default/locale | grep "LANG=" | cut -d= -f2 | tr -d "\n\""`
export TERM=xterm
exec python /usr/lib/airtime/pypo/bin/pypocli.py > /var/log/airtime/pypo/py-interpreter.log 2>&1
exec python -m pypo > /var/log/airtime/pypo/py-interpreter.log 2>&1

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import traceback

View File

View File

@ -0,0 +1,27 @@
""" Runs Airtime liquidsoap
"""
import argparse
import os
import generate_liquidsoap_cfg
PYPO_HOME = '/var/tmp/airtime/pypo/'
def run():
'''Entry-point for this application'''
print "Airtime Liquidsoap"
parser = argparse.ArgumentParser()
parser.add_argument("-d", "--debug", help="run in debug mode", action="store_true")
args = parser.parse_args()
os.environ["HOME"] = PYPO_HOME
generate_liquidsoap_cfg.run()
script_path = os.path.join(os.path.dirname(__file__), 'ls_script.liq')
if args.debug:
os.execl('/usr/bin/liquidsoap', 'airtime-liquidsoap', script_path, '--verbose', '-f', '--debug')
else:
os.execl('/usr/bin/liquidsoap', 'airtime-liquidsoap', script_path, '--verbose', '-f')
run()

View File

@ -25,24 +25,25 @@ def generate_liquidsoap_config(ss):
fh.write('log_file = "/var/log/airtime/pypo-liquidsoap/<script>.log"\n')
fh.close()
logging.basicConfig(format='%(message)s')
attempts = 0
max_attempts = 10
successful = False
while not successful:
try:
ac = AirtimeApiClient(logging.getLogger())
ss = ac.get_stream_setting()
generate_liquidsoap_config(ss)
successful = True
except Exception, e:
if attempts == max_attempts:
print "Unable to connect to the Airtime server."
logging.error(str(e))
logging.error("traceback: %s", traceback.format_exc())
sys.exit(1)
else:
time.sleep(3)
attempts += 1
def run():
logging.basicConfig(format='%(message)s')
attempts = 0
max_attempts = 10
successful = False
while not successful:
try:
ac = AirtimeApiClient(logging.getLogger())
ss = ac.get_stream_setting()
generate_liquidsoap_config(ss)
successful = True
except Exception, e:
if attempts == max_attempts:
print "Unable to connect to the Airtime server."
logging.error(str(e))
logging.error("traceback: %s", traceback.format_exc())
sys.exit(1)
else:
time.sleep(3)
attempts += 1

Some files were not shown because too many files have changed in this diff Show More