reconfigure for supervisor, shadowsocks

This commit is contained in:
jysperm
2014-11-19 03:55:34 +08:00
parent 822804ea39
commit 62509da8ab
4 changed files with 150 additions and 23 deletions

View File

@@ -1,5 +1,6 @@
{async, fs, child_process, _} = app.libs
{Account} = app.models
{utils} = app
linux = require './linux'
@@ -32,14 +33,9 @@ module.exports = (callback) ->
return callback
console.log "removed /home/#{user}"
backup_filename = "#{__dirname}/../.backup/linux/#{user}-#{utils.randomString(5)}"
child_process.exec "sudo mv /home/#{user} #{backup_filename}", callback
async.series [
(callback) ->
child_process.exec "sudo mv /home/#{user} #{__dirname}/../.backup/linux/#{user}-#{utils.randomString(5)}", callback
(callback) ->
child_process.exec "sudo rm -r #{user}", callback
], callback
, callback
], (err) ->

View File

@@ -1,2 +1,81 @@
{async, _, child_process} = app.libs
{Account} = app.models
{config, utils} = app
shadowsocks = require './shadowsocks'
module.exports = (callback) ->
callback()
async.series [
(callback) ->
async.each config.plugins.shadowsocks.available_ciphers, (method, callback) ->
shadowsocks.writeSupervisorConfigure method, callback
, callback
(callback) ->
default_method = _.first config.plugins.shadowsocks.available_ciphers
Account.find
'billing.service': 'shadowsocks'
, (err, accounts) ->
async.eachSeries accounts, (account, callback) ->
{port, method, password} = account.pluggable.shadowsocks
unless method
console.log "created shadowsocks method for #{account.username}}"
account.pluggable.shadowsocks.method = default_method
account.markModified 'pluggable.shadowsocks.method'
unless password
console.log "created shadowsocks password for #{account.username}}"
account.pluggable.shadowsocks.password = utils.randomString 10
account.markModified 'pluggable.shadowsocks.password'
if port
account.save callback
else
shadowsocks.generatePort (port) ->
console.log "created shadowsocks port for #{account.username}}"
account.pluggable.shadowsocks.port = port
account.markModified 'pluggable.shadowsocks.port'
account.save callback
, callback
(callback) ->
shadowsocks.queryIptablesInfo (iptables_info) ->
Account.find
'billing.service': 'shadowsocks'
, (err, accounts) ->
async.series [
(callback) ->
async.eachSeries accounts, (account, callback) ->
port = iptables_info[account.pluggable.shadowsocks.port]
if port
callback()
else
child_process.exec "sudo iptables -I OUTPUT -p tcp --sport #{port}", callback
, callback
(callback) ->
async.eachSeries _.keys(iptables_info), (port) ->
matched_account = _.find accounts, (account) ->
return account.pluggable.shadowsocks.port == port
if matched_account
callback()
else
child_process.exec "sudo iptables -D OUTPUT #{iptables_info[port].num}", callback
, callback
], callback
(callback) ->
child_process.exec 'sudo iptables-save | sudo tee /etc/iptables.rules', callback
(callback) ->
shadowsocks.updateConfigure callback
], (err) ->
throw err if err
callback()

View File

@@ -16,22 +16,27 @@ exports.initSupervisor = (callback) ->
if program_name in _.pluck program_status, 'name'
return callback()
configure = exports.generateConfigure [],
method: method
exports.writeSupervisorConfigure method, ->
supervisor.updateProgram {}, {program_name: program_name}, ->
callback()
filename = "/etc/shadowsocks/#{method}.json"
ShadowsocksPlugin.writeConfigFile filename, configure, {mode: 0o755}, ->
supervisor.writeConfig {username: 'nobody'},
program_name: program_name
command: "ssserver -c #{filename}"
name: program_name
autostart: true
autorestart: true
stdout_logfile: false
, ->
supervisor.updateProgram {}, {program_name: program_name}, ->
callback()
, callback
exports.writeSupervisorConfigure = (method, callback) ->
program_name = "shadowsocks-#{method}"
configure = exports.generateConfigure [],
method: method
filename = "/etc/shadowsocks/#{method}.json"
ShadowsocksPlugin.writeConfigFile filename, configure, {mode: 0o755}, ->
supervisor.writeConfig {username: 'nobody'},
program_name: program_name
command: "ssserver -c #{filename}"
name: program_name
autostart: true
autorestart: true
stdout_logfile: false
, ->
callback()

View File

@@ -1,2 +1,49 @@
{async, fs, _, child_process} = app.libs
{Account} = app.models
{utils} = app
supervisor = require './supervisor'
fs.mkdirSync "#{__dirname}/../.backup/supervisor", 0o750
module.exports = (callback) ->
callback()
async.series [
(callback) ->
Account.find
'billing.service': 'supervisor'
'pluggable.supervisor.programs.0':
$exists: true
, (err, accounts) ->
async.eachSeries accounts, (account, callback) ->
async.eachSeries account.pluggable.supervisor.programs, (program, callback) ->
supervisor.writeConfig account, program, callback
, callback
, callback
(callback) ->
exists_configures = _.filter fs.readdirSync('/etc/supervisor/conf.d'), (file) ->
return file[ ... 1] == '@'
async.eachSeries exists_configures, (filename, callback) ->
[__, username, name] = filename.match /@([^-]+)-(.*)/
Account.findOne
'username': username
'billing.service': 'supervisor'
'pluggable.supervisor.programs.name': name
, (err, account) ->
if account
return callback()
else
console.log "removed /etc/supervisor/conf.d/#{filename}"
backup_filename = "#{__dirname}/../.backup/supervisor/#{filename}-#{utils.randomString(5)}"
child_process.exec "sudo mv /etc/supervisor/conf.d/#{filename} #{backup_filename}", callback
, callback
(callback) ->
child_process.exec 'sudo service supervisor restart', callback
], (err) ->
throw err if err
callback()