[Git][debian-gis-team/scripts][master] Add script to delete pipelines.
Bas Couwenberg
gitlab at salsa.debian.org
Sat Mar 30 17:15:53 GMT 2019
Bas Couwenberg pushed to branch master at Debian GIS Project / scripts
Commits:
ae2574a5 by Bas Couwenberg at 2019-03-30T17:15:43Z
Add script to delete pipelines.
- - - - -
1 changed file:
- + salsa-delete-pipelines.pl
Changes:
=====================================
salsa-delete-pipelines.pl
=====================================
@@ -0,0 +1,291 @@
+#!/usr/bin/perl -w
+#
+# Copyright 2018-2019, Bas Couwenberg <sebastic at debian.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+use strict;
+use Data::Dumper;
+use File::Basename;
+use Getopt::Long qw(:config bundling no_ignore_case);
+use HTTP::Request::Common;
+use JSON;
+use LWP::UserAgent;
+use URI::Escape;
+
+$|=1;
+
+my %cfg = (
+ url => 'https://salsa.debian.org/api/v4',
+ token => '',
+ token_file => $ENV{HOME}.'/.salsa-token',
+ namespace => '2052',
+ user => '',
+ group => 'debian-gis-team',
+ project => '',
+ debug => 0,
+ verbose => 0,
+ help => 0,
+ );
+
+my $result = GetOptions(
+ 'u|url=s' => \$cfg{url},
+ 'n|namespace=i' => \$cfg{namespace},
+ 'U|user=s' => \$cfg{user},
+ 'G|group=s' => \$cfg{group},
+ 't|token=s' => \$cfg{token},
+ 'p|project=s' => \$cfg{project},
+ 'd|debug' => \$cfg{debug},
+ 'v|verbose' => \$cfg{verbose},
+ 'h|help' => \$cfg{help},
+ );
+
+if(!$result || $cfg{help} || !$cfg{project}) {
+ print STDERR "\n" if(!$result);
+
+ print "Usage: ". basename($0) ." [OPTIONS]\n\n";
+ print "Options:\n";
+ print "-u, --url <URL> Salsa URL ($cfg{url})\n";
+ print "-t, --token <STRING> Salsa token (". '*' x length($cfg{token}) .")\n";
+ print "-T, --token-file <PATH> Salsa token file ($cfg{token_file})\n";
+ print "\n";
+ print "-n, --namespace <ID> Salsa namespace ($cfg{namespace})\n";
+ print "-U, --user <NAME> Salsa user path ($cfg{user})\n";
+ print "-G, --group <NAME> Salsa group path ($cfg{group})\n";
+ print "\n";
+ print "-p, --project <NAME> Project name\n";
+ print "\n";
+ print "-d, --debug Enable debug output\n";
+ print "-v, --verbose Enable verbose output\n";
+ print "-h, --help Display this usage information\n";
+
+ exit 1;
+}
+
+my $ua = new LWP::UserAgent(agent => basename($0));
+
+$cfg{token} = get_private_token() if(!$cfg{token});
+
+if(!$cfg{token}) {
+ print "Error: No private token specified with file nor option!\n";
+
+ exit 1;
+}
+
+$cfg{namespace} = get_namespace() if(!$cfg{namespace});
+
+if(!$cfg{namespace}) {
+ print "Error: No namespace found! Specify namespace, user or group!\n";
+
+ exit 1;
+}
+
+# Get projects for team
+my $team_projects = get_team_projects();
+
+print "team projects:\n".Dumper($team_projects) if($cfg{debug});
+
+# Get service settings
+foreach my $project (@{$team_projects}) {
+ if($project->{name} eq $cfg{project} || $project->{id} eq $cfg{project}) {
+ print "\nProject: ". $project->{name} ." (". $project->{id} .")\n" if($cfg{verbose});
+
+ my $pipelines = get_project_pipelines($project);
+
+ print "pipelines:\n".Dumper($pipelines);
+
+ foreach my $pipeline (@{$pipelines}) {
+ delete_project_pipeline($project, $pipeline);
+ }
+ }
+}
+
+exit 0;
+
+################################################################################
+# Subroutines
+
+sub get_private_token {
+ my $token = '';
+
+ if(!$cfg{token_file}) {
+ print "No private token file to check.\n" if($cfg{verbose});
+
+ return $token;
+ }
+
+ print "Checking file for private token: $cfg{token_file}\n" if($cfg{debug});
+
+ if(-r $cfg{token_file}) {
+ my $mode = sprintf("%o", (stat($cfg{token_file}))[2] & 07777);
+ if($mode != 600) {
+ print "Warning: Permissions on $cfg{token_file} are not 600 (-rw-------)\n";
+ }
+
+ print "Loading private token from: $cfg{token_file} ($mode)\n" if($cfg{debug});
+
+ open(F, $cfg{token_file}) || die "Error: Failed to open file: $cfg{token_file} ($!)";
+ while(<F>) {
+ next if(/^\s*#|^\s*$/);
+
+ if(/^(\S{10,})\s*/) {
+ $token = $1;
+ last;
+ }
+ }
+ close F;
+ }
+ else {
+ print "File not readable: $cfg{token_file}\n" if($cfg{debug});
+ }
+
+ return $token;
+}
+
+sub get_namespace {
+ my $url = $cfg{url}.'/namespaces';
+
+ print "Getting namespaces\n" if($cfg{verbose});
+
+ my $req = new HTTP::Request(GET => $url);
+ $req->header('PRIVATE-TOKEN' => $cfg{token});
+
+ my $res = $ua->request($req);
+ if($res->is_success) {
+ my $content = $res->content;
+
+ my $data = decode_json($content);
+
+ print "namespaces:\n".Dumper($data) if($cfg{debug});
+
+ my $namespace = '';
+
+ foreach my $ns (@{$data}) {
+ if($cfg{user} && $ns->{kind} eq 'user' && $ns->{path} eq $cfg{user}) {
+ print "Found namespace: ". $ns->{id} ." for user: $cfg{user}\n" if($cfg{verbose});
+
+ $namespace = $ns->{id};
+
+ last;
+ }
+ elsif($cfg{group} && $ns->{kind} eq 'group' && $ns->{path} eq $cfg{group}) {
+ print "Found namespace: ". $ns->{id} ." for group: $cfg{group}\n" if($cfg{verbose});
+
+ $namespace = $ns->{id};
+
+ last;
+ }
+ }
+
+ return $namespace;
+ }
+ else {
+ print "Error: Request failed! ($url)\n";
+ print "HTTP Status: ".$res->code." ".$res->message."\n";
+ print $res->content if($res->content);
+
+ exit 1;
+ }
+}
+
+sub get_team_projects {
+ my ($projects, $page) = @_;
+
+ $projects = [] if(!$projects);
+ $page = 1 if(!$page);
+
+ my $url = $cfg{url}.'/groups/'.uri_escape($cfg{namespace}).'/projects';
+ $url .= '?order_by=name';
+ $url .= '&sort=asc';
+ $url .= '&page='.uri_escape($page);
+ $url .= '&per_page=100';
+
+ print "Getting projects for namespace: $cfg{namespace} (page: $page)\n" if($cfg{verbose});
+
+ my $req = new HTTP::Request(GET => $url);
+ $req->header('PRIVATE-TOKEN' => $cfg{token});
+
+ my $res = $ua->request($req);
+ if($res->is_success) {
+ my $content = $res->content;
+
+ my $data = decode_json($content);
+
+ foreach my $project (@{$data}) {
+ push @{$projects}, $project;
+ }
+
+ my $next_page = $res->header('X-Next-Page');
+ if($next_page && $next_page ne $page) {
+ $projects = get_team_projects($projects, $next_page);
+ }
+
+ return $projects;
+ }
+ else {
+ print "Error: Request failed! ($url)\n";
+ print "HTTP Status: ".$res->code." ".$res->message."\n";
+ print $res->content if($res->content);
+
+ exit 1;
+ }
+}
+
+sub get_project_pipelines {
+ my ($project) = @_;
+
+ my $url = $cfg{url}.'/projects/'. $project->{id} .'/pipelines';
+
+ print "Getting pipelines for project: ". $project->{name} ."\n" if($cfg{verbose});
+
+ my $req = new HTTP::Request(GET => $url);
+ $req->header('PRIVATE-TOKEN' => $cfg{token});
+
+ my $res = $ua->request($req);
+ if($res->is_success) {
+ my $content = $res->content;
+
+ my $data = decode_json($content);
+
+ return $data;
+ }
+ else {
+ print "Error: Request failed! ($url)\n";
+ print "HTTP Status: ".$res->code." ".$res->message."\n";
+ print $res->content if($res->content);
+
+ exit 1;
+ }
+}
+
+sub delete_project_pipeline {
+ my ($project, $pipeline) = @_;
+
+ my $url = $cfg{url}.'/projects/'. $project->{id} .'/pipelines/'. $pipeline->{id};
+
+ my $req = new HTTP::Request(DELETE => $url);
+ $req->header('PRIVATE-TOKEN' => $cfg{token});
+
+ my $res = $ua->request($req);
+ if(!$res->is_success) {
+ print "Error: Request failed! ($url)\n";
+ print "HTTP Status: ".$res->code." ".$res->message."\n";
+ print $res->content if($res->content);
+
+ exit 1;
+ }
+}
+
View it on GitLab: https://salsa.debian.org/debian-gis-team/scripts/commit/ae2574a5825b01dbd19448a9a107351247bd420d
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/scripts/commit/ae2574a5825b01dbd19448a9a107351247bd420d
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20190330/37f8f85e/attachment-0001.html>
More information about the Pkg-grass-devel
mailing list