mirror of
https://github.com/j3ssie/osmedeus.git
synced 2026-09-27 20:14:54 +02:00
207 lines
5.1 KiB
Go
207 lines
5.1 KiB
Go
package execution
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/j3ssie/osmedeus/libs"
|
|
"github.com/j3ssie/osmedeus/utils"
|
|
"log"
|
|
"strings"
|
|
|
|
"github.com/xanzy/go-gitlab"
|
|
)
|
|
|
|
// GitlabAuth do authentication with gitlab
|
|
func GitlabAuth(options libs.Options) (*gitlab.Client, error) {
|
|
if options.NoGit {
|
|
return nil, nil
|
|
}
|
|
// prefer using username
|
|
if options.Git.Username != "GITLAB_USER" {
|
|
utils.DebugF("Do authen with user: %s", options.Git.Username)
|
|
git, err := gitlab.NewBasicAuthClient(
|
|
options.Git.Username,
|
|
options.Git.Password,
|
|
gitlab.WithBaseURL(options.Git.BaseURL),
|
|
)
|
|
if err != nil {
|
|
utils.WarnF("Error authen in Gitlab %v: %v", options.Git.BaseURL, err)
|
|
return nil, err
|
|
}
|
|
return git, nil
|
|
}
|
|
|
|
if options.Git.Token == "" {
|
|
return nil, errors.New("no credentials provided")
|
|
}
|
|
utils.DebugF("Do authen with token: %s", options.Git.Token)
|
|
git, err := gitlab.NewClient(
|
|
options.Git.Token,
|
|
gitlab.WithBaseURL(options.Git.BaseURL),
|
|
)
|
|
if err != nil {
|
|
utils.WarnF("Error authen in Gitlab %v: %v", options.Git.BaseURL, err)
|
|
return nil, err
|
|
}
|
|
return git, nil
|
|
}
|
|
|
|
// CreateGitlabRepo create gitlab repo
|
|
func CreateGitlabRepo(repo string, tag string, options libs.Options) string {
|
|
if options.NoGit {
|
|
return ""
|
|
}
|
|
git, err := GitlabAuth(options)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
utils.InforF("Create repo: %v", repo)
|
|
tags := []string{options.Git.DefaultTag}
|
|
if tag != "" {
|
|
if strings.Contains(tag, ",") {
|
|
tags = append(tags, strings.Split(tag, ",")...)
|
|
} else {
|
|
tags = append(tags, tag)
|
|
}
|
|
}
|
|
|
|
opt := gitlab.CreateProjectOptions{
|
|
Name: gitlab.String(repo),
|
|
Path: nil,
|
|
DefaultBranch: gitlab.String("master"),
|
|
Visibility: gitlab.Visibility(gitlab.PrivateVisibility),
|
|
TagList: &tags,
|
|
}
|
|
gRepo, _, err := git.Projects.CreateProject(&opt, nil)
|
|
if err != nil {
|
|
utils.WarnF("Error to create %v: %v", repo, err)
|
|
return ""
|
|
}
|
|
|
|
optMember := gitlab.AddProjectMemberOptions{
|
|
UserID: gitlab.Int(options.Git.DefaultUID),
|
|
AccessLevel: gitlab.AccessLevel(gitlab.MaintainerPermissions),
|
|
}
|
|
git.ProjectMembers.AddProjectMember(gRepo.ID, &optMember)
|
|
utils.InforF("Created repo at: %s with pid: %v", gRepo.SSHURLToRepo, gRepo.ID)
|
|
return gRepo.SSHURLToRepo
|
|
}
|
|
|
|
// DeleteRepo delete repo by id or name
|
|
func DeleteRepo(repo string, pid int, options libs.Options) {
|
|
if options.NoGit {
|
|
return
|
|
}
|
|
git, err := GitlabAuth(options)
|
|
if err != nil {
|
|
return
|
|
}
|
|
// select pid first
|
|
if pid != 0 {
|
|
utils.InforF("Delete repo with id: %v", pid)
|
|
git.Projects.DeleteProject(pid)
|
|
return
|
|
}
|
|
|
|
user, _, err := git.Users.CurrentUser()
|
|
projects, _, err := git.Projects.ListUserProjects(user.ID, nil)
|
|
for _, project := range projects {
|
|
if project.Name == repo {
|
|
utils.InforF("Delete repo: %v", repo)
|
|
git.Projects.DeleteProject(project.ID)
|
|
return
|
|
}
|
|
}
|
|
utils.WarnF("Project not found: %v", repo)
|
|
}
|
|
|
|
// ListProjects delete repo by id or name
|
|
func ListProjects(gitUser int, options libs.Options) {
|
|
if options.NoGit {
|
|
return
|
|
}
|
|
git, err := GitlabAuth(options)
|
|
if err != nil {
|
|
utils.WarnF("Err get do authen user: %v", err)
|
|
return
|
|
}
|
|
uid := gitUser
|
|
var username string
|
|
if gitUser == 0 {
|
|
user, _, err := git.Users.CurrentUser()
|
|
if err != nil {
|
|
utils.WarnF("Err get current user: %v", err)
|
|
return
|
|
}
|
|
uid = user.ID
|
|
username = user.Username
|
|
} else {
|
|
//user, _, err := git.Users.GetUser(uid, git.Users.)
|
|
//if err != nil {
|
|
// utils.WarnF("Err get current user: %v", err)
|
|
// return
|
|
//}
|
|
//username = user.Username
|
|
}
|
|
utils.InforF("Listing projects of uid: %v", uid)
|
|
projects, _, err := git.Projects.ListUserProjects(uid, nil)
|
|
if err != nil {
|
|
utils.WarnF("Error listing projects: %v", err)
|
|
return
|
|
}
|
|
for _, project := range projects {
|
|
fmt.Printf("%30s -- %10d\n", fmt.Sprintf("%s/%s", username, project.Name), project.ID)
|
|
}
|
|
}
|
|
|
|
// This example shows how to create a client with username and password.
|
|
func GitAuthSample() {
|
|
// git, err := gitlab.NewBasicAuthClient(
|
|
// "user",
|
|
// "password",
|
|
// gitlab.WithBaseURL("https://gitlab.com"),
|
|
// )
|
|
git, err := gitlab.NewClient(
|
|
"token-here-s",
|
|
gitlab.WithBaseURL("https://gitlab.com"),
|
|
)
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// List all projects
|
|
user, _, err := git.Users.CurrentUser()
|
|
//spew.Dump(user)
|
|
|
|
// Create
|
|
projects, _, err := git.Projects.ListUserProjects(user.ID, nil)
|
|
////git.Projects.
|
|
//group, _, _ := git.Groups.ListAllGroupMembers(9182310, nil)
|
|
//spew.Dump(group)
|
|
//tags := []string{"osm", "test"}
|
|
////git.Projects.ListUserProjects()
|
|
//opt := gitlab.CreateProjectOptions{
|
|
// Name: gitlab.String("test-project-tag-osm"),
|
|
// Path: nil,
|
|
// DefaultBranch: gitlab.String("master"),
|
|
// //GroupWithProjectTemplatesID: gitlab.Int(9182310),
|
|
// Visibility: gitlab.Visibility(gitlab.PrivateVisibility),
|
|
// TagList: &tags,
|
|
//}
|
|
//git.Projects.CreateProject(&opt, nil)
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
//git.Projects.DeleteProject(pid)
|
|
|
|
log.Printf("Found %d projects", len(projects))
|
|
for _, project := range projects {
|
|
fmt.Printf("%30s -- %10d\n", fmt.Sprintf("%s/%s", user.Username, project.Name), project.ID)
|
|
}
|
|
|
|
}
|