merged cont.
[opensuse:yast-rest-service.git] / webservice / package / grantwebyastrights
1 #!/usr/bin/ruby
2 #
3 #--
4 # Webyast Webservice framework
5 #
6 # Copyright (C) 2009, 2010 Novell, Inc. 
7 #   This library is free software; you can redistribute it and/or modify
8 # it only under the terms of version 2.1 of the GNU Lesser General Public
9 # License as published by the Free Software Foundation. 
10 #
11 #   This library is distributed in the hope that it will be useful, but WITHOUT
12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
14 # details. 
15 #
16 #   You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the Free Software 
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #++
20 #
21 # grantwebyastrights
22 #
23 # show, grant and revoke policies for YaST webservice
24 #
25 # run: grantwebyastrights
26 #
27 # FIXME grant really All rights to run webyast, (so also packagekit rights, hal rights for system plugin etc)
28 #
29 require 'fileutils'
30 require 'getoptlong'
31
32 $debug = 0
33
34 def usage why
35   STDERR.puts why
36   STDERR.puts ""
37   STDERR.puts "Usage: grantwebyastrights --user <user> --action (show|grant|revoke)"
38   STDERR.puts "NOTE: This program should be run by user root"
39   STDERR.puts ""
40   STDERR.puts "This call grant/revoke ALL permissions for the YaST Webservice."
41   STDERR.puts "In order to grant/revoke single rights use:"
42   STDERR.puts "polkit-auth --user <user> (--grant|-revoke) <policyname>"
43   STDERR.puts ""
44   STDERR.puts "In order to show all possible permissions use:"
45   STDERR.puts "polkit-action"
46   exit 1
47 end
48
49 options = GetoptLong.new(
50   [ "--user",   GetoptLong::REQUIRED_ARGUMENT ],
51   [ "--action", GetoptLong::REQUIRED_ARGUMENT ]
52 )
53
54 user = nil
55 action = nil
56
57 begin
58   options.each do |opt, arg|
59     case opt
60     when "--user": user = arg
61     when "--action": action = arg
62     when "--debug": $debug += 1
63     end
64   end
65 rescue GetoptLong::InvalidOption => o
66   usage "Invalid option #{o}"
67 end
68
69 $debug = nil if $debug == 0
70
71 usage "excessive arguments"  unless ARGV.empty?
72 usage "user parameter missing" unless user
73 usage "action parameter (show|grant|revoke) missing" unless action
74
75 SuseString = "org.opensuse.yast"
76
77 def webyast_perm?(perm)
78   return (perm.include? SuseString) && (not perm.include? ".scr")
79 end
80
81 def granted_perms(user)
82   perms = `polkit-auth --user '#{user}' --explicit`
83   #do NOT raise if an error happens here cause while the package installation this call returns always an error
84   #  raise "polkit-auth failed with ret code #{$?.exitstatus}. Output: #{perms}" unless $?.exitstatus.zero?
85   perms = perms.split "\n"
86   perms.reject! { |perm| not webyast_perm?(perm) }
87   return perms
88 end
89
90 def webyast_perms
91   perms = `polkit-action`
92   raise "polkit-action failed with ret code #{$?.exitstatus}. Output: #{perms}" unless $?.exitstatus.zero?
93   perms = perms.split "\n"
94   perms.reject! { |perm| not webyast_perm?(perm) }
95   return perms
96 end
97
98 begin
99   case action
100   when "grant" then
101     granted = granted_perms user
102     non_granted = webyast_perms.reject{ |perm| granted.include? perm }
103     non_granted.each do |policy|
104       STDOUT.puts "granting: #{policy}"
105       out = `polkit-auth --user '#{user}' --grant '#{policy}'`
106       #do NOT raise if an error happens here cause while the package installation this call can return an error for already existing 
107       #permissions ( It is not possible to check this before)
108       #raise "Granting permissions failed with ret code #{$?.exitstatus}. Output: #{out}" unless $?.exitstatus.zero?
109     end
110   when "show"
111     STDOUT.puts granted_perms(user).join("\n")
112   when "revoke"
113     granted = granted_perms user
114     granted.each do |policy|
115       STDOUT.puts "revoking: #{policy}"
116       out = `polkit-auth --user '#{user}' --revoke '#{policy}'`
117       raise "Revoking permissions failed with ret code #{$?.exitstatus}. Output: #{out}" unless $?.exitstatus.zero?
118     end
119   end
120 rescue Exception => e
121   STDERR.puts e.message
122   Process.exit! 1
123 end