Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kwabena Antwi-Boasiako
slapos
Commits
7a26b563
Commit
7a26b563
authored
Sep 02, 2012
by
Alain Takoudjou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add slapos.cookbook:boinc recipe
parent
c80420b8
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
348 additions
and
0 deletions
+348
-0
setup.py
setup.py
+1
-0
slapos/recipe/boinc/__init__.py
slapos/recipe/boinc/__init__.py
+204
-0
slapos/recipe/boinc/configure.py
slapos/recipe/boinc/configure.py
+106
-0
slapos/recipe/boinc/template/apache.part.in
slapos/recipe/boinc/template/apache.part.in
+19
-0
slapos/recipe/boinc/template/project.conf.in
slapos/recipe/boinc/template/project.conf.in
+18
-0
No files found.
setup.py
View file @
7a26b563
...
...
@@ -138,6 +138,7 @@ setup(name=name,
'webchecker = slapos.recipe.web_checker:Recipe'
,
'signalwrapper= slapos.recipe.signal_wrapper:Recipe'
,
'condor = slapos.recipe.condor:Recipe'
,
'boinc = slapos.recipe.boinc:Recipe'
,
],
'slapos.recipe.nosqltestbed.plugin'
:
[
'kumo = slapos.recipe.nosqltestbed.kumo:KumoTestBed'
,
...
...
slapos/recipe/boinc/__init__.py
0 → 100644
View file @
7a26b563
##############################################################################
#
# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from
slapos.recipe.librecipe
import
GenericBaseRecipe
import
os
import
subprocess
import
pwd
class
Recipe
(
GenericBaseRecipe
):
"""Deploy a fully operational boinc architecture."""
def
__init__
(
self
,
buildout
,
name
,
options
):
#get current slapuser name
stat_info
=
os
.
stat
(
options
[
'home'
].
strip
())
options
[
'user'
]
=
pwd
.
getpwuid
(
stat_info
.
st_uid
)[
0
]
url_base
=
"http://["
+
options
[
'ip'
]
+
"]:"
+
options
[
'port'
]
project
=
options
[
'project'
].
strip
()
root
=
options
[
'installroot'
].
strip
()
options
[
'home_page'
]
=
url_base
+
"/"
+
project
options
[
'admin_page'
]
=
url_base
+
"/"
+
project
+
"_ops/"
options
[
'cronjob'
]
=
os
.
path
.
join
(
root
,
project
+
'.cronjob'
)
return
GenericBaseRecipe
.
__init__
(
self
,
buildout
,
name
,
options
)
def
_options
(
self
,
options
):
#Path of boinc compiled package
self
.
package
=
options
[
'boinc'
].
strip
()
self
.
sourcedir
=
options
[
'source'
].
strip
()
self
.
home
=
options
[
'home'
].
strip
()
self
.
project
=
options
[
'project'
].
strip
()
self
.
project_config
=
options
[
'project-config'
].
strip
()
self
.
installroot
=
options
[
'installroot'
].
strip
()
self
.
boinc_egg
=
os
.
path
.
join
(
self
.
package
,
'lib/python2.7/site-packages'
)
self
.
developegg
=
options
[
'develop-egg'
].
strip
()
self
.
wrapperdir
=
options
[
'wrapper-dir'
].
strip
()
self
.
passwd
=
options
[
'passwd'
].
strip
()
self
.
boinc_httpd_conf
=
options
[
'boinc-httpd-conf'
].
strip
()
#Get binary path
self
.
svn
=
options
[
'svn-binary'
].
strip
()
self
.
perl
=
options
[
'perl-binary'
].
strip
()
self
.
pythonbin
=
options
[
'python-binary'
].
strip
()
#Apache php informations
self
.
wwwdata
=
options
[
'www-data'
].
strip
()
self
.
ipv6
=
options
[
'ip'
].
strip
()
self
.
port
=
options
[
'port'
].
strip
()
self
.
httpd_conf
=
options
[
'httpd-conf'
].
strip
()
self
.
apachewrapper
=
options
[
'apache-wrapper'
].
strip
()
self
.
htpasswd
=
options
[
'htpasswd'
].
strip
()
self
.
apachebin
=
options
[
'apache-bin'
].
strip
()
self
.
phpini
=
options
[
'php-ini'
].
strip
()
self
.
phpbin
=
options
[
'php-bin'
].
strip
()
self
.
wrapperphp
=
options
[
'php-wrapper'
].
strip
()
#get Mysql parameters
self
.
username
=
options
[
'mysql-username'
].
strip
()
self
.
password
=
options
[
'mysql-password'
].
strip
()
self
.
database
=
options
[
'mysql-database'
].
strip
()
self
.
mysqlhost
=
options
[
'mysql-host'
].
strip
()
self
.
mysqlport
=
options
[
'mysql-port'
].
strip
()
def
install
(
self
):
path_list
=
[]
make_project
=
os
.
path
.
join
(
self
.
package
,
'bin/make_project'
)
niceprojectname
=
self
.
project
+
"@Home"
url_base
=
"http://["
+
self
.
ipv6
+
"]:"
+
self
.
port
slapuser
=
self
.
options
[
'user'
]
#generate project config file
configuration
=
dict
(
mypassword
=
self
.
password
,
dbname
=
self
.
database
,
hosturl
=
url_base
,
boincproject
=
niceprojectname
,
installroot
=
self
.
installroot
,
project
=
self
.
project
)
config_file
=
self
.
createFile
(
self
.
project_config
,
self
.
substituteTemplate
(
self
.
getTemplateFilename
(
'project.conf.in'
),
configuration
))
path_list
.
append
(
config_file
)
#Define environment variable here
python_path
=
self
.
boinc_egg
+
":"
+
os
.
environ
[
'PYTHONPATH'
]
for
f
in
os
.
listdir
(
self
.
developegg
):
dir
=
os
.
path
.
join
(
self
.
developegg
,
f
)
if
os
.
path
.
isdir
(
dir
):
python_path
+=
":"
+
dir
bin_dir
=
os
.
path
.
join
(
self
.
home
,
'bin'
)
environment
=
dict
(
PATH
=
self
.
svn
+
':'
+
bin_dir
+
':'
+
self
.
perl
+
':'
+
os
.
environ
[
'PATH'
],
PYTHONPATH
=
python_path
,
PYTHON
=
self
.
pythonbin
)
#Regenerate Apache wrapper with current conf and environment variables
if
os
.
path
.
exists
(
self
.
apachewrapper
):
os
.
unlink
(
self
.
apachewrapper
)
boinc_httpd
=
self
.
createFile
(
os
.
path
.
join
(
self
.
home
,
'etc/httpd_boinc.conf'
),
self
.
substituteTemplate
(
self
.
getTemplateFilename
(
'apache.part.in'
),
dict
(
project
=
self
.
project
,
niceprojectname
=
niceprojectname
,
installroot
=
self
.
installroot
)))
path_list
.
append
(
boinc_httpd
)
httpd_configuration
=
open
(
self
.
boinc_httpd_conf
,
'w'
)
httpd_configuration
.
write
(
open
(
self
.
httpd_conf
,
'r'
).
read
())
httpd_configuration
.
write
(
open
(
boinc_httpd
,
'r'
).
read
())
httpd_configuration
.
close
()
apache_args
=
[
self
.
apachebin
,
'-f'
,
self
.
boinc_httpd_conf
,
'-DFOREGROUND'
]
apache_wrapper
=
self
.
createPythonScript
(
self
.
apachewrapper
,
'slapos.recipe.librecipe.execute.executee'
,
(
apache_args
,
environment
)
)
path_list
.
append
(
apache_wrapper
)
#Generate wrapper for php
php_wrapper
=
self
.
createPythonScript
(
self
.
wrapperphp
,
'slapos.recipe.librecipe.execute.executee'
,
([
self
.
phpbin
,
'-c'
,
self
.
phpini
],
os
.
environ
)
)
path_list
.
append
(
php_wrapper
)
#Generate python script for MySQL database marker (starting)
file_status
=
os
.
path
.
join
(
self
.
home
,
'.boinc_config'
)
if
os
.
path
.
exists
(
file_status
):
os
.
unlink
(
file_status
)
mysql_wrapper
=
self
.
createPythonScript
(
os
.
path
.
join
(
self
.
wrapperdir
,
'start_config'
),
'%s.configure.checkMysql'
%
__name__
,
dict
(
mysql_port
=
self
.
mysqlport
,
mysql_host
=
self
.
mysqlhost
,
mysql_user
=
self
.
username
,
mysql_password
=
self
.
password
,
database
=
self
.
database
,
file_status
=
file_status
,
python_path
=
python_path
)
)
# Generate make project wrapper file
launch_args
=
[
make_project
,
'--url_base'
,
url_base
,
"--db_name"
,
self
.
database
,
"--db_user"
,
self
.
username
,
"--db_passwd"
,
self
.
password
,
"--project_root"
,
self
.
installroot
,
"--db_host"
,
self
.
mysqlhost
,
"--user_name"
,
slapuser
,
"--srcdir"
,
self
.
sourcedir
,
"--no_query"
,
"--delete_prev_inst"
,
"--drop_db_first"
,
self
.
project
,
niceprojectname
]
install_wrapper
=
self
.
createPythonScript
(
os
.
path
.
join
(
self
.
wrapperdir
,
'make_project'
),
'slapos.recipe.librecipe.execute.executee_wait'
,
(
launch_args
,
[
file_status
],
environment
)
)
path_list
.
append
(
install_wrapper
)
#After make_project run configure_script to perform and restart apache php services
service_status
=
os
.
path
.
join
(
self
.
home
,
'.start_service'
)
if
os
.
path
.
exists
(
service_status
):
os
.
unlink
(
service_status
)
parameter
=
dict
(
readme
=
os
.
path
.
join
(
self
.
installroot
,
self
.
project
+
'.readme'
),
htpasswd
=
self
.
htpasswd
,
installroot
=
self
.
installroot
,
username
=
slapuser
,
passwd
=
self
.
passwd
,
xadd
=
os
.
path
.
join
(
self
.
installroot
,
'bin/xadd'
),
environment
=
environment
,
service_status
=
service_status
,
project
=
niceprojectname
)
start_service
=
self
.
createPythonScript
(
os
.
path
.
join
(
self
.
wrapperdir
,
'config_project'
),
'%s.configure.services'
%
__name__
,
parameter
)
path_list
.
append
(
start_service
)
#Generate Boinc project wrapper
start_args
=
[
os
.
path
.
join
(
self
.
installroot
,
'bin/start'
)]
start_wrapper
=
self
.
createPythonScript
(
os
.
path
.
join
(
self
.
wrapperdir
,
'start_project'
),
'slapos.recipe.librecipe.execute.executee_wait'
,
(
start_args
,
[
service_status
],
environment
)
)
path_list
.
append
(
start_wrapper
)
return
path_list
update
=
install
slapos/recipe/boinc/configure.py
0 → 100644
View file @
7a26b563
##############################################################################
#
# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import
os
import
sys
import
subprocess
import
time
def
checkMysql
(
args
):
sys
.
path
+=
args
[
'python_path'
].
split
(
':'
)
import
MySQLdb
#Sleep until mysql server becomes available
while
True
:
try
:
conn
=
MySQLdb
.
connect
(
host
=
args
[
'mysql_host'
],
user
=
args
[
'mysql_user'
],
port
=
int
(
args
[
'mysql_port'
]),
passwd
=
args
[
'mysql_password'
],
db
=
args
[
'database'
])
conn
.
close
()
print
"Successfully connect to MySQL database... "
file
=
open
(
args
[
'file_status'
],
'w'
)
file
.
write
(
"starting"
)
file
.
close
()
break
except
Exception
,
ex
:
print
"The result is:
\
n
"
+
ex
.
message
print
"Could not connect to MySQL database... sleep for 2 secondes"
time
.
sleep
(
2
)
def
services
(
args
):
#Sleep until file 'boinc_project'.readme exist
while
True
:
print
"Search for file %s..."
%
args
[
'readme'
]
if
not
os
.
path
.
exists
(
args
[
'readme'
]):
print
"File not found... sleep for 3 secondes"
time
.
sleep
(
3
)
else
:
break
topath
=
os
.
path
.
join
(
args
[
'installroot'
],
'html/ops/.htpasswd'
)
print
"Generating .htpasswd file... File=%s"
%
topath
passwd
=
open
(
args
[
'passwd'
],
'r'
).
read
()
p_htpasswd
=
subprocess
.
Popen
([
args
[
'htpasswd'
],
'-b'
,
'-c'
,
topath
,
args
[
'username'
],
passwd
],
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
)
result
=
p_htpasswd
.
communicate
()[
0
]
if
p_htpasswd
.
returncode
is
None
or
p_htpasswd
.
returncode
!=
0
:
print
"Failed to create file %s.
\
n
The error was: %s"
%
(
topath
,
result
)
return
print
"Running xadd script..."
env
=
os
.
environ
env
[
'PATH'
]
=
args
[
'environment'
][
'PATH'
]
env
[
'PYTHONPATH'
]
=
args
[
'environment'
][
'PYTHONPATH'
]
env
[
'PYTHON'
]
=
args
[
'environment'
][
'PYTHON'
]
p_xadd
=
subprocess
.
Popen
([
args
[
'xadd'
]],
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
STDOUT
,
env
=
env
)
result
=
p_xadd
.
communicate
()[
0
]
if
p_xadd
.
returncode
is
None
or
p_xadd
.
returncode
!=
0
:
print
"Failed to execute bin/xadd.
\
n
The error was: %s"
%
result
return
print
"Update files and directories permissions..."
upload
=
os
.
path
.
join
(
args
[
'installroot'
],
'upload'
)
inc
=
os
.
path
.
join
(
args
[
'installroot'
],
'html/inc'
)
languages
=
os
.
path
.
join
(
args
[
'installroot'
],
'html/languages'
)
compiled
=
os
.
path
.
join
(
args
[
'installroot'
],
'html/languages/compiled'
)
user_profile
=
os
.
path
.
join
(
args
[
'installroot'
],
'html/user_profile'
)
cmd
=
"chmod 02770 -R %s %s, %s %s %s"
%
(
upload
,
inc
,
languages
,
compiled
,
user_profile
)
os
.
system
(
"chmod g+w -R "
+
args
[
'installroot'
])
os
.
system
(
cmd
)
os
.
system
(
"chmod o+x "
+
inc
)
os
.
system
(
"chmod -R o+r "
+
inc
)
os
.
system
(
"chmod o+x "
+
languages
)
os
.
system
(
"chmod o+x "
+
compiled
)
status
=
open
(
args
[
'service_status'
],
"w"
)
status
.
write
(
"started"
)
status
.
close
()
\ No newline at end of file
slapos/recipe/boinc/template/apache.part.in
0 → 100644
View file @
7a26b563
## Settings for BOINC project %(niceprojectname)s
Alias /%(project)s %(installroot)s/html/user
Alias /%(project)s_ops %(installroot)s/html/ops
ScriptAlias /%(project)s_cgi %(installroot)s/cgi-bin
# Note: projects/*/keys/ should NOT be readable!
<Directory "%(installroot)s/html">
Options Indexes FollowSymlinks MultiViews
AllowOverride AuthConfig
Require all granted
</Directory>
<Directory "%(installroot)s/cgi-bin">
Options ExecCGI
AllowOverride AuthConfig
Require all granted
</Directory>
\ No newline at end of file
slapos/recipe/boinc/template/project.conf.in
0 → 100644
View file @
7a26b563
# password for write access to your project database
pw=%(mypassword)s
# name of the MySQL database
dbprojectname=%(dbname)s
# address of host (via DNS or IP number) at which project server shall be reached
hosturl=http://%(hosturl)s
# name of folder in which data shall be stored, also becomes part of project URL
fileprojectname=%(project)s
# more human-compatible way to read the project name
niceprojectname="%(boincproject)s@Home"
# location at which sources shall be kept
installroot=%(installroot)s
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment