PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
# Phusion Passenger - https://www.phusionpassenger.com/ # Copyright (c) 2013-2025 Asynchronous B.V. # # "Passenger", "Phusion Passenger" and "Union Station" are registered # trademarks of Asynchronous B.V. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. require 'optparse' require 'net/http' require 'socket' require 'json' PhusionPassenger.require_passenger_lib 'constants' PhusionPassenger.require_passenger_lib 'admin_tools/instance_registry' PhusionPassenger.require_passenger_lib 'config/command' PhusionPassenger.require_passenger_lib 'config/utils' PhusionPassenger.require_passenger_lib 'utils/json' PhusionPassenger.require_passenger_lib 'utils/ansi_colors' PhusionPassenger.require_passenger_lib 'utils/terminal_choice_menu' module PhusionPassenger module Config class RestartAppCommand < Command include PhusionPassenger::Config::Utils def run parse_options select_passenger_instance select_app_group_name perform_restart end private def self.create_option_parser(options) OptionParser.new do |opts| nl = "\n" + ' ' * 37 opts.banner = "Usage 1: passenger-config restart-app [OPTIONS]\n" + "Usage 2: passenger-config restart-app . [OPTIONS]\n" + "Usage 3: passenger-config restart-app --name [OPTIONS]" opts.separator "" opts.separator " Restart an application. The syntax determines how the application that is to" opts.separator " be restarted, will be selected." opts.separator "" opts.separator " 1. Selects all applications whose paths begin with the given prefix." opts.separator "" opts.separator " Example: passenger-config restart-app /webapps" opts.separator " Restarts all apps whose path begin with /webapps, such as /webapps/foo," opts.separator " /webapps/bar and /webapps123." opts.separator "" opts.separator " 2. Selects all application whose paths fall under the current working" opts.separator " directory." opts.separator " Example: passenger-config restart-app ." opts.separator " If the current working directory is /webapps, restarts all apps whose path" opts.separator " begin with /webapps, such as /webapps/foo, /webapps/bar and /webapps123." opts.separator "" opts.separator " 3. Selects a specific application based on an exact match of its app group" opts.separator " name." opts.separator "" opts.separator " Example: passenger-config restart-app --name /webapps/foo" opts.separator " Restarts only /webapps/foo, but not for example /webapps/foo/bar or" opts.separator " /webapps/foo123." opts.separator "" opts.separator "Options:" opts.on("--name APP_GROUP_NAME", String, "The app group name to select") do |value| options[:app_group_name] = value end opts.on("--rolling-restart", "Perform a rolling restart instead of a#{nl}" + "regular restart (Enterprise only). The#{nl}" + "default is a blocking restart") do |value| if Config::Utils.is_enterprise? options[:rolling_restart] = true else abort "--rolling-restart is only available in #{PROGRAM_NAME} Enterprise: #{ENTERPRISE_URL}" end end opts.on("--ignore-app-not-running", "Exit successfully if the specified#{nl}" + "application is not currently running. The#{nl}" + "default is to exit with an error") do options[:ignore_app_not_running] = true end opts.on("--ignore-passenger-not-running", "Exit successfully if #{PROGRAM_NAME}#{nl}" + "is not currently running. The default is to#{nl}" + "exit with an error") do options[:ignore_passenger_not_running] = true end opts.on("--instance NAME", String, "The #{PROGRAM_NAME} instance to select") do |value| options[:instance] = value end opts.on("-h", "--help", "Show this help") do options[:help] = true end end end def help puts @parser end def parse_options super case @argv.size when 0 if !@options[:app_group_name] && !STDIN.tty? abort "Please pass either an app path prefix or an app group name. " + "See --help for more information." end when 1 if @options[:app_group_name] abort "You've passed an app path prefix, but you cannot also pass an " + "app group name. Please use only either one of them. See --help " + "for more information." end else help abort end end def select_app_group_name @groups = [] if app_group_name = @options[:app_group_name] select_app_group_name_exact(app_group_name) elsif @argv.empty? # STDIN is guaranteed to be a TTY thanks to the check in #parse_options. select_app_group_name_interactively else select_app_group_name_by_app_root_regex(@argv.first) end end def select_app_group_name_exact(name) query_pool_json.each do |group| if group[:name] == name @groups << group end end if @groups.empty? abort_app_not_found "There is no #{PROGRAM_NAME}-served application running " + "with the app group name '#{name}'." end end def query_group_names result = [] query_pool_json.each do |group| result << group[:name] end result << "Cancel" result end def select_app_group_name_interactively colors = PhusionPassenger::Utils::AnsiColors.new choices = query_group_names if choices.size == 1 # No running apps abort_app_not_found "#{PROGRAM_NAME} is currently not serving any applications." end puts "Please select the application to restart." puts colors.ansi_colorize("Tip: re-run this command with --help to learn how to automate it.") puts colors.ansi_colorize("If the menu doesn't display correctly, press '!'") puts menu = PhusionPassenger::Utils::TerminalChoiceMenu.new(choices, :single_choice) begin index, name = menu.query rescue Interrupt abort ensure STDOUT.write(colors.reset) STDOUT.flush end if index == choices.size - 1 abort else puts select_app_group_name_exact(name) end end def select_app_group_name_by_app_root_regex(app_root) if app_root == "." app_root = Dir.pwd end regex = /^#{Regexp.escape(app_root)}/ query_pool_json.each do |group| if group[:app_root] =~ regex @groups << group end end if @groups.empty? abort_app_not_found "There are no #{PROGRAM_NAME}-served applications running " + "whose paths begin with '#{app_root}'." end end def perform_restart restart_method = @options[:rolling_restart] ? "rolling" : "blocking" @groups.each do |group| group_name = group[:name] puts "Restarting #{group_name}" request = Net::HTTP::Post.new("/pool/restart_app_group.json") try_performing_full_admin_basic_auth(request, @instance) request.content_type = "application/json" request.body = PhusionPassenger::Utils::JSON.generate( :name => group_name, :restart_method => restart_method) response = @instance.http_request("agents.s/core_api", request) if response.code.to_i / 100 == 2 response.body elsif response.code.to_i == 401 print_full_admin_command_permission_error abort else STDERR.puts "*** An error occured while communicating with the #{PROGRAM_NAME} server:" STDERR.puts response.body abort end end end def abort_app_not_found(message) if @options[:ignore_app_not_running] STDERR.puts(message) exit else abort(message) end end def query_pool_json request = Net::HTTP::Get.new("/pool.json") try_performing_ro_admin_basic_auth(request, @instance) response = @instance.http_request("agents.s/core_api", request) if response.code.to_i / 100 == 2 if RUBY_VERSION >= '2.3' JSON.parse(response.body, symbolize_names: true).to_a.map{|(key,value)| {name: key.to_s, app_root: value.dig(:app_root,0,:value)}} else JSON.parse(response.body, symbolize_names: true).to_a.map{|(key,value)| {name: key.to_s, app_root: value[:app_root][0][:value]}} end elsif response.code.to_i == 401 if response["pool-empty"] == "true" [] elsif @options[:ignore_app_not_running] print_instance_querying_permission_error exit else print_instance_querying_permission_error abort end else STDERR.puts "*** An error occured while querying the #{PROGRAM_NAME} server:" STDERR.puts response.body abort end end end end # module Config end # module PhusionPassenger