@@ -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 = "" |