Skip to content

Instantly share code, notes, and snippets.

@averrin
Created March 25, 2015 09:57
Show Gist options
  • Select an option

  • Save averrin/ea793957aca4053c3cad to your computer and use it in GitHub Desktop.

Select an option

Save averrin/ea793957aca4053c3cad to your computer and use it in GitHub Desktop.
Basic CLI Cherokee webserver editor (just for static folders)
#!env python
# coding: utf-8
import os
import sys
import re
from pprint import pprint
import subprocess
import argparse
from collections import OrderedDict
conf_path = '/etc/cherokee/cherokee.conf'
# Thx to LordKelvin
def parseFile(fname):
# result = {}
result = OrderedDict({})
with open(fname) as file_hadle:
for line in file_hadle:
if not line.strip():
continue
key_str, value = line.rstrip('\n').split(' = ')
keys = key_str.split('!')
slider = result
for key in keys[:-1]:
if key not in slider:
# slider[key] = {}
slider[key] = OrderedDict({})
if isinstance(slider[key], str):
# slider[key] = {'': slider[key]}
slider[key] = OrderedDict({'': slider[key]})
slider = slider[key]
if keys[-1] in slider:
raise Exception('Duplicate', key_str)
slider[keys[-1]] = value
return result
def generateEntries(slider, key_str=''):
if isinstance(slider, dict):
for key in slider:
next_key_str = (key_str + '!' + key).strip('!')
for result in generateEntries(slider[key], next_key_str):
yield(result)
elif isinstance(slider, basestring):
yield(key_str + ' = ' + slider)
else:
raise TypeError
def saveFile(config, fname):
with open(fname, 'w') as file_hadle:
for entry in generateEntries(config):
file_hadle.write('%s\n' % entry)
# End of Thx to LordKelvin
def addFolder(nick, path):
config = parseFile(conf_path)
num = max(map(int, config['vserver'].keys())) + 1
config['vserver'][str(num)] = {
'nick': nick,
'directory_index': 'index.html',
'document_root': path,
'rule': {
'1': {'handler': OrderedDict([
('', 'common'),
('allow_dirlist', '1'),
('allow_pathinfo', '0')]),
'document_root': path,
'match': 'default',
'flcache': 'forbid'
}
}
}
saveFile(config, conf_path)
os.system('sudo service cherokee restart')
os.system('echo "127.0.0.1 %s" | sudo tee -a /etc/hosts > /dev/null' % nick)
print("http://%s/" % nick)
subprocess.Popen(['xdg-open', "http://%s/" % nick])
def listServers():
config = parseFile(conf_path)
for id, server in config['vserver'].items():
print('%s -> %s' % (server['nick'], server['document_root']))
def removeServer(nick):
config = parseFile(conf_path)
server = filter(lambda x: x[1]['nick'] == nick, config['vserver'].items())[0]
del config['vserver'][server[0]]
saveFile(config, conf_path)
os.system('sudo service cherokee restart')
print('Server: %s removed' % nick)
if __name__ == '__main__':
parser = argparse.ArgumentParser(prog="ch", add_help=False)
parser.add_argument("command")
args = parser.parse_args([sys.argv[1]])
if args.command == 'list':
listServers()
elif args.command == 'add':
aparser = argparse.ArgumentParser(parents=[parser])
aparser.add_argument("nick", help="Virtual server nickname")
aparser.add_argument("path", help="Virtual server path")
args = aparser.parse_args()
addFolder(args.nick, os.path.abspath(args.path))
elif args.command == 'remove':
rparser = argparse.ArgumentParser(parents=[parser])
rparser.add_argument("nick", help="Virtual server nickname")
args = rparser.parse_args()
removeServer(args.nick)
else:
print('Wrong command')
exit(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment