-
-
Save mihael/4358541 to your computer and use it in GitHub Desktop.
This file contains 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
#a simple gitosis-admin/* interface | |
#used at http://kitschmaster.com for managing Gitosis | |
module Gitsis | |
def save_changes(msg, config) | |
c_msg = `cd #{File.dirname(config)}; git commit -am '#{msg}'` | |
p_msg = `cd #{File.dirname(config)}; git push origin master` | |
"GITSIS:\n#{c_msg}\n#{p_msg}" | |
end | |
class Group | |
attr_accessor :name, :writables, :members | |
def initialize(n, w, m) | |
@name = n | |
@writables = w | |
@members = m | |
end | |
end | |
class Repo | |
attr_accessor :name, :description, :owner | |
def initialize(n, d, o) | |
@name = n | |
@description = d | |
@owner= o | |
end | |
end | |
def parse_group(name, config) | |
header = "group #{name}" | |
w = [] | |
m = [] | |
inside = 0 | |
File.open(config, "r").each do |line| | |
if inside>0&&inside<3 | |
w = line.split(" = ")[1].split if line =~ /writable =/ | |
m = line.split(" = ")[1].split if line =~ /members =/ | |
inside+=1 | |
end | |
inside = 1 if line =~ /\[#{header}\]/ | |
end | |
Group.new(name, w, m) | |
end | |
def parse_repo(name, config) | |
header = "repo #{name}" | |
d = "" | |
o = "" | |
inside = 0 | |
File.open(config, "r").each do |line| | |
if inside>0&&inside<3 | |
d = line.split(" = ")[1].split if line =~ /description =/ | |
o = line.split(" = ")[1].split if line =~ /owner =/ | |
inside+=1 | |
end | |
inside = 1 if line =~ /\[#{header}\]/ | |
end | |
Repo.new(name, d, o) | |
end | |
def parse_datetime(line) | |
parts = line[1..-1].split | |
DateTime.strptime("#{parts[0]} #{parts[1]}","%d.%m.%Y %H:%M:%S") | |
end | |
#lines: an array of lines | |
def delete_lines(lines, config) | |
return false unless lines.size>0 | |
f = config | |
fb = f + ".bak" | |
File.rename(f, fb) | |
File.open(f, "w") do |out| | |
File.foreach(fb) {|line| out.puts line unless lines.include? $.} | |
end | |
true | |
end | |
#returns line number if found, else false | |
def find_header(header, config) | |
File.open(config, "r").each do |line| | |
return $. if line =~ /\[#{header}\]/ | |
end | |
false | |
end | |
def find_repo(name, config) | |
find_header("repo #{name}", config) | |
end | |
def find_group(name, config) | |
find_header("group #{name}", config) | |
end | |
def add_repo(name, description, owner, config) | |
#check if there is already a repo named like this, if yes, return | |
return false if find_repo(name, config) | |
#goto end of file add | |
#[repo name] | |
#description = #{description} | |
#owner = #{owner} | |
File.open(config, "a") do |out| #append at end | |
out.puts "[repo #{name}]" | |
out.puts "description = #{description}" | |
out.puts "owner = #{owner}" | |
out.puts " " | |
end | |
true | |
end | |
def rem_repo(name, config) | |
#move to the header line and delete that one plus all next lines until next header | |
header_line = find_repo(name, config) | |
delete_lines([header_line, header_line+1, header_line+2], config) if header_line | |
end | |
def add_group(name, writables, members, config) | |
return false if find_group(name, config) | |
File.open(config, "a") do |out| | |
out.puts "[group #{name}]" | |
out.puts "writable = #{writables.join(' ')}" | |
out.puts "members = #{members.join(' ')}" | |
out.puts " " | |
end | |
true | |
end | |
def rem_group(name, config) | |
header_line = find_group(name, config) | |
delete_lines([header_line, header_line+1, header_line+2], config) if header_line | |
end | |
def find_key(member, config) | |
f = File.join(File.dirname(config), "keydir", "#{member}.pub") | |
File.exists? f | |
end | |
def add_key(member, ssh_key, config) | |
f = File.join(File.dirname(config), "keydir", "#{member}.pub") | |
File.open(f, "w") do |out| | |
out.puts ssh_key | |
end | |
`cd #{File.dirname(config)}; git add keydir/#{member}.pub` | |
end | |
def rem_key(member, config) | |
File.delete(File.join(File.dirname(config), "keydir", "#{member}.pub")) | |
end | |
def add_member(member, group_name, config) | |
#get previous values | |
header_line = find_group(group_name, config) | |
header = "group #{group_name}" | |
if header_line | |
inside = 0 | |
w = [] | |
m = [] | |
File.open(config, "r").each do |line| | |
if inside>0&&inside<3 | |
w = line.split(" = ")[1].split if line =~ /writable =/ | |
m = line.split(" = ")[1].split if line =~ /members =/ | |
inside+=1 | |
end | |
inside = 1 if line =~ /\[#{header}\]/ | |
end | |
#remove this group | |
delete_lines([header_line, header_line+1, header_line+2], config) | |
#add values to write back | |
m << member unless m.include? member | |
#add refreshed group | |
add_group(group_name, w, m, config) | |
return true | |
end | |
false | |
end | |
def rem_member(member, group_name, config) | |
#get previous values | |
header_line = find_group(group_name, config) | |
header = "group #{group_name}" | |
if header_line | |
inside = 0 | |
w = [] | |
m = [] | |
File.open(config, "r").each do |line| | |
if inside>0&&inside<3 | |
w = line.split(" = ")[1].split if line =~ /writable =/ | |
m = line.split(" = ")[1].split if line =~ /members =/ | |
inside+=1 | |
end | |
inside = 1 if line =~ /\[#{header}\]/ | |
end | |
#remove this group | |
delete_lines([header_line, header_line+1, header_line+2], config) | |
#remove values to write back | |
m.delete(member) if m.include? member | |
#add refreshed group | |
add_group(group_name, w, m, config) | |
return true | |
end | |
false | |
end | |
def add_writable(writable, group_name, config) | |
#get previous values | |
header_line = find_group(group_name, config) | |
header = "group #{group_name}" | |
if header_line | |
inside = 0 | |
w = [] | |
m = [] | |
File.open(config, "r").each do |line| | |
if inside>0&&inside<3 | |
w = line.split(" = ")[1].split if line =~ /writable =/ | |
m = line.split(" = ")[1].split if line =~ /members =/ | |
inside+=1 | |
end | |
inside = 1 if line =~ /\[#{header}\]/ | |
end | |
#remove this group | |
delete_lines([header_line, header_line+1, header_line+2], config) | |
#add values to write back | |
w << writable unless w.include? writable | |
#add refreshed group | |
add_group(group_name, w, m, config) | |
return true | |
end | |
false | |
end | |
def rem_writable(config, group_name, writable) | |
#get previous values | |
header_line = find_group(group_name, config) | |
header = "group #{group_name}" | |
if header_line | |
inside = 0 | |
w = [] | |
m = [] | |
File.open(config, "r").each do |line| | |
if inside>0&&inside<3 | |
w = line.split(" = ")[1].split if line =~ /writable =/ | |
m = line.split(" = ")[1].split if line =~ /members =/ | |
inside+=1 | |
end | |
inside = 1 if line =~ /\[#{header}\]/ | |
end | |
#remove this group | |
delete_lines([header_line, header_line+1, header_line+2], config) | |
#remove values to write back | |
w.delete(writable) if w.include? writable | |
#add refreshed group | |
add_group(group_name, w, m, config) | |
return true | |
end | |
false | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment