2
0
mirror of https://gitlab.com/apparmor/apparmor synced 2025-08-29 21:38:15 +00:00

Add support in YaST UI wizards for the AppArmor profile repository.

This commit is contained in:
Dominic Reynolds 2007-04-26 02:56:54 +00:00
parent 73c22acbdf
commit 3d16e4e6d6
3 changed files with 433 additions and 258 deletions

View File

@ -14,30 +14,13 @@
import "Sequencer";
include "subdomain/apparmor_profile_check.ycp";
include "subdomain/apparmor_packages.ycp";
include "subdomain/apparmor_ycp_utils.ycp";
textdomain "yast2-apparmor";
boolean done = false;
string type = "";
string status = "";
map CMDS = $[ ];
CMDS["CMD_ALLOW"] = _("&Allow");
CMDS["CMD_DENY"] = _("&Deny");
CMDS["CMD_ABORT"] = _("Abo(r)t");
CMDS["CMD_FINISHED"] = _("&Finish");
CMDS["CMD_INHERIT"] = _("&Inherit");
CMDS["CMD_PROFILE"] = _("&Profile");
CMDS["CMD_UNCONFINED"] = _("&Unconfined");
CMDS["CMD_NEW"] = _("&Edit");
CMDS["CMD_GLOB"] = _("&Glob");
CMDS["CMD_GLOBEXT"] = _("Glob w/E&xt");
CMDS["CMD_ADDHAT"] = _("&Add Requested Hat");
CMDS["CMD_USEDEFAULT"] = _("&Use Default Hat");
CMDS["CMD_SCAN"] = _("&Scan system log for AppArmor events");
CMDS["CMD_VIEW_REPO"] = _("&View Profile");
CMDS["CMD_USE_REPO"] = _("&Use Profile");
CMDS["CMD_CREATE_PROFILE"] = _("&Create New Profile");
if (!installAppArmorPackages()) {
return;
}
@ -315,27 +298,38 @@
// tell the backend what they did
SCR::Write(.genprof, answers);
} else if (type == "dialog-view-profile") {
} else if (type == "dialog-repo-sign-in") {
string user = agent_data["user"]:"MISSING USER";
string profile = agent_data["profile"]:"MISSING PROFILE";
string default_ans = agent_data["default"]:"b";
map<string,string> answers = UI_RepositorySignInDialog( agent_data );
SCR::Write(.genprof, answers);
symbol focus = `focus_yes;
if (default_ans == "b") {
focus = `focus_no;
}
map answers = $[ ];
if (Popup::AnyQuestion(_("Profile created by user ") + user,
profile, _("&Use Profile"), _("&Back"), focus)) {
answers["answer"] = "u";
} else {
answers["answer"] = "b";
}
// write the answers for the last dialog
boolean written = SCR::Write(.genprof, answers);
} else if (type == "dialog-repo-view-profile") {
} else if (type == "dialog-yesno") {
map<string,string> answers = $[ ];
UI_RepositoryViewProfile( agent_data );
answers["answer"] = "okay";
SCR::Write(.genprof, answers);
} else if (type == "dialog-select-profiles") {
map<any,any> answers = UI_MultiProfileSelectionDialog( agent_data );
SCR::Write(.genprof, answers);
} else if (type == "long-dialog-message") {
map<string,string> answers = $[ ];
UI_LongMessage( agent_data );
answers["answer"] = "okay";
SCR::Write(.genprof, answers);
} else if (type == "short-dialog-message") {
map<string,string> answers = $[ ];
UI_ShortMessage( agent_data );
answers["answer"] = "okay";
SCR::Write(.genprof, answers);
} else if (type == "dialog-yesno") {
string question = agent_data["question"]:"MISSING QUESTION";
string default_ans = agent_data["default"]:"n";

View File

@ -14,30 +14,13 @@
import "Sequencer";
include "subdomain/apparmor_packages.ycp";
include "subdomain/apparmor_profile_check.ycp";
include "subdomain/apparmor_ycp_utils.ycp";
textdomain "yast2-apparmor";
boolean done = false;
string type = "";
string status = "";
map CMDS = $[ ];
CMDS["CMD_ALLOW"] = _("&Allow");
CMDS["CMD_DENY"] = _("&Deny");
CMDS["CMD_ABORT"] = _("Abo&rt");
CMDS["CMD_FINISHED"] = _("&Finish");
CMDS["CMD_INHERIT"] = _("&Inherit");
CMDS["CMD_PROFILE"] = _("&Profile");
CMDS["CMD_UNCONFINED"] = _("&Unconfined");
CMDS["CMD_NEW"] = _("&Edit");
CMDS["CMD_GLOB"] = _("&Glob");
CMDS["CMD_GLOBEXT"] = _("Glob w/E&xt");
CMDS["CMD_ADDHAT"] = _("&Add Requested Hat");
CMDS["CMD_USEDEFAULT"] = _("&Use Default Hat");
CMDS["CMD_SCAN"] = _("&Scan system log for AppArmor events");
CMDS["CMD_VIEW_REPO"] = _("&View Profile");
CMDS["CMD_USE_REPO"] = _("&Use Profile");
CMDS["CMD_CREATE_PROFILE"] = _("&Create New Profile");
if (!installAppArmorPackages()) {
return;
}
@ -314,26 +297,35 @@
// tell the backend what they did
SCR::Write(.logprof, answers);
} else if (type == "dialog-view-profile") {
} else if (type == "dialog-repo-sign-in") {
string user = agent_data["user"]:"MISSING USER";
string profile = agent_data["profile"]:"MISSING PROFILE";
string default_ans = agent_data["default"]:"b";
map<string,string> answers = UI_RepositorySignInDialog( agent_data );
SCR::Write(.genprof, answers);
symbol focus = `focus_yes;
if (default_ans == "b") {
focus = `focus_no;
}
map answers = $[ ];
if (Popup::AnyQuestion(_("Profile created by user ") + user,
profile, _("&Use Profile"), _("&Back"), focus)) {
answers["answer"] = "u";
} else {
answers["answer"] = "b";
}
// write the answers for the last dialog
boolean written = SCR::Write(.logprof, answers);
} else if (type == "dialog-repo-view-profile") {
map<string,string> answers = $[ ];
UI_RepositoryViewProfile( agent_data );
answers["answer"] = "okay";
SCR::Write(.genprof, answers);
} else if (type == "dialog-select-profiles") {
map<any,any> answers = UI_MultiProfileSelectionDialog( agent_data );
SCR::Write(.genprof, answers);
} else if (type == "long-dialog-message") {
map<string,string> answers = $[ ];
UI_LongMessage( agent_data );
answers["answer"] = "okay"; SCR::Write(.genprof, answers);
} else if (type == "short-dialog-message") {
map<string,string> answers = $[ ];
UI_ShortMessage( agent_data );
answers["answer"] = "okay";
SCR::Write(.genprof, answers);
} else if (type == "dialog-yesno") {
@ -469,8 +461,6 @@
done = true;
}
} until ( done == true);
Wizard::CloseDialog();

