@@ -0,0 +1,124 @@ | |||||
PY?=python | |||||
PELICAN?=pelican | |||||
PELICANOPTS= | |||||
BASEDIR=$(CURDIR) | |||||
INPUTDIR=$(BASEDIR)/content | |||||
OUTPUTDIR=$(BASEDIR)/output | |||||
CONFFILE=$(BASEDIR)/pelicanconf.py | |||||
PUBLISHCONF=$(BASEDIR)/publishconf.py | |||||
FTP_HOST=localhost | |||||
FTP_USER=anonymous | |||||
FTP_TARGET_DIR=/ | |||||
SSH_HOST=localhost | |||||
SSH_PORT=22 | |||||
SSH_USER=root | |||||
SSH_TARGET_DIR=/var/www | |||||
S3_BUCKET=my_s3_bucket | |||||
CLOUDFILES_USERNAME=my_rackspace_username | |||||
CLOUDFILES_API_KEY=my_rackspace_api_key | |||||
CLOUDFILES_CONTAINER=my_cloudfiles_container | |||||
DROPBOX_DIR=~/Dropbox/Public/ | |||||
GITHUB_PAGES_BRANCH=gh-pages | |||||
DEBUG ?= 0 | |||||
ifeq ($(DEBUG), 1) | |||||
PELICANOPTS += -D | |||||
endif | |||||
RELATIVE ?= 0 | |||||
ifeq ($(RELATIVE), 1) | |||||
PELICANOPTS += --relative-urls | |||||
endif | |||||
help: | |||||
@echo 'Makefile for a pelican Web site ' | |||||
@echo ' ' | |||||
@echo 'Usage: ' | |||||
@echo ' make html (re)generate the web site ' | |||||
@echo ' make clean remove the generated files ' | |||||
@echo ' make regenerate regenerate files upon modification ' | |||||
@echo ' make publish generate using production settings ' | |||||
@echo ' make serve [PORT=8000] serve site at http://localhost:8000' | |||||
@echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' | |||||
@echo ' make devserver [PORT=8000] start/restart develop_server.sh ' | |||||
@echo ' make stopserver stop local server ' | |||||
@echo ' make ssh_upload upload the web site via SSH ' | |||||
@echo ' make rsync_upload upload the web site via rsync+ssh ' | |||||
@echo ' make dropbox_upload upload the web site via Dropbox ' | |||||
@echo ' make ftp_upload upload the web site via FTP ' | |||||
@echo ' make s3_upload upload the web site via S3 ' | |||||
@echo ' make cf_upload upload the web site via Cloud Files' | |||||
@echo ' make github upload the web site via gh-pages ' | |||||
@echo ' ' | |||||
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' | |||||
@echo 'Set the RELATIVE variable to 1 to enable relative urls ' | |||||
@echo ' ' | |||||
html: | |||||
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) | |||||
clean: | |||||
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) | |||||
regenerate: | |||||
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) | |||||
serve: | |||||
ifdef PORT | |||||
cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT) | |||||
else | |||||
cd $(OUTPUTDIR) && $(PY) -m pelican.server | |||||
endif | |||||
serve-global: | |||||
ifdef SERVER | |||||
cd $(OUTPUTDIR) && $(PY) -m pelican.server 80 $(SERVER) | |||||
else | |||||
cd $(OUTPUTDIR) && $(PY) -m pelican.server 80 0.0.0.0 | |||||
endif | |||||
devserver: | |||||
ifdef PORT | |||||
$(BASEDIR)/develop_server.sh restart $(PORT) | |||||
else | |||||
$(BASEDIR)/develop_server.sh restart | |||||
endif | |||||
stopserver: | |||||
$(BASEDIR)/develop_server.sh stop | |||||
@echo 'Stopped Pelican and SimpleHTTPServer processes running in background.' | |||||
publish: | |||||
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS) | |||||
ssh_upload: publish | |||||
scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) | |||||
rsync_upload: publish | |||||
rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) --cvs-exclude | |||||
dropbox_upload: publish | |||||
cp -r $(OUTPUTDIR)/* $(DROPBOX_DIR) | |||||
ftp_upload: publish | |||||
lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit" | |||||
s3_upload: publish | |||||
s3cmd sync $(OUTPUTDIR)/ s3://$(S3_BUCKET) --acl-public --delete-removed --guess-mime-type --no-mime-magic --no-preserve | |||||
cf_upload: publish | |||||
cd $(OUTPUTDIR) && swift -v -A https://auth.api.rackspacecloud.com/v1.0 -U $(CLOUDFILES_USERNAME) -K $(CLOUDFILES_API_KEY) upload -c $(CLOUDFILES_CONTAINER) . | |||||
github: publish | |||||
ghp-import -m "Generate Pelican site" -b $(GITHUB_PAGES_BRANCH) $(OUTPUTDIR) | |||||
git push origin $(GITHUB_PAGES_BRANCH) | |||||
.PHONY: html help clean regenerate serve serve-global devserver stopserver publish ssh_upload rsync_upload dropbox_upload ftp_upload s3_upload cf_upload github |
@@ -0,0 +1,6 @@ | |||||
Title: My first review | |||||
Date: 2017-06-01 10:20 | |||||
Category: Review | |||||
Here is a full review, guys. | |||||
@@ -0,0 +1,103 @@ | |||||
#!/usr/bin/env bash | |||||
## | |||||
# This section should match your Makefile | |||||
## | |||||
PY=${PY:-python} | |||||
PELICAN=${PELICAN:-pelican} | |||||
PELICANOPTS= | |||||
BASEDIR=$(pwd) | |||||
INPUTDIR=$BASEDIR/content | |||||
OUTPUTDIR=$BASEDIR/output | |||||
CONFFILE=$BASEDIR/pelicanconf.py | |||||
### | |||||
# Don't change stuff below here unless you are sure | |||||
### | |||||
SRV_PID=$BASEDIR/srv.pid | |||||
PELICAN_PID=$BASEDIR/pelican.pid | |||||
function usage(){ | |||||
echo "usage: $0 (stop) (start) (restart) [port]" | |||||
echo "This starts Pelican in debug and reload mode and then launches" | |||||
echo "an HTTP server to help site development. It doesn't read" | |||||
echo "your Pelican settings, so if you edit any paths in your Makefile" | |||||
echo "you will need to edit your settings as well." | |||||
exit 3 | |||||
} | |||||
function alive() { | |||||
kill -0 $1 >/dev/null 2>&1 | |||||
} | |||||
function shut_down(){ | |||||
PID=$(cat $SRV_PID) | |||||
if [[ $? -eq 0 ]]; then | |||||
if alive $PID; then | |||||
echo "Stopping HTTP server" | |||||
kill $PID | |||||
else | |||||
echo "Stale PID, deleting" | |||||
fi | |||||
rm $SRV_PID | |||||
else | |||||
echo "HTTP server PIDFile not found" | |||||
fi | |||||
PID=$(cat $PELICAN_PID) | |||||
if [[ $? -eq 0 ]]; then | |||||
if alive $PID; then | |||||
echo "Killing Pelican" | |||||
kill $PID | |||||
else | |||||
echo "Stale PID, deleting" | |||||
fi | |||||
rm $PELICAN_PID | |||||
else | |||||
echo "Pelican PIDFile not found" | |||||
fi | |||||
} | |||||
function start_up(){ | |||||
local port=$1 | |||||
echo "Starting up Pelican and HTTP server" | |||||
shift | |||||
$PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS & | |||||
pelican_pid=$! | |||||
echo $pelican_pid > $PELICAN_PID | |||||
mkdir -p $OUTPUTDIR && cd $OUTPUTDIR | |||||
$PY -m pelican.server $port & | |||||
srv_pid=$! | |||||
echo $srv_pid > $SRV_PID | |||||
cd $BASEDIR | |||||
sleep 1 | |||||
if ! alive $pelican_pid ; then | |||||
echo "Pelican didn't start. Is the Pelican package installed?" | |||||
return 1 | |||||
elif ! alive $srv_pid ; then | |||||
echo "The HTTP server didn't start. Is there another service using port" $port "?" | |||||
return 1 | |||||
fi | |||||
echo 'Pelican and HTTP server processes now running in background.' | |||||
} | |||||
### | |||||
# MAIN | |||||
### | |||||
[[ ($# -eq 0) || ($# -gt 2) ]] && usage | |||||
port='' | |||||
[[ $# -eq 2 ]] && port=$2 | |||||
if [[ $1 == "stop" ]]; then | |||||
shut_down | |||||
elif [[ $1 == "restart" ]]; then | |||||
shut_down | |||||
start_up $port | |||||
elif [[ $1 == "start" ]]; then | |||||
if ! start_up $port; then | |||||
shut_down | |||||
fi | |||||
else | |||||
usage | |||||
fi |
@@ -0,0 +1,92 @@ | |||||
from fabric.api import * | |||||
import fabric.contrib.project as project | |||||
import os | |||||
import shutil | |||||
import sys | |||||
import SocketServer | |||||
from pelican.server import ComplexHTTPRequestHandler | |||||
# Local path configuration (can be absolute or relative to fabfile) | |||||
env.deploy_path = 'output' | |||||
DEPLOY_PATH = env.deploy_path | |||||
# Remote server configuration | |||||
production = 'root@localhost:22' | |||||
dest_path = '/var/www' | |||||
# Rackspace Cloud Files configuration settings | |||||
env.cloudfiles_username = 'my_rackspace_username' | |||||
env.cloudfiles_api_key = 'my_rackspace_api_key' | |||||
env.cloudfiles_container = 'my_cloudfiles_container' | |||||
# Github Pages configuration | |||||
env.github_pages_branch = "gh-pages" | |||||
# Port for `serve` | |||||
PORT = 8000 | |||||
def clean(): | |||||
"""Remove generated files""" | |||||
if os.path.isdir(DEPLOY_PATH): | |||||
shutil.rmtree(DEPLOY_PATH) | |||||
os.makedirs(DEPLOY_PATH) | |||||
def build(): | |||||
"""Build local version of site""" | |||||
local('pelican -s pelicanconf.py') | |||||
def rebuild(): | |||||
"""`build` with the delete switch""" | |||||
local('pelican -d -s pelicanconf.py') | |||||
def regenerate(): | |||||
"""Automatically regenerate site upon file modification""" | |||||
local('pelican -r -s pelicanconf.py') | |||||
def serve(): | |||||
"""Serve site at http://localhost:8000/""" | |||||
os.chdir(env.deploy_path) | |||||
class AddressReuseTCPServer(SocketServer.TCPServer): | |||||
allow_reuse_address = True | |||||
server = AddressReuseTCPServer(('', PORT), ComplexHTTPRequestHandler) | |||||
sys.stderr.write('Serving on port {0} ...\n'.format(PORT)) | |||||
server.serve_forever() | |||||
def reserve(): | |||||
"""`build`, then `serve`""" | |||||
build() | |||||
serve() | |||||
def preview(): | |||||
"""Build production version of site""" | |||||
local('pelican -s publishconf.py') | |||||
def cf_upload(): | |||||
"""Publish to Rackspace Cloud Files""" | |||||
rebuild() | |||||
with lcd(DEPLOY_PATH): | |||||
local('swift -v -A https://auth.api.rackspacecloud.com/v1.0 ' | |||||
'-U {cloudfiles_username} ' | |||||
'-K {cloudfiles_api_key} ' | |||||
'upload -c {cloudfiles_container} .'.format(**env)) | |||||
@hosts(production) | |||||
def publish(): | |||||
"""Publish to production via rsync""" | |||||
local('pelican -s publishconf.py') | |||||
project.rsync_project( | |||||
remote_dir=dest_path, | |||||
exclude=".DS_Store", | |||||
local_dir=DEPLOY_PATH.rstrip('/') + '/', | |||||
delete=True, | |||||
extra_opts='-c', | |||||
) | |||||
def gh_pages(): | |||||
"""Publish to GitHub Pages""" | |||||
rebuild() | |||||
local("ghp-import -b {github_pages_branch} {deploy_path} -p".format(**env)) |
@@ -0,0 +1,35 @@ | |||||
#!/usr/bin/env python | |||||
# -*- coding: utf-8 -*- # | |||||
from __future__ import unicode_literals | |||||
AUTHOR = u'Opensource Game Studio' | |||||
SITENAME = u'Opensource Game Studio' | |||||
SITEURL = '' | |||||
PATH = 'content' | |||||
TIMEZONE = 'Asia/Novosibirsk' | |||||
DEFAULT_LANG = u'en' | |||||
# Feed generation is usually not desired when developing | |||||
FEED_ALL_ATOM = None | |||||
CATEGORY_FEED_ATOM = None | |||||
TRANSLATION_FEED_ATOM = None | |||||
AUTHOR_FEED_ATOM = None | |||||
AUTHOR_FEED_RSS = None | |||||
# Blogroll | |||||
LINKS = (('Pelican', 'http://getpelican.com/'), | |||||
('Python.org', 'http://python.org/'), | |||||
('Jinja2', 'http://jinja.pocoo.org/'), | |||||
('You can modify those links in your config file', '#'),) | |||||
# Social widget | |||||
SOCIAL = (('You can add links in your config file', '#'), | |||||
('Another social link', '#'),) | |||||
DEFAULT_PAGINATION = 10 | |||||
# Uncomment following line if you want document-relative URLs when developing | |||||
#RELATIVE_URLS = True |
@@ -0,0 +1,24 @@ | |||||
#!/usr/bin/env python | |||||
# -*- coding: utf-8 -*- # | |||||
from __future__ import unicode_literals | |||||
# This file is only used if you use `make publish` or | |||||
# explicitly specify it as your config file. | |||||
import os | |||||
import sys | |||||
sys.path.append(os.curdir) | |||||
from pelicanconf import * | |||||
SITEURL = '' | |||||
RELATIVE_URLS = False | |||||
FEED_ALL_ATOM = 'feeds/all.atom.xml' | |||||
CATEGORY_FEED_ATOM = 'feeds/%s.atom.xml' | |||||
DELETE_OUTPUT_DIRECTORY = True | |||||
# Following items are often useful when publishing | |||||
#DISQUS_SITENAME = "" | |||||
#GOOGLE_ANALYTICS = "" |