Created
March 25, 2015 09:57
-
-
Save averrin/ea793957aca4053c3cad to your computer and use it in GitHub Desktop.
Basic CLI Cherokee webserver editor (just for static folders)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!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