View File

@ -70,6 +70,9 @@ our @EXPORT = qw(
UI_GetString
UI_GetFile
UI_YesNo
UI_ShortMessage
UI_LongMessage
UI_Important
UI_Info
UI_PromptUser
@ -82,6 +85,7 @@ our @EXPORT = qw(
readprofile
readprofiles
writeprofile
serialize_profile
check_for_subdomain
@ -162,6 +166,7 @@ my %profilechanges;
my %prelog;
my %log;
my %changed;
my @created;
my %skip;
our %helpers; # we want to preserve this one between passes
@ -672,8 +677,13 @@ sub get_profile_from_repo {
if ($ans eq "CMD_VIEW_REPO") {
if ($UI_Mode eq "yast") {
SendDataToYast( { type => "dialog-view-profile", user => $arg,
profile => $p->{profile} } );
SendDataToYast(
{
type => "dialog-repo-view-profile",
user => $options[$arg],
profile => $p->{profile}
}
);
my ($ypath, $yarg) = GetDataFromYast();
$ans = $yarg->{answer} || "b";
if ( $ans eq "u" ) {
@ -760,7 +770,7 @@ sub create_new_profile {
}
}
}
push @created, $fqdbin;
return { $fqdbin => $profile };
}
@ -1072,6 +1082,8 @@ my %CMDS = (
CMD_PROFILE_CLEAN => "(P)rofile Clean Exec",
CMD_UNCONFINED => "(U)nconfined",
CMD_UNCONFINED_CLEAN => "(U)nconfined Clean Exec",
CMD_SAVE => "(S)ave Changes",
CMD_CONTINUE => "(C)ontinue Profiling",
CMD_NEW => "(N)ew",
CMD_GLOB => "(G)lob",
CMD_GLOBEXT => "Glob w/(E)xt",
@ -1127,6 +1139,36 @@ sub UI_PromptUser ($) {
}
}
sub UI_ShortMessage {
my ($headline, $message) = @_;
SendDataToYast(
{
type => "short-dialog-message",
headline => $headline,
message => $message
}
);
my ($ypath, $yarg) = GetDataFromYast();
}
sub UI_LongMessage {
my ($headline, $message) = @_;
$headline = "MISSING" if not defined $headline;
$message = "MISSING" if not defined $message;
SendDataToYast(
{
type => "long-dialog-message",
headline => $headline,
message => $message
}
);
my ($ypath, $yarg) = GetDataFromYast();
}
##########################################################################
# here are the interface functions to send data back and forth between
# the yast frontend and the perl backend
@ -2382,31 +2424,62 @@ sub get_result_error {
sub ask_signup_info {
my ($res, $newuser, $user, $pass, $email, $signup_okay);
my ($res, $save_config, $newuser, $user, $pass, $email, $signup_okay);
if ($repo_client) {
do {
$newuser = UI_YesNo(gettext("Create New User?"), "n");
$user = UI_GetString("Username: ", $user);
$pass = UI_GetString("Password: ", $pass);
$email = UI_GetString("Email Addr: ", $email) if ($newuser eq "y");
if ( $newuser eq "y" ) {
if ($UI_Mode eq "yast") {
SendDataToYast(
{
type => "dialog-repo-sign-in",
repo_url => $cfg->{settings}{repository}
}
);
my ($ypath, $yarg) = GetDataFromYast();
$email = $yarg->{email};
$user = $yarg->{user};
$pass = $yarg->{pass};
$newuser = $yarg->{newuser};
$save_config = $yarg->{save_config};
if ($yarg->{cancelled} && $yarg->{cancelled} eq "y") {
return;
}
$DEBUGGING && debug("AppArmor Repository: \n\t " . ($newuser eq "1") ? "New User\n\temail: [" . $email . "]" : "Signin" . "\n\t user[" . $user . "]" . "password [" . $pass . "]\n");
} else {
$newuser = UI_YesNo(gettext("Create New User?"), "n");
$user = UI_GetString("Username: ", $user);
$pass = UI_GetString("Password: ", $pass);
$email = UI_GetString("Email Addr: ", $email) if ($newuser eq "y");
$save_config = UI_YesNo(gettext("Save Configuration? "), "y");
}
if ($newuser eq "y") {
$res = $repo_client->send_request('Signup', $user, $pass, $email);
if (did_result_succeed($res)) {
$signup_okay = 1;
} else {
my $error = get_result_error($res);
print STDERR "$error\n";
my $error = get_result_error($res);
my $errmsg = gettext("The Profile Repository server returned the following error:") . "\n" . $error . "\n" . gettext("Please re-enter registration information or contact the administrator");
if ($UI_Mode eq "yast") {
UI_ShortMessage(gettext("Login Error"), $errmsg);
} else {
print STDERR $errmsg;
}
}
} else {
$res = $repo_client->send_request('LoginConfirm', $user, $pass);
if (did_result_succeed($res)) {
$signup_okay = 1;
} else {
my $error = get_result_error($res);
my $errmsg = gettext("Login failure. Please check username and password and try again") . "\n" . $error;
if ($UI_Mode eq "yast") {
UI_ShortMessage(gettext("Login Error"), $errmsg);
} else {
print STDERR $errmsg;
}
}
} else {
$res = $repo_client->send_request('LoginConfirm', $user, $pass);
if (did_result_succeed($res)) {
$signup_okay = 1;
} else {
my $error = get_result_error($res);
print STDERR gettext("Login failure. Please check username and password and try again") . "\n";
print STDERR "$error\n"; }
}
} until $signup_okay;
}
@ -2508,6 +2581,7 @@ sub do_logprof_pass {
submit_created_profiles();
submit_changed_profiles();
}
@created = ();
}
# if they hit "Finish" we need to tell the caller that so we can exit
@ -2520,39 +2594,73 @@ sub save_profiles {
my @changed = sort keys %changed;
if (@changed) {
my $q = { };
$q->{title} = "Changed Profiles";
$q->{headers} = [ ];
if ($UI_Mode eq "yast") {
my (@selected_profiles, $title, $explanation, %profile_changes);
foreach my $prof (@changed) {
my $oldprofile = serialize_profile($original_sd{$prof}, $prof);
my $newprofile = serialize_profile($sd{$prof}, $prof);
$q->{explanation} = "The following profiles were changed. Would you like to save them?";
$q->{functions} = [
"CMD_SAVE_CHANGES", "CMD_VIEW_CHANGES",
"CMD_ABORT",
];
$q->{default} = "CMD_VIEW_CHANGES";
$q->{options} = [ @changed ];
$q->{selected} = 0;
my ($p, $ans, $arg);
do {
($ans, $arg) = UI_PromptUser($q);
if ($ans eq "CMD_VIEW_CHANGES") {
my $which = $changed[$arg];
my $oldprofile = serialize_profile($original_sd{$which},
$which);
my $newprofile = serialize_profile($sd{$which}, $which);
display_changes($oldprofile, $newprofile);
# display_changes($oldprofile, $newprofile);
$profile_changes{$prof} = get_profile_diff($oldprofile,
$newprofile);
}
$explanation = gettext("Select which profile changes you would like to save to the\nlocal profile set");
$title = gettext("Local profile changes");
SendDataToYast(
{
type => "dialog-select-profiles",
title => $title,
explanation => $explanation,
default_select => "true",
get_changelog => "false",
profiles => \%profile_changes
}
);
my ($ypath, $yarg) = GetDataFromYast();
if ($yarg->{STATUS} eq "cancel") {
return;
} else {
my $selected_profiles_ref = $yarg->{PROFILES};
}
for my $profile (@selected_profiles) {
writeprofile($profile);
reload($profile);
}
} else {
my $q = {};
$q->{title} = "Changed Local Profiles";
$q->{headers} = [];
} until $ans =~ /^CMD_SAVE_CHANGES/;
$q->{explanation} =
"The following local profiles were changed. Would you like to save them?";
for my $profile (sort keys %changed) {
writeprofile($profile);
reload($profile);
$q->{functions} = [ "CMD_SAVE_CHANGES",
"CMD_VIEW_CHANGES",
"CMD_ABORT", ];
$q->{default} = "CMD_VIEW_CHANGES";
$q->{options} = [@changed];
$q->{selected} = 0;
my ($p, $ans, $arg);
do {
($ans, $arg) = UI_PromptUser($q);
if ($ans eq "CMD_VIEW_CHANGES") {
my $which = $changed[$arg];
my $oldprofile =
serialize_profile($original_sd{$which}, $which);
my $newprofile = serialize_profile($sd{$which}, $which);
display_changes($oldprofile, $newprofile);
}
} until $ans =~ /^CMD_SAVE_CHANGES/;
for my $profile (sort keys %changed) {
writeprofile($profile);
reload($profile);
}
}
}
}
@ -2569,73 +2677,35 @@ sub submit_created_profiles {
my $url = $cfg->{settings}{repository};
my @new_profiles;
for my $profile (sort keys %sd) {
unless (is_repo_profile($sd{$profile}{$profile})) {
push @new_profiles, $profile;
if ($repo_client && @created) {
my @new_profiles;
for my $profile (@created) {
unless (is_repo_profile($sd{$profile}{$profile})) {
push @new_profiles, [$profile,
serialize_profile($sd{$profile}, $profile),
"" ];
}
}
}
$DEBUGGING && debug("submit_created_profiles: \n\t " .
" \@new_profiles [" . @created .
"] \$repo_enabled [" . $repo_client . "]");
if ($repo_client && @new_profiles) {
my $q = { };
$q->{title} = "Submit New Profiles";
$q->{headers} = [
"Repository", $url,
];
$q->{explanation} = "Would you like to upload the following newly created profiles?";
$q->{functions} = [
"CMD_UPLOAD_CHANGES", "CMD_VIEW_CHANGES", "CMD_ASK_NEVER",
"CMD_ABORT",
];
$q->{default} = "CMD_VIEW_CHANGES";
$q->{options} = [ @new_profiles ];
$q->{selected} = 0;
my ($ans, $arg);
do {
($ans, $arg) = UI_PromptUser($q);
if ($ans eq "CMD_VIEW_CHANGES") {
my $which = $new_profiles[$arg];
my $newprofile = serialize_profile($sd{$which}, $which);
display_text($which, $newprofile);
}
} until $ans =~ /^CMD_UPLOAD_CHANGES/;
if ($ans eq "CMD_UPLOAD_CHANGES") {
my $changelog = UI_GetString("Changelog Entry: ", "");
my ($user, $pass) = get_repo_user_pass();
if ($user && $pass) {
for my $profile (@new_profiles) {
my $profile_string = serialize_profile($sd{$profile},
$profile);
my @args = (
'Create', $user, $pass, $cfg->{settings}{distro},
$profile, $profile_string, $changelog
);
my $res = $repo_client->send_request(@args);
if (ref $res) {
my $newprofile = $res->{value};
my $newid = $newprofile->{id};
set_repo_info($sd{$profile}{$profile},
$url,
$user,
$newid);
writeprofile($profile);
UI_Info("Uploaded $profile to repository.");
} else {
print "Error: $res\n";
}
}
}
if ($UI_Mode eq "yast") {
my $title = gettext("New profiles");
my $explanation =
gettext("Please choose the newly created profiles that you would".
" like\nto store in the repository");
yast_select_and_upload_profiles($title,
$explanation,
@new_profiles);
} else {
my $title =
gettext("Submit newly created profiles to the repository");
my $explanation =
gettext("Would you like to upload the newly created profiles?");
console_select_and_upload_profiles($title,
$explanation,
@new_profiles);
}
}
}
@ -2658,84 +2728,164 @@ sub submit_changed_profiles {
my $id = $sd{$profile}{$profile}{repo}{id};
my $res = $repo_client->send_request('Show', $id);
if (did_result_succeed($res)) {
my $p = $res->value;
my $profile_string = serialize_profile($sd{$profile},
$profile);
if ($p->{profile} ne $profile_string) {
push @changed_profiles, [ $profile, $p ];
my $res_value = $res->value;
my $p_repo = $res_value->{profile};
$p_repo = "" if (not defined($p_repo));
my $p_local = serialize_profile($sd{$profile}, $profile);
if ($p_repo ne $p_local) {
push @changed_profiles, [ $profile, $p_local, $p_repo ];
}
}
} # FIXME REPO ERROR HANDLING
}
if (@changed_profiles) {
my $q = { };
$q->{title} = "Submit Profiles";
$q->{headers} = [
"Repository", $url,
];
$q->{explanation} = "The following profiles from the repository were changed. Would you like to upload your changes?";
$q->{functions} = [
"CMD_UPLOAD_CHANGES", "CMD_VIEW_CHANGES", "CMD_ASK_NEVER",
"CMD_ABORT",
];
$q->{default} = "CMD_VIEW_CHANGES";
$q->{options} = [ map { $_->[0] } @changed_profiles ];
$q->{selected} = 0;
my ($ans, $arg);
do {
($ans, $arg) = UI_PromptUser($q);
if ($ans eq "CMD_VIEW_CHANGES") {
my $which = $changed_profiles[$arg]->[0];
my $repo_profile = $changed_profiles[$arg]->[1]->{profile};
my $newprofile = serialize_profile($sd{$which}, $which);
display_changes($repo_profile, $newprofile);
}
} until $ans =~ /^CMD_UPLOAD_CHANGES/;
if ($ans eq "CMD_UPLOAD_CHANGES") {
my $changelog = UI_GetString("Changelog Entry: ", "");
my ($user, $pass) = get_repo_user_pass();
if ($user && $pass) {
for my $profile (map { $_->[0] } @changed_profiles) {
my $profile_string =
serialize_profile($sd{$profile}, $profile);
my @args = (
'Create', $user, $pass, $cfg->{settings}{distro},
$profile, $profile_string, $changelog
);
my $res = $repo_client->send_request(@args);
if (ref $res) {
my $newprofile = $res->{value};
my $newid = $newprofile->{id};
set_repo_info($sd{$profile}{$profile},
$url,
$user,
$newid);
writeprofile($profile);
UI_Info("Uploaded $profile to repository.");
} else {
print "Error: $res\n";
}
}
}
if ($UI_Mode eq "yast") {
my $explanation =
gettext("Select which of the changes profiles you would".
" like to upload\nto the repository");
my $title = gettext("Changed profiles");
yast_select_and_upload_profiles($title,
$explanation,
@changed_profiles);
} else {
my $title =
gettext("Submit changed profiles to the repository");
my $explanation =
gettext("The following profiles from the repository were".
" changed.\nWould you like to upload your changes?");
console_select_and_upload_profiles($title,
$explanation,
@changed_profiles);
}
}
}
}
}
sub yast_select_and_upload_profiles {
my ($title, $explanation, @profiles) = @_;
my $url = $cfg->{settings}{repository};
my %profile_changes;
foreach my $prof (@profiles) {
$profile_changes{ $prof->[0] } =
get_profile_diff($prof->[2], $prof->[1]);
}
my (@selected_profiles, $changelog, $changelogs, $single_changelog);
SendDataToYast(
{
type => "dialog-select-profiles",
title => $title,
explanation => $explanation,
default_select => "false",
disable_ask_upload => "true",
profiles => \%profile_changes
}
);
my ($ypath, $yarg) = GetDataFromYast();
if ($yarg->{STATUS} eq "cancel") {
return;
} else {
my $selected_profiles_ref = $yarg->{PROFILES};
@selected_profiles = @$selected_profiles_ref;
$changelogs = $yarg->{CHANGELOG};
if (defined $changelogs->{SINGLE_CHANGELOG}) {
$changelog = $changelogs->{SINGLE_CHANGELOG};
$single_changelog = 1;
}
}
my ($user, $pass) = get_repo_user_pass();
if ($user && $pass) {
for my $profile (@selected_profiles) {
my $profile_string = serialize_profile($sd{$profile}, $profile);
if (!$single_changelog) {
$changelog = $changelogs->{$profile};
}
my @args = ('Create', $user, $pass, $cfg->{settings}{distro},
$profile, $profile_string, $changelog);
my $res = $repo_client->send_request(@args);
if (ref $res) {
my $newprofile = $res->value;
my $newid = $newprofile->{id};
set_repo_info($sd{$profile}{$profile}, $url, $user, $newid);
writeprofile($profile);
} else {
UI_ShortMessage(gettext("Repository Error"),
"An error occured during the upload of the profile "
. $profile);
}
}
UI_Info("Uploaded changes to repository.");
} else {
UI_ShortMessage(gettext("Repository Error"),
gettext(
"Registration or Signin was unsuccessful. User login\n".
" information is required to upload profiles to the".
" repository.\nThese changes have not been sent."
));
}
}
sub console_select_and_upload_profiles {
my ($title, $explanation, @profiles) = @_;
my $url = $cfg->{settings}{repository};
my $q = {};
$q->{title} = $title;
$q->{headers} = [ "Repository", $url, ];
$q->{explanation} = $explanation;
$q->{functions} = [ "CMD_UPLOAD_CHANGES",
"CMD_VIEW_CHANGES",
"CMD_ASK_NEVER",
"CMD_ABORT", ];
$q->{default} = "CMD_VIEW_CHANGES";
$q->{options} = [ map { $_->[0] } @profiles ];
$q->{selected} = 0;
my ($ans, $arg);
do {
($ans, $arg) = UI_PromptUser($q);
if ($ans eq "CMD_VIEW_CHANGES") {
display_changes($profiles[$arg]->[2], $profiles[$arg]->[1]);
}
} until $ans =~ /^CMD_UPLOAD_CHANGES/;
if ($ans eq "CMD_UPLOAD_CHANGES") {
my $changelog = UI_GetString("Changelog Entry: ", "");
my ($user, $pass) = get_repo_user_pass();
if ($user && $pass) {
for my $p_data (@profiles) {
my $profile = $p_data->[0];
my $profile_string = $p_data->[1];
my @args = ('Create', $user, $pass,
$cfg->{settings}{distro}, $profile,
$profile_string, $changelog);
my $res = $repo_client->send_request(@args);
if (ref $res) {
my $newprofile = $res->value;
my $newid = $newprofile->{id};
set_repo_info($sd{$profile}{$profile}, $url, $user, $newid);
writeprofile($profile);
UI_Info("Uploaded $profile to repository.");
} else {
print "Error: $res\n";
}
}
} else {
UI_ShortMessage(gettext("Repository Error"), gettext("Registration or Signin was unsuccessful. User login information is required to upload profiles to the repository. These changes have not been sent."));
}
}
}
sub display_text {
my ($header, $body) = @_;
@ -2745,6 +2895,29 @@ sub display_text {
}
}
sub get_profile_diff {
my ($oldprofile, $newprofile) = @_;
my $oldtmp = new File::Temp(UNLINK => 0);
print $oldtmp $oldprofile;
close($oldtmp);
my $newtmp = new File::Temp(UNLINK => 0);
print $newtmp $newprofile;
close($newtmp);
my $difftmp = new File::Temp(UNLINK => 0);
my @diff;
system("diff -uw $oldtmp $newtmp > $difftmp");
while (<$difftmp>) {
push(@diff, $_) unless (($_ =~ /^(---|\+\+\+)/) ||
($_ =~ /^\@\@.*\@\@$/));
}
unlink($difftmp);
unlink($oldtmp);
unlink($newtmp);
return join("", @diff);
}
sub display_changes {
my ($oldprofile, $newprofile) = @_;
@ -2756,8 +2929,20 @@ sub display_changes {
print $newtmp $newprofile;
close($newtmp);
system("diff -uw $oldtmp $newtmp | less");
my $difftmp = new File::Temp(UNLINK => 0);
my @diff;
system("diff -uw $oldtmp $newtmp > $difftmp");
if ($UI_Mode eq "yast") {
while (<$difftmp>) {
push(@diff, $_) unless (($_ =~ /^(---|\+\+\+)/) ||
($_ =~ /^\@\@.*\@\@$/));
}
UI_LongMessage(gettext("Profile Changes"), join("", @diff));
} else {
system("less $difftmp");
}
unlink($difftmp);
unlink($oldtmp);
unlink($newtmp);
}
@ -3195,6 +3380,8 @@ sub parse_profile_data {
next if /^\s*\# Last Modified:/;
if (/^\s*\# REPOSITORY: (\S+) (\S+) (\S+)$/) {
$repo_data = { url => $1, user => $2, id => $3 };
} elsif (/^\s*\# REPOSITORY: NEVERSUBMIT$/) {
$repo_data = { neversubmit => 1 };
} else {
$initial_comment .= "$_\n";
}
@ -3234,7 +3421,7 @@ sub writeheader ($$) {
my @data;
# deal with whitespace in profile names...
$name = "\"$name\"" if $name =~ /\s/;
push @data, "#include <tunables/global>";
if ($profile_data->{flags}) {
push @data, "$name flags=($profile_data->{flags}) {";
} else {
@ -3353,7 +3540,10 @@ sub serialize_profile {
$profile_data->{$name}{repo}{id}) {
my $repo = $profile_data->{$name}{repo};
$string .= "# REPOSITORY: $repo->{url} $repo->{user} $repo->{id}\n";
} elsif ($profile_data->{$name}{repo}{neversubmit}) {
$string .= "# REPOSITORY: NEVERSUBMIT\n";
}
}
# print out initial comment
@ -3686,7 +3876,8 @@ sub write_config {
print CONF "[$section]\n";
for my $key (sort keys %{$config->{$section}}) {
print CONF " $key = $config->{$section}{$key}\n";
print CONF " $key = $config->{$section}{$key}\n"
if ($config->{$section}{$key});
}
}
close(CONF);