2 # Click "Reassign bug to owner and QA contact of selected component"
3 # for the Bug IDs given as arguments.
4 # Configure: '$USERNAME' and '~/priv/bugzilla.pwd'.
5 # Workarounds: 'nothing changed' of Bugzilla Version 2.18-rh.
12 require LWP::UserAgent;
16 my $USERNAME='jkratoch%40redhat.com';
17 my $PASSWORD=&_priv_get("bugzilla.pwd");
18 my $BASE_GET='https://bugzilla.redhat.com/bugzilla/show_bug.cgi';
19 my $BASE_POST='https://bugzilla.redhat.com/bugzilla/process_bug.cgi';
21 my $ua=LWP::UserAgent->new();
23 #$ua->env_proxy(); # conflicts with 'https'
24 push @{$ua->requests_redirectable()},"POST"; # probably not needed
28 my($base,$id,@data)=@_;
30 return $base.'?'.join('&',
32 'Bugzilla_login='.$USERNAME,
33 'Bugzilla_password='.$PASSWORD,
38 require HTTP::Cookies;
39 my $jar=HTTP::Cookies->new();
40 $ua->cookie_jar($jar); # important
46 my $request=HTTP::Request->new(($content ? "POST" : "GET"),$url);
47 do { $request->content($_) if $_; } for $content;
48 my $response=$ua->simple_request($request);
49 die Dumper($response)."\n".$url if !$response->is_success() || !(my $r=$response->content());
57 my $full=$ENV{"HOME"}."/priv/".$base;
59 open F,$full or die "$full: $!";
60 my $r=do { local $/; <F>; } or die "read \"$full\": $!";
61 close F or die "close \"$full\": $!";
66 die "id list" if !@ARGV;
73 my $filename="/tmp/bzreassign-$id.log";
75 open F,">$filename" or die "open $filename: $!";
76 my $get=simple(URL($BASE_GET,$id));
78 $get=$get->{"_content"} or die;
79 $get=~s{^.*(<form name="changeform".*</form>).*$}{$1}s or die;
81 while ($get=~/<input\b([^>]*)>/ig) {
84 $args{lc $1}=$2 while $args=~/\b(\w+)(?:="([^"]*)"|)/g;
85 my $type=$args{"type"}||"text";
86 $args{"value"}="" if $type eq "text" && !defined $args{"value"};
87 next if $type eq "submit" && !$args{"name"};
88 next if $type eq "checkbox" && !exists $args{"checked"};
90 warn "no name: $args";
93 if (!defined $args{"value"}) {
94 warn "no value: $args";
97 next if $type eq "radio" && !exists $args{"checked"};
98 $hidden{$args{"name"}}=$args{"value"};
100 while ($get=~/<select\b([^>]*)>(.*?)<\/select>/igs) {
105 while ($body=~/<option\b([^>]*)>/ig) {
108 $args2{lc $1}=$2 while $args2=~/\b(\w+)(?:="([^"]*)"|)/g;
109 $first=$args2{"value"} if !defined $first;
110 if (exists $args2{"selected"}) {
111 warn "already selected: $args" if defined $selected;
112 $selected=$args2{"value"};
117 $args{lc $1}=$2 while $args=~/\b(\w+)="([^"]*)"/g;
118 $selected=$first if !defined $selected && !exists $args{"multiple"};
119 next if !defined $selected && exists $args{"multiple"};
120 if (!$args{"name"}) {
121 warn "no name: $args";
124 if (!defined $selected) {
125 warn "no selected: $args";
128 $hidden{$args{"name"}}=$selected;
130 die "no keys" if !keys(%hidden);
131 $hidden{"knobr"}="reassignbycomponent";;
132 for my $key (keys(%hidden)) {
134 s/&#(\d+);/chr $1/eg;
139 $_=URI::Escape::uri_escape($_);
142 print F "$_=".$hidden{$_}."\n" for sort keys(%hidden);
143 my $page=simple($BASE_POST,join('&',map($_."=".$hidden{$_},keys(%hidden))));
144 print F Dumper($page);
145 $page=$page->{"_content"} or die;
146 $page=~/<title>Bug $id Processed/ or die;
147 close F or die "$filename: $!";